2012-11-01 14 views
5

Javascript ve V8 kütüphanesinde yeniyim. Benim ihtiyacım bir C++ işlevini çağırıyor ve bir C yapısını tekrar Javascript modülüne döndürüyor.V8 C++ işlevinden javascript modülüne bir yapının nasıl döndürüleceği

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; 
} 

İade beyanında hata alıyorum. V8 C++ işlevinden bir yapıyı nasıl döndüreceğimi söyleyebilir miyim?

+2

? Bir JavaScript Nesnesinde '{empNo: 1, empName: "John Doe"} 'gibi bir nesneye sarmak istemez miydiniz? – maerics

+1

[V8 embedder'ın Nesne Şablonları hakkında kılavuz bölümü] (https://developers.google.com/v8/embed#templates) büyük olasılıkla sizi doğru yolda bulacaktır. – maerics

+0

V8 nesne şablonları hakkında yeterince okumadım, cevabınız için teşekkürler – coder

cevap

6

Javascript nesnesini oluşturmak ve her üyesini verilerinizle doldurmak istiyorsunuz. Javascript

#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); 
    } 

Çağrı: En js kaynağındaki

log(JSON.stringify(example_object())) 

Çıktı

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

Eğer node.js modül oluşturmak istiyoruz

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

:

Modülünüzün kaynağındaki
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()); 

: o JavaScript C yapı dönmek için ne anlama gelir

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(); 
} 
İlgili konular