1

引数 0 を long に変換して、dll 関数で使用したいと考えています。

関数は次のように定義されます。long function(long)

long __stdcall VBVMR_GetVoicemeeterVersion(long * pVersion);

そして、呼び出しは次のようになります

void Voicemeeter_run(const FunctionCallbackInfo<Value>& args){
  Isolate* isolate = Isolate::GetCurrent();

  if (args.Length() < 1) {
    isolate->ThrowException(Exception::TypeError(
        String::NewFromUtf8(isolate, "Run needs 1 argument")));
    return;
  }

  if (!args[0]->IsNumber()) {
    isolate->ThrowException(Exception::TypeError(
        String::NewFromUtf8(isolate, "Argument 1 must be a number")));
    return;
  }

  long type = args[0]->NumberValue();
  //long type = 2;
  long value = iVMR.VBVMR_RunVoicemeeter(type);
  Local<Number> num = Number::New(isolate, value);
  args.GetReturnValue().Set(num);
}

次の警告が表示されました。

..\vm-wrapper.cc(101): warning C4244: 'argument' : conversion de 'double' en 'long', perte possible de données [D:\Workspace\node-voicemeter\build\vm-wrapper.vcxproj]

他の Node メソッドはありますか? 文字列に変換してから、C ネイティブ関数を介して long に変換すると、データが失われませんよね? (「データ損失」はあまり気にしませんが、警告を取り除きたいです)

4

1 に答える 1

2

ダブルからロングにキャストするだけです。できるよ

double d = args[0]->NumberValue();
long l = static_cast<long>(d);

データの損失に関しては、出力で高い値を受け取るとデータが失われますが、javascript( double) に上限に達するほど大きな数値を入力することはできませんlong

于 2015-07-15T14:45:04.133 に答える