Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将v8::String转换为const char*_C++_Node.js_V8_Node Gyp_Node.js Addon - Fatal编程技术网

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

C++ 如何将v8::String转换为const char*,c++,node.js,v8,node-gyp,node.js-addon,C++,Node.js,V8,Node Gyp,Node.js Addon,我在dll中有这个函数 static COMMANDERDLL_API int InsertCodeBar(const char* pszBuffer); 在我的节点插件中,我有这个函数 void InsertCodeBarWrapper(const FunctionCallbackInfo<Value>& args){ Isolate* isolate = args.GetIsolate(); Local<Function> cb = Loc

我在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);
}
void InsertCodeBarWrapper(常量函数callbackinfo&args){
隔离*隔离=args.GetIsolate();
Local cb=Local::Cast(args[1]);
本地条=args[0]->ToString();
常量无符号argc=1;
本地argv[argc]={CSGPCommander::InsertCodeBar(bar)};
cb->调用(隔离->GetCurrentContext()->Global(),argc,argv);
}
当我尝试编译时,节点gyp返回错误:“无法将参数1从“v8::Local”转换为“const char*”

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

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

use namespace v8;
const char* ToCString(const String::Utf8Value& value) {
  return *value ? *value : "<string conversion failed>";
}
使用名称空间v8;
常量字符*ToCString(常量字符串::Utf8Value和value){
返回*值?*值:“”;
}
用法:

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);
}
void InsertCodeBarWrapper(常量函数callbackinfo&args){
隔离*隔离=args.GetIsolate();
Local cb=Local::Cast(args[1]);
字符串::Utf8Value str(args[0]);
常量字符*bar=ToCString(str);
常量无符号argc=1;
本地argv[argc]={CSGPCommander::InsertCodeBar(bar)};
cb->调用(隔离->GetCurrentContext()->Global(),argc,argv);
}

只要改进@Matheus的答案:

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

这给了我一个错误:
error:没有匹配的函数来调用'v8::String::Utf8Value::Utf8Value(v8::Local&)'8 | String::Utf8Value(str)
一个完整性问题:该字符的生存期值是多少*?它是否需要自己清理?当底层本地句柄清理后,它是否不再存在?因为在您的回答中,您看起来是1)复制本地句柄,2)在要清理的堆栈上创建字符串::UTF8当价值被传回,冒着汽车被清理的风险?
const char* bar = ToCString(info[0]);