在NodeJS插件中将args转换为double

时间:2015-07-03 17:46:26

标签: c++ node.js node.js-addon

我想将参数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我不会丢失数据,对吧? (我真的不关心&#34;数据丢失&#34;,但我想摆脱警告)

1 个答案:

答案 0 :(得分:2)

你只需要从double转换为long。你可以做到

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

至于丢失数据,如果输出值很高,则会丢失数据,但是你永远不能在javascript(double)中输入足够大的数字来达到long的上限