admin管理员组文章数量:1355675
I am new to Javascript and V8 library. My requirement is call a C++ function and return a C struct back to Javascript module.
struct empDetails {
int empNo;
string empName;
};
v8::Handle<v8::Value> getDetails(const v8::Arguments &args) {
if ((args.Length() != 1) || !args[0]->IsUint32()) {
return v8::ThrowException(v8::Exception::Error
(v8::String::New("Invalid> arguments.")));
}
uint32_t userId = args[0]->ToUint32()->Value();
empDetails e;
pany::GetEmpdetails(userId, e); // other static function in my project
return e;
}
At return statement, I am getting error. Could anyone tell me how to return a struct from V8 C++ function.
I am new to Javascript and V8 library. My requirement is call a C++ function and return a C struct back to Javascript module.
struct empDetails {
int empNo;
string empName;
};
v8::Handle<v8::Value> getDetails(const v8::Arguments &args) {
if ((args.Length() != 1) || !args[0]->IsUint32()) {
return v8::ThrowException(v8::Exception::Error
(v8::String::New("Invalid> arguments.")));
}
uint32_t userId = args[0]->ToUint32()->Value();
empDetails e;
pany::GetEmpdetails(userId, e); // other static function in my project
return e;
}
At return statement, I am getting error. Could anyone tell me how to return a struct from V8 C++ function.
Share Improve this question edited Nov 1, 2012 at 15:58 maerics 157k47 gold badges277 silver badges299 bronze badges asked Nov 1, 2012 at 15:55 codercoder 951 silver badge6 bronze badges 3-
2
What does it mean to return a C struct to JavaScript? Wouldn't you want (need?) to wrap it in a JavaScript Object like
{empNo:1,empName:"John Doe"}
? – maerics Commented Nov 1, 2012 at 16:12 - 1 The V8 embedder's guide section about Object Templates will likely get you on the right track. – maerics Commented Nov 1, 2012 at 16:26
- seems to be I have not read enough about v8 object templates, thanks for your reply – coder Commented Nov 1, 2012 at 17:50
3 Answers
Reset to default 6You want to create Javascript object and populate every member of it with your data.
#define function(name) v8::Handle<v8::Value> name(const v8::Arguments& a)
function (example_object) {
v8::HandleScope handle_scope;
Handle<Object> Result = Object::New();
Result->Set(String::New("name"), String::New("Stackoverflow"));
Result->Set(String::New("url"), String::New("http://stackoverflow."));
Result->Set(String::New("javascript_tagged"), Number::New(317566));
return handle_scope.Close(Result);
}
Call from Javascript:
log(JSON.stringify(example_object()))
Output
{"name":"Stackoverflow","url":"http://stackoverflow.","javascript_tagged":317566}
When you want to create node.js module,
npm install ref
npm install ref-array
npm install ref-struct
in your js source:
var ref = require('ref');
var ArrayType = require('ref-array')
var StructType = require('ref-struct');
var empDetails = StructType({
empNo: ref.types.int,
empName: ArrayType('char', STRING_LENGTH)
});
var result = new empDetails;
getDetails(999, result.ref());
in your module source:
struct empDetails {
int empNo;
char empName[STRING_LENGTH];
};
v8::Handle<v8::Value> getDetails(const v8::Arguments &args) {
if((args.Length() != 2) || !args[0]->IsUint32()){
return v8::ThrowException(v8::Exception::Error
(v8::String::New("Invalid> arguments.")));
}
uint32_t userId = args[0]->ToUint32()->Value();
struct empDetails src;
pany::GetEmpdetails(userId, src);
v8::Handle<v8::Object> dst = args[1]->ToObject();
if(node::Buffer::Length(dst) >= sizeof(struct empDetails))
memcpy(node::Buffer::Data(dst), &src, sizeof(struct empDetails));
return args.This();
}
C++
struct empDetails {
int empNo;
string empName;
};
void getDetails(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
HandleScope scope(isolate);
if(args.Length() != 1) {
isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Wrong number of arguments")));
return;
}
if (!args[0]->IsNumber()) {
isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Wrong arguments")));
return;
}
int empId = args[0]->NumberValue();
// You can call your c++ function here instead of a returning a dummy struct
empDetails e;
e.empNo = empId;
e.empName "Hello World";
Local<Object> result = Object::New(isolate);
result->Set(String::NewFromUtf8(isolate, "empNo"), Number::New(isolate, e.empNo));
result->Set(String::NewFromUtf8(isolate, "empName"), String::NewFromUtf8(isolate, e.empName.c_str()));
args.GetReturnValue().Set(result);
}
Javascript
const emp = require('your-module')
var empDetails = obj.getDetails(123)
console.log("number:" + empDetails.empNo + " name: " + empDetails.empNo)
本文标签: visual chow to return a struct from V8 C function to javascript moduleStack Overflow
版权声明:本文标题:visual c++ - how to return a struct from V8 C++ function to javascript module - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744008461a2575123.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论