node.js — C ++ V8 объектный контекст

Я пытаюсь выполнить обратный вызов в C ++ (где C ++ работает как часть программы node.js). Обратный вызов поступает в стороннюю библиотеку, где он будет вызывать обратный вызов, когда у него есть данные для передачи.

Кажется, у меня проблема с типами переменных:

static void sensorEventCallback(const char *protocol, const char *model,
int id, int dataType, const char *value, int timestamp,
int callbackId, void *context)
{
//process the data here
}

Handle<Value> sensorEvents( const Arguments& args ) {
HandleScope scope;
...
callbackId = tdRegisterSensorEvent(
reinterpret_cast<TDSensorEvent>(&telldus_v8::sensorEventCallback),
Context::GetCurrent()->Global());
}

Ошибка, которую я получаю:

ошибка: невозможно преобразовать ‘v8 :: Local<v8 :: Object>’До’ void * ‘для аргумента
От 2 до int tdRegisterSensorEvent (void () (const char, const char *,
int, int, const char *, int, int, void *), void *) ‘

Похоже, что он борется с аргументом 2, который является контекстом. Любые мысли о том, как я могу преобразовать объект V8 в тот, который примет tdRegisterSensorEvent?

0

Решение

Подглядывая немного, что GetCurrent как представляется, определяется в заголовке V8, чтобы вернуть Local<Context>:

v8.h на GitHub, расположение GetCurrent () в определении объекта Context

это Local<T> это шаблон для «легкий, выделенная ручка, происходит от базового класса Handle<T>:

v8.h на GitHub, определение Local

v8.h на GitHub, определение Handle

Кажется, у вас есть указатель контекста, временем жизни которого управляет то, что называется HandleScope, Если вы извлекаете указатель контекста и сохраняете его для использования в обратном вызове позже, он может существовать или не существовать во время вызова.

Если вы знаете, что все обратные вызовы произойдут до того, как они будут освобождены областью дескриптора, вы можете попытаться получить указатель, используя перегрузку оператора разыменования, и передать его:

v8.h на GitHub, T * Handle :: operator * ()

Но у вас может не быть этой гарантии.

3

Другие решения

По номеру говорит, что я думаю, что адрес объекта контекста должен быть передан. Затем вы можете привести это обратно в ваш обратный вызов

void telldus_v8::sensorEventCallback(const char *protocol, const char *model,
int id, int dataType, const char *value, int timestamp,
int callbackId, void *context)
{
v8::Local<v8::Object>* ctx_ptr = static_cast<v8::Local<v8::Object>*>(context);
//process the data here
}

v8::Local<v8::Object> ctx = Context::GetCurrent()->Global();
callbackId = tdRegisterSensorEvent(
reinterpret_cast<TDSensorEvent>(&telldus_v8::sensorEventCallback),
&ctx);
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector