7 Stimmen

wie man eine Struktur von einer V8 C++-Funktion an ein Javascript-Modul zurückgibt

Ich bin neu in Javascript und V8-Bibliothek. Meine Anforderung ist eine C++-Funktion aufrufen und eine C-Struktur zurück zu Javascript-Modul.

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

Bei der Return-Anweisung erhalte ich einen Fehler. Kann mir jemand sagen, wie man eine Struktur aus einer V8 C++ Funktion zurückgibt.

6voto

exebook Punkte 29372

Sie möchten ein Javascript-Objekt erstellen und jedes Element davon mit Ihren Daten füllen.

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

Anruf aus Javascript:

log(JSON.stringify(example_object()))

Ausgabe

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

1voto

idobatter Punkte 99

Wenn Sie ein node.js-Modul erstellen möchten,

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

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

im Quelltext Ihres Moduls:

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

0voto

Pelayo Méndez Punkte 369

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)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X