обратные вызовы с C ++ и JavaScript - PullRequest
0 голосов
/ 08 января 2019

Я новичок в c ++, ниже я нашел в интернете: js-код вызывает функцию c ++, а из c ++ другая функция вызывает другую функцию js.
В основном это работает так: js ---> c ++ ---> c ++ ---> js

ЯШ:

var addon = require('bindings')('hello');

// console.log(addon);
// addon.simple();

function foo() {
        console.log("woohoo!");
}

addon.setCallback(foo);
addon.call(() => console.log("call!")) ;
addon.callThis(() => console.log("this too!"));

C ++:

#include <node.h>
#include <nan.h>


using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::NewStringType;
using v8::Object;
using v8::String;
using v8::Value;


static Nan::CopyablePersistentTraits<v8::Function>::CopyablePersistent _cb;

static void SetCallback(const Nan::FunctionCallbackInfo<v8::Value>& info) {
  _cb = Nan::Persistent<v8::Function>(info[0].As<v8::Function>());
}

static void RunCallback(const Nan::FunctionCallbackInfo<v8::Value>& info) {
  Nan::MakeCallback(Nan::GetCurrentContext()->Global(), Nan::New(_cb), 0, 0);
  _cb.Reset();
}

void RunThisCallback(const Nan::FunctionCallbackInfo<v8::Value>& info) {
  v8::Local<v8::Function> cb = info[0].As<v8::Function>();
  Nan::MakeCallback(Nan::GetCurrentContext()->Global(), cb, 0, 0);
}

static void Init(v8::Local<v8::Object> exports, v8::Local<v8::Object> module) {
  Nan::SetMethod(exports, "setCallback", SetCallback);
  Nan::SetMethod(exports, "call", RunThisCallback);
  Nan::SetMethod(exports, "callThis", RunThisCallback);
}

NODE_MODULE(NODE_GYP_MODULE_NAME, Init);

Это работает автономно, и когда я попытался интегрировать тот же код с другим проектом, я получил эту ошибку:

example_wrap.obj: ошибка LNK2005: _register_example_ уже определено в example.obj [C: \ Users \ UAL \ Desktop \ PentaScannerE lectronDemoForCallback \ сборка \ example.vcxproj] Создание библиотеки C: \ Users \ UAL \ Desktop \ PentaScannerElectronDemoForCallback \ build \ Release \ example.lib и объект C: \
Пользователи \ UAL \ Desktop \ PentaScannerElectronDemoForCallback \ построить \ Release \ example.exp C: \ Users \ UAL \ Desktop \ PentaScannerElectronDemoForCallback \ сборки \ Release \ example.node : фатальная ошибка LNK1169: найден один или несколько кратно определенных символов [C: \ Users \ UAL \ Desktop \ PentaScannerElectronDemoForCallback \ построить \ example.vcxproj]

Я думаю, что он пытается создать еще один пакет, который уже существует.

Моя цель - вызвать функцию callThis() из метода, который находится в c ++. Я считаю, что NODE_MODULE(NODE_GYP_MODULE_NAME, Init); (если я не ошибаюсь) - это код, который делает это. Как я могу вызвать это из метода:

который мог бы что-то вроде этого

callJSFunction(){
    NODE_MODULE(NODE_GYP_MODULE_NAME, Init);
    }

или любым другим способом, который соответствует моему требованию.

...