6

我在dll中有这个功能

static COMMANDERDLL_API int InsertCodeBar(const char* pszBuffer);

在我的节点插件中我有这个功能

void InsertCodeBarWrapper(const FunctionCallbackInfo<Value>& args){
    Isolate* isolate = args.GetIsolate();

    Local<Function> cb = Local<Function>::Cast(args[1]);
    Local<String> bar = args[0]->ToString();
    const unsigned argc = 1;
    Local<Value> argv[argc] = { CSGPCommander::InsertCodeBar(bar) };
    cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
}

当我尝试编译时,node-gyp 返回错误:“无法将参数 1 从 'v8::Local' 转换为 'const char *'

如何将 v8::String 转换为 const char *?

4

2 回答 2

4

解决

创建一个函数 ToCString 将 V8::String 转换为 const char *

use namespace v8;
const char* ToCString(const String::Utf8Value& value) {
  return *value ? *value : "<string conversion failed>";
}

用法:

void InsertCodeBarWrapper(const FunctionCallbackInfo<Value>& args){
    Isolate* isolate = args.GetIsolate();

    Local<Function> cb = Local<Function>::Cast(args[1]);
    String::Utf8Value str(args[0]);
    const char* bar = ToCString(str);
    const unsigned argc = 1;
    Local<Value> argv[argc] = { CSGPCommander::InsertCodeBar(bar) };
    cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
}
于 2015-12-18T15:27:29.090 回答
2

只需改进@Matheus 的答案:

use namespace v8;
const char* ToCString(Local<String> str) {
  String::Utf8Value value(str);
  return *value ? *value : "<string conversion failed>";
}

并直接使用:

const char* bar = ToCString(info[0]);
于 2017-06-30T02:49:00.833 回答