1

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());
}

私が得ているエラー:

エラー: 引数 '2' を 'int tdRegisterSensorEvent(void ( )(const char , const char*, int, int, const char*, int、int、void*)、void*)'</p>

コンテキストである引数2に苦労しているようです。V8 オブジェクトを tdRegisterSensorEvent が受け入れるオブジェクトに変換する方法について何か考えはありますか?

4

2 に答える 2

4

GetCurrentを返すように V8 ヘッダーで定義されているように見えるビットをスヌーピングしますLocal<Context>

GitHub の v8.h、Context オブジェクト定義の GetCurrent() の場所

これは、基本クラスから派生した「軽量のスタック割り当てハンドル」Local<T>のテンプレートです。Handle<T>

GitHub の v8.h、Local の定義

GitHub の v8.h、Handle の定義

つまり、 a と呼ばれるものによって寿命が管理されている Context ポインターがあるようですHandleScope。コンテキスト ポインターを引き出して、後でコールバックで使用するために保存する場合、呼び出し時にまだ存在している場合と存在していない場合があります。

ハンドル スコープによって解放される前にすべてのコールバックが発生することがわかっている場合は、逆参照演算子のオーバーロードを使用してポインターを取得し、それを渡すことができます。

GitHub の v8.h、T* Handle::operator*()

ただし、この保証がない場合があります。

于 2012-11-21T08:03:27.843 に答える
1

nm が言うように、コンテキスト オブジェクトのアドレスを渡す必要があると思います。その後、コールバックでそれをキャストできます

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);
于 2012-11-21T08:02:38.510 に答える