2

JavaScript から Node.js アドオンに渡されたオブジェクトをvoid *. これをコンパイルできないようです。node-gyp でビルドすると、 が生成されerror: no matching function for call to 'Cast'ます。

私がやろうとしていることの長いバージョンは、Csound を実行する Node.js アドオンを作成することです。概観すると、Csound は、不透明な Csound 構造体へのポインターを (通常は) 最初の引数として受け取る C 関数で機能します。この構造体には、void *Csound をホストするプログラムによって設定された任意のデータ「<code>hostData」が含まれます。メッセージの投稿など、Csound が行ういくつかのことは、コールバック (この場合は関数ポインター) で変更されます。Csound の各インスタンスのコールバックを格納する場所が必要なので、誰かが JavaScript からオブジェクトに設定できるようにしようとしていますが、Csound インスタンスのコールバックをこのオブジェクトの隠しプロパティhostDataとして設定したいとも考えています。hostData

コードは次のようにする必要があると思います

#include "csound.h"

#include <node.h>

static void CsoundMessageCallback(CSOUND *Csound, int attributes,
  const char *format, va_list valist)
{
  // Call the JavaScript function we stored in the hostData of Csound.
}

static void _wrap_csoundSetMessageCallback(
  const v8::FunctionCallbackInfo<v8::Value>& args)
{
  v8::HandleScope scope(v8::Isolate::GetCurrent());

  CSOUND *Csound;
  // Pretend we get the Csound instance from args[0] here. This is actually done
  // by SWIG <http://www.swig.org>.

  // This does not compile. csoundGetHostData() returns a void *, but I’m assuming
  // hostData was set to an object from JavaScript.
  v8::Persistent<v8::Object> hostData =
    v8::Persistent<v8::Object>::Cast(csoundGetHostData(Csound));

  hostData.SetHiddenValue(
    v8::String::New("CsoundMessageCallback"),
    v8::Persistent<v8::Function>::Cast(args[1])
  ); 
  csoundSetMessageCallback(Csound, CsoundMessageCallback);
}

V8 の内部フィールドを詳しく調べる必要があると思いますが、よくわかりません。

4

1 に答える 1

2

通常、このような状況で私が行ったことは、ラップしている C/C++ クラスのインスタンスへのポインターを格納し、それと対話するためのさまざまなパブリック メソッドを持つラッパー C++ クラス (ノードの ObjectWrap クラスから継承) を作成することです。実例。

newJS ランドから呼び出されると、ラッパー C++ クラスの新しいインスタンスが作成され、新しい JS オブジェクトに関連付けられます。次に、ラップされたライブラリのコールバックを利用する非同期タスクを開始する JS 関数があります。

そこuv_async_send()からは、ラップされたライブラリのコールバックから呼び出してメイン スレッドにシグナルを送り、次に uv_async コールバックから JS コールバックを呼び出すだけです。

このすべての例をここで見ることができます(特に Windows 固有の部分):

JS コールバックの保存に関しては、それを処理するさまざまな方法があります。1 つの解決策は、JS コールバックとラッパー クラス インスタンスの永続コピーを格納するバトン オブジェクトを作成し、そのバトンをuv_async_tのユーザー データ ポインタに格納することです。uv_async_tこれは、リクエストごとに新しいを作成することを意味します (これは、上記の例とは異なります)。

于 2015-09-07T16:09:49.823 に答える