2013-06-16 3 views
4

Я пытаюсь настроить C++ приложение, которое должно быть в состоянии вызвать функцию, которая является частью модуля Node.jsМногократно вызова Node.js функции из C++

В то время как я мог бы найти пример кода о том, как создать C++ аддоны для Node.js, а также некоторые примеры того, как вызвать V8 код из C++ я не побежал во что-то вроде вызова Node.js функции из C++

Я думаю, в идеале подход был бы

  • Настройка среды node.js, например собрать все необходимые модули, как только
  • Когда приложение C++ необходимо, вызовите один из «доступных» node.js функции с аргументами
  • Рида и процесс возвращения работы функции значения

В идеале код Node.js и код C++ запускается в том же контексте процесса, что нет необходимости сортировать аргументы и возвращать значения по некоторому потоку абстракции.

Все советы приветствуются!

Tx

Питер

+0

Это походит на несколько вопросов. Вы хотите знать, как вызвать функцию, или вы хотите, чтобы мы писали для вас модуль while? Счастлив сделать первый, но никто не собирается писать целый модуль без начального кода. – loganfsmyth

+0

Спасибо за вашу реакцию. Я хотел бы создать автономное приложение C++, которое связывается с объектными файлами node.js, чтобы изнутри этого автономного приложения мог быть загружен сценарий node.js и чтобы функции в модуле node.js могли выполняться , Любые советы, например. как указатели к примеру кода, которые делают подобные вещи, были бы полезны. Я, конечно, не ожидаю, что кто-то напишет код, но получить представление о том, как подойти к этому, будет оценено по достоинству. Tx. Питер. – Peter

ответ

5

я в конце концов удалось получить что-то происходит

То, что я боролся с большинства, как иметь дело с циклом обработки событий узел/v8 так, что он запускается, когда Javascript функция вызывается, но также останавливается, когда функция javascript выполняется так, что вызывающий метод C++ продолжается ... в основном, чтобы дождаться завершения всей обработки асинхронного узла.

Кратко, что я сделал это изменить ++ класс, который делает что-то вдоль линий

  • инициализирован узел, так же, как в node.cc методы Node :: Init и Node :: Start и переходящая в аргумент, указывающий на скрипт узла, который определяет функцию, которую я хочу вызвать

  • Затем зарегистрируйте функцию C++ в глобальном пространстве имен узла, которая будет использоваться функцией javascript в качестве окончательного обратного вызова. Более или менее, как

    v8::Locker locker; 
    v8::HandleScope handle_scope; 
    v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(); 
    global->Set(v8::String::New("functionCallback"), v8::FunctionTemplate::New(fnCallback,v8::External::Wrap(this))); 
    
  • Затем вызовите яваскрипт функцию

    v8::Handle<v8::Value> value = global->Get(v8::String::New(functionName.c_str())); 
    v8::Handle<v8::Function> func = v8::Handle<v8::Function>::Cast(value); 
    v8::Handle<v8::Value> *v8Args = new v8::Handle<v8::Value>[functionArguments.size()]; 
    for (std::vector<std::string>::const_iterator it = functionArguments.begin(); it != functionArguments.end(); ++it) { 
        int ix = distance(functionArguments.begin(),it); 
        v8Args[ix] = v8::String::New((*it).c_str()); 
    } 
    v8::Handle<v8::Value> fnResult; 
    fnResult = func->Call(global, functionArguments.size(), v8Args); 
    uv_run(uv_default_loop(),UV_RUN_DEFAULT); 
    
  • Важно, что вызывается Java-функция в конечном счете вызывает глобальную функцию обратного вызова, как в (JavaScript)

    global.functionCallback(result); 
    
  • Этот обратный вызов (C++) сохранит результат и завершит цикл события

    static v8::Handle<v8::Value> fnCallback(const v8::Arguments& args) { 
    ... 
    // Stop node event loop so that the "calling" app continues (loop is started in execFn) 
    uv_stop(uv_default_loop()); 
    ... 
    

Я понимаю, что это немного лаконичным.Если кому-то интересно, могу поделиться класса C++, но мое знание C++/v8/узел очень ограничен, поэтому я предпочел бы не оставлять, что во всей своей полноте

Питер

+0

Мне был бы интересен класс C++. Не могли бы вы отправить его мне по электронной почте, пожалуйста! – theliberalsurfer

Смежные вопросы