У меня есть проект C ++, и я использую библиотеку duktape JS. Мне нужно зарегистрировать глобальную функцию в JS и сохранить указатель на объект как данные замыкания с этой функцией, чтобы я мог получить доступ к этому указателю при вызове функции.
Я знаю, как это сделать в lua c api:
lua_pushlightuserdata(L, this);
lua_pushcclosure(L, &someFunction, 1);
lua_setglobal(L, "someFunction");
Сначала я нажимаю указатель как данные закрытия, затем указатель на функцию. Мне нужен такой же функционал в API-интерфейсе Duktape.
Можете ли вы показать мне код с регистрацией закрытия и доступ к нему?
Не существует прямой аналогии со значениями, связанными с «замыканием C», но вы можете достичь аналогичного результата другими способами.
Один простой способ — сохранить значение как свойство экземпляра функции:
duk_push_c_function(ctx, someFunction, 1 /*nargs*/);
duk_push_pointer(ctx, (void *) somePointer);
duk_put_prop_string(ctx, -2, "_ptr");
duk_put_global_string(ctx, "someFunction");
Затем, когда функция вызывается, получить значение как:
void *ptr;
duk_push_current_function(ctx);
duk_get_prop_string(ctx, -1, "_ptr");
ptr = duk_get_pointer(ctx, -1);
duk_pop_2(ctx); /* pop pointer and function */
/* ready to use 'ptr' */
Если вы хотите ограничить доступ к связанному значению из кода Ecmascript, вы можете использовать внутренняя строка, например "\xFF" "ptr"
,
У меня была похожая проблема. После небольшого поиска я нашел вики о том, как сохранять объекты который помог мне сохранить ссылку на функцию (обратный вызов) для дальнейшего использования.