2012-11-01 49 views
5

Tôi mới sử dụng thư viện Javascript và V8. Yêu cầu của tôi là gọi hàm C++ và trả về cấu trúc C trở lại mô-đun Javascript.cách trả về cấu trúc từ hàm V8 C++ sang mô-đun javascript

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; 
    company::GetEmpdetails(userId, e); // other static function in my project 
    return e; 
} 

Khi trả lại, tôi gặp lỗi. Bất cứ ai có thể cho tôi biết làm thế nào để trả lại một cấu trúc từ chức năng V8 C++.

+2

có nghĩa là gì để trả về một struct C đến JavaScript? Bạn sẽ không muốn (cần?) Để bọc nó trong một đối tượng JavaScript như '{empNo: 1, empName:" John Doe "}'? – maerics

+1

Phần [Hướng dẫn của trình nhúng của V8 về Mẫu Đối tượng] (https://developers.google.com/v8/embed#templates) có thể sẽ giúp bạn đi đúng hướng. – maerics

+0

có vẻ là tôi chưa đọc đủ về các mẫu đối tượng v8, nhờ câu trả lời của bạn – coder

Trả lời

6

Bạn muốn tạo đối tượng Javascript và điền mọi thành viên của nó vào dữ liệu của bạn.

#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.com")); 
     Result->Set(String::New("javascript_tagged"), Number::New(317566)); 
     return handle_scope.Close(Result); 
    } 

Gọi từ javascript:

log(JSON.stringify(example_object())) 

Output

{"name":"Stackoverflow","url":"http://stackoverflow.com","javascript_tagged":317566} 
1

Khi bạn muốn tạo Node.js mô-đun,

npm install ref 
npm install ref-array 
npm install ref-struct 

trong nguồn js của bạn:

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

trong nguồn module của bạn:

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; 
    company::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ác vấn đề liên quan