pmed / v8pp

Bind C++ functions and classes into V8 JavaScript engine
http://pmed.github.io/v8pp/
Other
901 stars 121 forks source link

export wrapped c++ class in one .node but the Implements of c++ classes are from multiple dlls #109

Open zxbzswxr opened 5 years ago

zxbzswxr commented 5 years ago

I want to export many c++ classes to node.js and I just divide these c++ classes into multiple dlls according to their function for conviniece. But I export all of them in another dll(.node in javascript view) finally.

the function from other dll works well but the class from other dll failed to work.. all the class has its constructor and some member function.. error is like that , image

as you see : Error: v8pp::class_<class PHILICUBE_SUD::CPrjSolutionOper, struct v8pp::raw_ptr_traits> is not registered in isolate 000001F5E1DE14A0

the class from other dlls can not be registered but the function can @pmed Can you help me solve it?

zxbzswxr commented 5 years ago

include

include <v8pp/module.hpp>

include <v8pp/class.hpp>

include <v8pp/config.hpp>

include "prjsolutionOper.h"

include "prj_udvOper.h"

include "prjaiobjOper.h"

include "prjareaOper.h"

include "prjdbgroupOper.h"

include "prjdbunitDeployOper.h"

include "prjdbunitOper.h"

include "prjdeviceOper.h"

include "prjdiobjOper.h"

include "prjdomainOper.h"

include "prjeqobjOper.h"

include "prjnetworkOper.h"

include "prjsiteOper.h"

include "prjtagOper.h"

include "type_areaOper.h"

include "type_dataobjOper.h"

include "type_dbunitOper.h"

include "type_deviceOper.h"

include "type_domainOper.h"

include "type_groupOper.h"

include "type_networkOper.h"

include "type_siteOper.h"

include "diTagsRelationOper.h"

include "aiTagRelationOper.h"

include "dbCreator.h"

include "alarmFieldOper.h"

include "alarmLevelCfgOper.h"

include "alarmStatusCfgOper.h"

include "alarmTypeCfgOper.h"

include "ipmanageOper.h"

include "cfgsvrRegister.h"

include "prjeditlockOper.h"

include "ServiceCfgLoad.h"

namespace My_SUD {

void initALL(v8::Handle<v8::Object> exports)
{
    v8::Isolate* isolate = v8::Isolate::GetCurrent();

  //  1
    v8pp::class_<CPrjSolutionOper>  solutionOperclass(isolate);
    solutionOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor",&CPrjSolutionOper::Destructor)
        .set("getNameFromID", &CPrjSolutionOper::getNameFromID)
        .set("getIDFromName", &CPrjSolutionOper::getIDFromName)
        .set("getAllSolutions", &CPrjSolutionOper::getAllSolutions)
        .set("createASolution", &CPrjSolutionOper::createASolution)
        .set("deleteSolution", &CPrjSolutionOper::deleteSolution)
        .set("getTheSolution", &CPrjSolutionOper::getTheSolution)
        .set("updateSolution", &CPrjSolutionOper::updateSolution)
        .set("updateSolutionCooper", &CPrjSolutionOper::updateSolutionCooper)
        .set("checkBrowseNameUseable", &CPrjSolutionOper::checkBrowseNameUseable)
        .set("getGraphProjectTree", &CPrjSolutionOper::getGraphProjectTree)
        .set("getAllProejctsDomainsDbunits", &CPrjSolutionOper::getAllProejctsDomainsDbunits)
        .set("getRedisByName", &CPrjSolutionOper::getRedisByName)
        ;

    // Fep 
    //  2
    v8pp::class_<CPrjDomainOper> domainOperclass(isolate);
    domainOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CPrjDomainOper::Destructor)
        .set("getNameFromID", &CPrjDomainOper::getNameFromID)
        .set("getAlldomains", &CPrjDomainOper::getAlldomains)
        .set("createAdomain", &CPrjDomainOper::createAdomain)
        .set("deletedomain", &CPrjDomainOper::deletedomain)
        .set("getTheDomain", &CPrjDomainOper::getTheDomain)
        .set("updatedomain", &CPrjDomainOper::updatedomain)
        .set("checkBrowseNameUseable", &CPrjDomainOper::checkBrowseNameUseable)
        .set("checkNoUseable", &CPrjDomainOper::checkNoUseable)
        .set("getDefaultPage", &CPrjDomainOper::getDefaultPage)
        .set("setDefaultPage", &CPrjDomainOper::setDefaultPage)
        .set("getAllDomainsDefaultpage", &CPrjDomainOper::getAllDomainsDefaultpage)
        .set("getDomainAllDbunits", &CPrjDomainOper::getDomainAllDbunits)
        ;
    // 3
    v8pp::class_<CPrjSiteOper> siteOperclass(isolate);
    siteOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CPrjSiteOper::Destructor)
        .set("getAllsites", &CPrjSiteOper::getAllsites)
        .set("getSiteChilds", &CPrjSiteOper::getSiteChilds)
        .set("createAsite", &CPrjSiteOper::createAsite)
        .set("deletesite", &CPrjSiteOper::deletesite)
        .set("getTheSite", &CPrjSiteOper::getTheSite)
        .set("updatesite", &CPrjSiteOper::updatesite)
        .set("checkBrowseNameUseable", &CPrjSiteOper::checkBrowseNameUseable)
        .set("checkNoUseable", &CPrjSiteOper::checkNoUseable)
        ;
    // 4
    v8pp::class_<CPrjNetworkOper> netwOperclass(isolate);
    netwOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CPrjNetworkOper::Destructor)
        .set("getAllnetworks", &CPrjNetworkOper::getAllnetworks)
        .set("createAnetwork", &CPrjNetworkOper::createAnetwork)
        .set("deletenetwork", &CPrjNetworkOper::deletenetwork)
        .set("getTheNetwork", &CPrjNetworkOper::getTheNetwork)
        .set("updatenetwork", &CPrjNetworkOper::updatenetwork)
        .set("checkBrowseNameUseable", &CPrjNetworkOper::checkBrowseNameUseable)
        .set("checkNoUseable", &CPrjNetworkOper::checkNoUseable)
        ;
    // 5
    v8pp::class_<CPrjDeviceOper> devOperclass(isolate);
    devOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CPrjDeviceOper::Destructor)
        .set("getAlldevices", &CPrjDeviceOper::getAlldevices)
        .set("createAdevice", &CPrjDeviceOper::createAdevice)
        .set("deletedevice", &CPrjDeviceOper::deletedevice)
        .set("getTheDevice", &CPrjDeviceOper::getTheDevice)
        .set("updatedevice", &CPrjDeviceOper::updatedevice)
        .set("checkBrowseNameUseable", &CPrjDeviceOper::checkBrowseNameUseable)
        .set("checkNoUseable", &CPrjDeviceOper::checkNoUseable)
        ;
    // 6
    v8pp::class_<CPrjTagOper> tagOperclass(isolate);
    tagOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CPrjTagOper::Destructor)
        .set("getAlltags", &CPrjTagOper::getAlltags)
        .set("createAtag", &CPrjTagOper::createAtag)
        .set("createTags", &CPrjTagOper::createTags)
        .set("deletetag", &CPrjTagOper::deletetag)
        .set("getTheTag", &CPrjTagOper::getTheTag)
        .set("updatetag", &CPrjTagOper::updatetag)
        .set("updatetags", &CPrjTagOper::updatetags)
        .set("deletetags", &CPrjTagOper::deletetags)
        ;
    // 7
    v8pp::class_<CPrjDbunitDeployOper> deployOperclass(isolate);
    deployOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CPrjDbunitDeployOper::Destructor)
        .set("getAllDeploysOfSite", &CPrjDbunitDeployOper::getAllDeploysOfSite)
        .set("createAdeploy", &CPrjDbunitDeployOper::createAdeploy)
        .set("deleteDeploy", &CPrjDbunitDeployOper::deleteDeploy)
        .set("getTheDeploy", &CPrjDbunitDeployOper::getTheDeploy)
        .set("updateDeploy", &CPrjDbunitDeployOper::updateDeploy)
        ;

    //  RTDB 
    //  8
    v8pp::class_<CPrjDbGroupOper> groupOperclass(isolate);
    groupOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CPrjDbGroupOper::Destructor)
        .set("getAlldbgroups", &CPrjDbGroupOper::getAlldbgroups)
        .set("createAdbgroup", &CPrjDbGroupOper::createAdbgroup)
        .set("deletedbgroup", &CPrjDbGroupOper::deletedbgroup)
        .set("getTheDbGroup", &CPrjDbGroupOper::getTheDbGroup)
        .set("updatedbgroup", &CPrjDbGroupOper::updatedbgroup)
        .set("checkBrowseNameUseable", &CPrjDbGroupOper::checkBrowseNameUseable)
        ;
    // 9
    v8pp::class_<CPrjDbunitOper> dbunitOperclass(isolate);
    dbunitOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CPrjDbunitOper::Destructor)
        .set("getNodeId", &CPrjDbunitOper::getNodeId)
        .set("getAlldbunits", &CPrjDbunitOper::getAlldbunits)
        .set("createAdbunit", &CPrjDbunitOper::createAdbunit)
        .set("deletedbunit", &CPrjDbunitOper::deletedbunit)
        .set("getTheDbUnit", &CPrjDbunitOper::getTheDbUnit)
        .set("updatedbunit", &CPrjDbunitOper::updatedbunit)
        .set("checkBrowseNameUseable", &CPrjDbunitOper::checkBrowseNameUseable)
        .set("checkNoUseable", &CPrjDbunitOper::checkNoUseable)
        ;
    // 10
    v8pp::class_<CPrjAreaOper>  areaOperclass(isolate);
    areaOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CPrjAreaOper::Destructor)
        .set("getNodeId", &CPrjAreaOper::getNodeId)
        .set("getAllareas", &CPrjAreaOper::getAllareas)
        .set("getAreaChilds", &CPrjAreaOper::getAreaChilds)
        .set("createAarea", &CPrjAreaOper::createAarea)
        .set("deletearea", &CPrjAreaOper::deletearea)
        .set("getTheArea", &CPrjAreaOper::getTheArea)
        .set("updatearea", &CPrjAreaOper::updatearea)
        .set("checkBrowseNameUseable", &CPrjAreaOper::checkBrowseNameUseable)
        ;
    // 11
    v8pp::class_<CEQObjOper> eqOperclass(isolate);
    eqOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CEQObjOper::Destructor)
        .set("getEQ", &CEQObjOper::getEQ)
        .set("getNodeId", &CEQObjOper::getNodeId)
        .set("getEQChilds", &CEQObjOper::getEQChilds)
        .set("createEQ", &CEQObjOper::createEQ)
        .set("modifyEQ", &CEQObjOper::modifyEQ)
        .set("deleteEQ", &CEQObjOper::deleteEQ)
        .set("checkBrowseNameUseable", &CEQObjOper::checkBrowseNameUseable)
        ;
    // 12
    v8pp::class_<CAIObjOper>  aiOperclass(isolate);
    aiOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CAIObjOper::Destructor)
        .set("getAI", &CAIObjOper::getAI)
        .set("createAI", &CAIObjOper::createAI)
        .set("modifyAI", &CAIObjOper::modifyAI)
        .set("deleteAI", &CAIObjOper::deleteAI)
        .set("checkBrowseNameUseable", &CAIObjOper::checkBrowseNameUseable)
        ;
    // 13
    v8pp::class_<CDIObjOper> diOperclass(isolate);
    diOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CDIObjOper::Destructor)
        .set("getDI", &CDIObjOper::getDI)
        .set("createDI", &CDIObjOper::createDI)
        .set("modifyDI", &CDIObjOper::modifyDI)
        .set("deleteDI", &CDIObjOper::deleteDI)
        .set("checkBrowseNameUseable", &CDIObjOper::checkBrowseNameUseable)
        ;
    // 14
    v8pp::class_<CPrjUdvOper>  udvOperclass(isolate);
    udvOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor",&CPrjUdvOper::Destructor)
        .set("getAlludvs", &CPrjUdvOper::getAlludvs)
        .set("createAudv", &CPrjUdvOper::createAudv)
        .set("deleteudv", &CPrjUdvOper::deleteudv)
        .set("getTheUdv", &CPrjUdvOper::getTheUdv)
        .set("updateudv", &CPrjUdvOper::updateudv)
        ;

    // AI、DI tag 
    // 15
    v8pp::class_<CPrjDITagsOper> diTagsOperclass(isolate);
    diTagsOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CPrjDITagsOper::Destructor)
        .set("getRelations", &CPrjDITagsOper::getRelations)
        .set("postRelations", &CPrjDITagsOper::postRelations)
        .set("deleteAllRelations", &CPrjDITagsOper::deleteAllRelations)
        ; //  string requestParse(const string &jsonObj);
    // 16
    v8pp::class_<CPrjAITagOper> aiTagOperclass(isolate);
    aiTagOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CPrjAITagOper::Destructor)
        .set("getRelation", &CPrjAITagOper::getRelation)
        .set("postRelation", &CPrjAITagOper::postRelation)
        .set("deleteRelation", &CPrjAITagOper::deleteRelation)
        ;

    // alarmtype
    // 17
    v8pp::class_<CAlarmFieldOper> alarmFieldOperclass(isolate);
    alarmFieldOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CAlarmFieldOper::Destructor)
        .set("getAllAlarmFields", &CAlarmFieldOper::getAllAlarmFields)
        ;
    // 18
    v8pp::class_<CAlarmLevelCfgOper> alarmLevelCfgOperclass(isolate);
    alarmLevelCfgOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CAlarmLevelCfgOper::Destructor)
        .set("getAllAlarmLevelCfgs", &CAlarmLevelCfgOper::getAllAlarmLevelCfgs)
        .set("createAlarmLevelCfg", &CAlarmLevelCfgOper::createAlarmLevelCfg)
        .set("updateAlarmLevelCfg", &CAlarmLevelCfgOper::updateAlarmLevelCfg)
        .set("deleteAlarmLevelCfg", &CAlarmLevelCfgOper::deleteAlarmLevelCfg)
        ;
    // 19
    v8pp::class_<CAlarmStatusCfgOper> alarmStatusCfgOperclass(isolate);
    alarmStatusCfgOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CAlarmStatusCfgOper::Destructor)
        .set("getAllAlarmStatusCfgs", &CAlarmStatusCfgOper::getAllAlarmStatusCfgs)
        .set("updateAlarmStatusCfg", &CAlarmStatusCfgOper::updateAlarmStatusCfg)
        .set("updateAlarmStatusCfgs", &CAlarmStatusCfgOper::updateAlarmStatusCfgs)
        ;
    // 20
    v8pp::class_<CAlarmTypeCfgOper> alarmTypeCfgOperclass(isolate);
    alarmTypeCfgOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CAlarmTypeCfgOper::Destructor)
        .set("getAllAlarmTypeCfgs", &CAlarmTypeCfgOper::getAllAlarmTypeCfgs)
        .set("updateAlarmTypeCfg", &CAlarmTypeCfgOper::updateAlarmTypeCfg)
        .set("updateAlarmTypeCfgs", &CAlarmTypeCfgOper::updateAlarmTypeCfgs)
        ;

    // IP  
    // 21
    v8pp::class_<CIPManagerOper> ipmanageOperclass(isolate);
    ipmanageOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CIPManagerOper::Destructor)
        .set("postRequest", &CIPManagerOper::postRequest)
        .set("getRequest", &CIPManagerOper::getRequest)
        .set("deleteRequest", &CIPManagerOper::deleteRequest)
        ;

    //  template
    //  22
    v8pp::class_<CTypeDomainOper> typedomainOperclass(isolate);
    typedomainOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CTypeDomainOper::Destructor)
        .set("getTypeDomain", &CTypeDomainOper::getTypeDomain)
        ;
    // 23
    v8pp::class_<CTypeSiteOper> typesiteOperclass(isolate);
    typesiteOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CTypeSiteOper::Destructor)
        .set("getTypeSite", &CTypeSiteOper::getTypeSite)
        ;
    // 24
    v8pp::class_<CTypeNetworkOper> typenetOperclass(isolate);
    typenetOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CTypeNetworkOper::Destructor)
        .set("getTypeNetwork", &CTypeNetworkOper::getTypeNetwork)
        ;
    // 25
    v8pp::class_<CTypeDeviceOper> typedevOperclass(isolate);
    typedevOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CTypeDeviceOper::Destructor)
        .set("getTypeDevice", &CTypeDeviceOper::getTypeDevice)
        ;

    // 26
    v8pp::class_<CTypeGroupOper> typegroupOperclass(isolate);
    typegroupOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CTypeGroupOper::Destructor)
        .set("getTypeGroup", &CTypeGroupOper::getTypeGroup)
        ;
    // 27
    v8pp::class_<CTypeDbunitOper> typedbunitOperclass(isolate);
    typedbunitOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CTypeDbunitOper::Destructor)
        .set("getTypeDbUnit", &CTypeDbunitOper::getTypeDbUnit)
        ;
    // 28
    v8pp::class_<CTypeAreaOper> typeareaOperclass(isolate);
    typeareaOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CTypeAreaOper::Destructor)
        .set("getTypeArea", &CTypeAreaOper::getTypeArea)
        ;
    // 29
    v8pp::class_<CTypeDataObjOper> typedataobjOperclass(isolate);
    typedataobjOperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CTypeDataObjOper::Destructor)
        .set("getTypeAI", &CTypeDataObjOper::getTypeAI)
        .set("getTypeDI", &CTypeDataObjOper::getTypeDI)
        .set("getTypeEQ", &CTypeDataObjOper::getTypeEQ)
        .set("getTypeFieldPoint", &CTypeDataObjOper::getTypeFieldPoint)
        ;   

    // 30 philiview Cooperate  prjeditlock
    v8pp::class_<CPrjEditLockOper> prjeditlockoperclass(isolate);
    prjeditlockoperclass.ctor<const v8::FunctionCallbackInfo<v8::Value>& >()
        .set("Destructor", &CPrjEditLockOper::Destructor)
        .set("getAllLockItems", &CPrjEditLockOper::getAllLockItems)
        .set("getChildLockItems", &CPrjEditLockOper::getChildLockItems)
        .set("getALockItem", &CPrjEditLockOper::getALockItem)
        .set("createALockItem", &CPrjEditLockOper::createALockItem)
        .set("modifyALockItem", &CPrjEditLockOper::modifyALockItem)
        .set("deleteLockItem", &CPrjEditLockOper::deleteLockItem)
        ;

    //  name of the caller in javascript 
    v8pp::module addon(isolate);

    addon.set("CPrjSolutionOper", solutionOperclass);
    addon.set("CPrjDomainOper", domainOperclass);
    addon.set("CPrjSiteOper", siteOperclass);
    addon.set("CPrjNetworkOper", netwOperclass);
    addon.set("CPrjDeviceOper", devOperclass);

    addon.set("CPrjTagOper", tagOperclass);
    addon.set("CPrjDbunitDeployOper", deployOperclass);
    addon.set("CPrjDbGroupOper", groupOperclass);
    addon.set("CPrjDbunitOper", dbunitOperclass);
    addon.set("CPrjAreaOper", areaOperclass);

    addon.set("CEQObjOper", eqOperclass);
    addon.set("CAIObjOper", aiOperclass);
    addon.set("CDIObjOper", diOperclass);
    addon.set("CPrjUdvOper", udvOperclass);
    addon.set("CPrjAITagOper", aiTagOperclass);

    addon.set("CPrjDITagsOper", diTagsOperclass);
    addon.set("CAlarmFieldOper", alarmFieldOperclass);
    addon.set("CAlarmLevelCfgOper", alarmLevelCfgOperclass);
    addon.set("CAlarmStatusCfgOper", alarmStatusCfgOperclass);
    addon.set("CAlarmTypeCfgOper", alarmTypeCfgOperclass);

    addon.set("CIPManagerOper", ipmanageOperclass);
    addon.set("CTypeDomainOper", typedomainOperclass);
    addon.set("CTypeSiteOper", typesiteOperclass);
    addon.set("CTypeNetworkOper", typenetOperclass);
    addon.set("CTypeDeviceOper", typedevOperclass);

    addon.set("CTypeGroupOper", typegroupOperclass);
    addon.set("CTypeAreaOper", typeareaOperclass);
    addon.set("CTypeDataObjOper", typedataobjOperclass);
    addon.set("CTypeDbunitOper", typedbunitOperclass);

    addon.set("CPrjEditLockOper", prjeditlockoperclass);

    // create database operation

    addon.set("InitCreateDb",&InitCreateDb);
    //  registe service 
    addon.set("RegisterCfgService",&RegisterCfgService);

    addon.set("startAlarmCfgService",&startAlarmCfgService);

    // network tag cfg load
    addon.set("loadServiceCfg", &InitCfgLoadFromFile);

    exports->SetPrototype(isolate->GetCurrentContext(), addon.new_instance());
    node::AtExit([](void* param)
    {
        printf("begin Exit\n");
        v8pp::cleanup(static_cast<v8::Isolate*>(param));

    }, isolate);
}

}

NODE_MODULE(DBOperPlusV8, My_SUD::initALL)

I export all the class and function using DBOperPlusV8.node (dll)

Javascript side: var DBOperPlusV8 = require('DBOperPlusV8');

var SolutionOper = DBOperPlusV8.CPrjSolutionOper(); var strSolutionDetail = SolutionOper.getTheSolution(soltID);
SolutionOper.Destructor();

@pmed that's all help

Mihcrass commented 2 years ago

How to use v8pp?? I can't download it.

Mihcrass commented 2 years ago

How can I install this development environment?