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

6

我有一个在 dll 中的函数

static COMMANDERDLL_API int InsertCodeBar(const char* pszBuffer);

在我的Node插件中,我有如下函数:
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 *?
2个回答

5

已解决

创建一个名为 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);
}

1
这给了我一个错误:error: no matching function for call to ‘v8::String::Utf8Value::Utf8Value(v8::Local<v8::String>&)’ 8 | String::Utf8Value value(str); - Zane Hitchcox

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]);

1
一个完整性的问题:那个 char* 的生命周期是多久?它需要自己清理吗?当底层的 Local<String> 句柄被清理时,它是否会停止存在?因为看起来在你的回答中,你正在 1) 复制 Local<String> 句柄并且 2) 在堆栈上创建一个 String::UTF8,这将在值被传回时被清理,从而冒着 car* 被清理的风险。 - jomamaxx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接