nodejs调用c++dll并返回结构类型

// cnc_resetconnect.cc
#include
#include


#include
#include


namespace demo {


using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Object;
using v8::String;
using v8::Value;
using v8::Number;
using v8::Uint32;
using v8::Integer;
using v8::Exception;
using v8::Array;


/* allocate library handle 3 */
//FWLIBAPI short WINAPI cnc_allclibhndl3(const char *, unsigned short, long, unsigned short *);
void Cnc_allclibhndl3(const FunctionCallbackInfo& args) {
  Isolate* isolate = args.GetIsolate();


  // Check the number of arguments passed.
  if (args.Length() != 4 ) {
    // Throw an Error that is passed back to JavaScript
    isolate->ThrowException(Exception::TypeError(
        String::NewFromUtf8(isolate, "Wrong number of arguments")));
    return;
  }


  HINSTANCE hDLL;
  hDLL=LoadLibrary("Fwlib32.dll");//加载动态链接库Fwlib32.dll文件;
  if (!hDLL) {
 // Throw an Error that is passed back to JavaScript
 DWORD dRe = GetLastError();
 char sz[4];
 sprintf(sz, "cat not get lib, error is %d", dRe);
 isolate->ThrowException(Exception::TypeError(
 String::NewFromUtf8(isolate, sz)));
 return;
  }


typedef  short(WINAPI *pMax)(const char *, unsigned short, long, unsigned short *);//函数指针
  pMax pCnc_resetconnect=NULL;
  pCnc_resetconnect=(pMax)GetProcAddress(hDLL,"cnc_allclibhndl3");
  if ( !pCnc_resetconnect ) {
    // Throw an Error that is passed back to JavaScript
    isolate->ThrowException(Exception::TypeError(
        String::NewFromUtf8(isolate, "can not get function: cnc_allclibhndl3 from Fwlib32.dll.")));
    return;
  }
 
  String::Utf8Value utf(args[0]->ToString());
  char* bufferdata = *utf;


  int a = args[1]->Uint32Value();
  int b = args[2]->Uint32Value();
  int c = args[3]->Uint32Value();


//   char buf[256];
//   sprintf(buf, "%s : %d : %d : %d", bufferdata, a, b, c);
//   MessageBox(NULL, buf, "", MB_OK);


  unsigned short iThr = c;


  short value = pCnc_resetconnect(bufferdata, a, b, &iThr);


  Local num = Uint32::New(isolate, value);
  Local handle = Uint32::New(isolate, iThr);


  Local obj = Object::New(isolate);
  obj->Set(String::NewFromUtf8(isolate, "re"), num);
  obj->Set(String::NewFromUtf8(isolate, "handle"), handle);

  args.GetReturnValue().Set(obj);

}


/* reset all socket connection */
//FWLIBAPI short WINAPI cnc_resetconnect(unsigned short);
void Cnc_resetconnect(const FunctionCallbackInfo& args) {
Isolate* isolate = args.GetIsolate();


// Check the number of arguments passed.
if (args.Length() != 1) {
// Throw an Error that is passed back to JavaScript
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "Wrong number of arguments")));
return;
}


HINSTANCE hDLL;
hDLL = LoadLibrary("Fwlib32.dll");//加载动态链接库Fwlib32.dll文件;
if (!hDLL) {
// Throw an Error that is passed back to JavaScript
DWORD dRe = GetLastError();
char sz[4];
sprintf(sz, "cat not get lib, error is %d", dRe);
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, sz)));
return;
}


typedef  short(WINAPI *pMax)( unsigned short );//函数指针
pMax pCnc_resetconnect = NULL;
pCnc_resetconnect = (pMax)GetProcAddress(hDLL, "cnc_resetconnect");
if (!pCnc_resetconnect) {
// Throw an Error that is passed back to JavaScript
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "can not get function: cnc_resetconnect from Fwlib32.dll.")));
return;
}


unsigned short a = args[0]->Uint32Value();

short value = pCnc_resetconnect(a);

Local num = Uint32::New(isolate, value);

// Set the return value (using the passed in
// FunctionCallbackInfo&)
args.GetReturnValue().Set(num);
}


#define MAX_AXIS        48
typedef struct odbaxis {
short   dummy;             /* dummy */
short   type;              /* axis number */
long    data[MAX_AXIS];    /* data value */
} ODBAXIS;


char* GetOdbaxis(short value, ODBAXIS dta, Isolate* isolate, Local& obj)
{
Local num = Uint32::New(isolate, value);
Local dummy = Uint32::New(isolate, dta.dummy);
Local type = Uint32::New(isolate, dta.type);
Local arr = Array::New(isolate, MAX_AXIS );

for (int i = 0; i < MAX_AXIS; ++i)
{
arr->Set(i, Number::New(isolate, dta.data[i]) );
}

obj->Set(String::NewFromUtf8(isolate, "re"), num);
obj->Set(String::NewFromUtf8(isolate, "dummy"), dummy);
obj->Set(String::NewFromUtf8(isolate, "type"), type);
obj->Set(String::NewFromUtf8(isolate, "data"), arr);

return NULL;
}


/* read machine axis position */
//FWLIBAPI short WINAPI cnc_machine(unsigned short, short, short, ODBAXIS *);
void Cnc_machine(const FunctionCallbackInfo& args) {
Isolate* isolate = args.GetIsolate();


// Check the number of arguments passed.
if (args.Length() != 4) {
// Throw an Error that is passed back to JavaScript
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "Wrong number of arguments")));
return;
}


HINSTANCE hDLL;
hDLL = LoadLibrary("Fwlib32.dll");//加载动态链接库Fwlib32.dll文件;
if (!hDLL) {
// Throw an Error that is passed back to JavaScript
DWORD dRe = GetLastError();
char sz[4];
sprintf(sz, "cat not get lib, error is %d", dRe);
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, sz)));
return;
}


typedef  short(WINAPI *pMax)(unsigned short, short, short, ODBAXIS *);//函数指针
pMax pCnc_resetconnect = NULL;
pCnc_resetconnect = (pMax)GetProcAddress(hDLL, "cnc_machine");
if (!pCnc_resetconnect) {
// Throw an Error that is passed back to JavaScript
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "can not get function: cnc_machine from Fwlib32.dll.")));
return;
}


unsigned short arg0 = args[0]->Uint32Value();
unsigned short arg1 = args[1]->Uint32Value();
unsigned short arg2 = args[2]->Uint32Value();
ODBAXIS obj = {};
short value = pCnc_resetconnect(arg0, arg1, arg2, &obj);


Local objR = Object::New(isolate);
char* pReturn = GetOdbaxis(value, obj, isolate, objR);
args.GetReturnValue().Set(objR/*String::NewFromUtf8(isolate, pReturn)*/);
//Local num = Uint32::New(isolate, value);


// Set the return value (using the passed in
// FunctionCallbackInfo&)
//args.GetReturnValue().Set(num);
}


//FWLIBAPI short WINAPI cnc_relative( unsigned short, short, short, ODBAXIS * ) ;
void Cnc_relative(const FunctionCallbackInfo& args) {
Isolate* isolate = args.GetIsolate();


// Check the number of arguments passed.
if (args.Length() != 4) {
// Throw an Error that is passed back to JavaScript
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "Wrong number of arguments")));
return;
}


HINSTANCE hDLL;
hDLL = LoadLibrary("Fwlib32.dll");//加载动态链接库Fwlib32.dll文件;
if (!hDLL) {
// Throw an Error that is passed back to JavaScript
DWORD dRe = GetLastError();
char sz[4];
sprintf(sz, "cat not get lib, error is %d", dRe);
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, sz)));
return;
}


typedef  short(WINAPI *pMax)(unsigned short, short, short, ODBAXIS *);//函数指针
pMax pCnc_resetconnect = NULL;
pCnc_resetconnect = (pMax)GetProcAddress(hDLL, "cnc_relative");
if (!pCnc_resetconnect) {
// Throw an Error that is passed back to JavaScript
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "can not get function: cnc_relative from Fwlib32.dll.")));
return;
}


unsigned short arg0 = args[0]->Uint32Value();
unsigned short arg1 = args[1]->Uint32Value();
unsigned short arg2 = args[2]->Uint32Value();
ODBAXIS obj = {};
short value = pCnc_resetconnect(arg0, arg1, arg2, &obj );
Local objR = Object::New(isolate);
char* pReturn = GetOdbaxis(value, obj, isolate, objR);
args.GetReturnValue().Set(objR/*String::NewFromUtf8(isolate, pReturn)*/);
}


//FWLIBAPI short WINAPI cnc_absolute( unsigned short, short, short, ODBAXIS * ) ;
void Cnc_absolute(const FunctionCallbackInfo& args) {
Isolate* isolate = args.GetIsolate();


// Check the number of arguments passed.
if (args.Length() != 4) {
// Throw an Error that is passed back to JavaScript
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "Wrong number of arguments")));
return;
}


HINSTANCE hDLL;
hDLL = LoadLibrary("Fwlib32.dll");//加载动态链接库Fwlib32.dll文件;
if (!hDLL) {
// Throw an Error that is passed back to JavaScript
DWORD dRe = GetLastError();
char sz[4];
sprintf(sz, "cat not get lib, error is %d", dRe);
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, sz)));
return;
}


typedef  short(WINAPI *pMax)(unsigned short, short, short, ODBAXIS *);//函数指针
pMax pCnc_resetconnect = NULL;
pCnc_resetconnect = (pMax)GetProcAddress(hDLL, "cnc_absolute");
if (!pCnc_resetconnect) {
// Throw an Error that is passed back to JavaScript
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "can not get function: cnc_absolute from Fwlib32.dll.")));
return;
}


unsigned short arg0 = args[0]->Uint32Value();
unsigned short arg1 = args[1]->Uint32Value();
unsigned short arg2 = args[2]->Uint32Value();
ODBAXIS obj = {};;
short value = pCnc_resetconnect(arg0, arg1, arg2, &obj);


Local objR = Object::New(isolate);
char* pReturn = GetOdbaxis(value, obj, isolate, objR);
args.GetReturnValue().Set(objR/*String::NewFromUtf8(isolate, pReturn)*/);
}


//FWLIBAPI short WINAPI cnc_distance( unsigned short, short, short, ODBAXIS * ) ;
void Cnc_distance(const FunctionCallbackInfo& args) {
Isolate* isolate = args.GetIsolate();


// Check the number of arguments passed.
if (args.Length() != 4) {
// Throw an Error that is passed back to JavaScript
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "Wrong number of arguments")));
return;
}


HINSTANCE hDLL;
hDLL = LoadLibrary("Fwlib32.dll");//加载动态链接库Fwlib32.dll文件;
if (!hDLL) {
// Throw an Error that is passed back to JavaScript
DWORD dRe = GetLastError();
char sz[4];
sprintf(sz, "cat not get lib, error is %d", dRe);
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, sz)));
return;
}


typedef  short(WINAPI *pMax)(unsigned short, short, short, ODBAXIS *);//函数指针
pMax pCnc_resetconnect = NULL;
pCnc_resetconnect = (pMax)GetProcAddress(hDLL, "cnc_absolute");
if (!pCnc_resetconnect) {
// Throw an Error that is passed back to JavaScript
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "can not get function: cnc_distance from Fwlib32.dll.")));
return;
}


unsigned short arg0 = args[0]->Uint32Value();
unsigned short arg1 = args[1]->Uint32Value();
unsigned short arg2 = args[2]->Uint32Value();
ODBAXIS obj = {};;
short value = pCnc_resetconnect(arg0, arg1, arg2, &obj);


Local objR = Object::New(isolate);
char* pReturn = GetOdbaxis(value, obj, isolate, objR);
args.GetReturnValue().Set(objR/*String::NewFromUtf8(isolate, pReturn)*/);
//Local num = Uint32::New(isolate, value);


// Set the return value (using the passed in
// FunctionCallbackInfo&)
//args.GetReturnValue().Set(num);
}


//FWLIBAPI short WINAPI cnc_actf( unsigned short, ODBACT * ) ;
void Cnc_actf(const FunctionCallbackInfo& args) {
Isolate* isolate = args.GetIsolate();


// Check the number of arguments passed.
if (args.Length() != 2) {
// Throw an Error that is passed back to JavaScript
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "Wrong number of arguments")));
return;
}


HINSTANCE hDLL;
hDLL = LoadLibrary("Fwlib32.dll");//加载动态链接库Fwlib32.dll文件;
if (!hDLL) {
// Throw an Error that is passed back to JavaScript
DWORD dRe = GetLastError();
char sz[4];
sprintf(sz, "cat not get lib, error is %d", dRe);
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, sz)));
return;
}


typedef  short(WINAPI *pMax)(unsigned short, ODBAXIS *);//函数指针
pMax pCnc_resetconnect = NULL;
pCnc_resetconnect = (pMax)GetProcAddress(hDLL, "cnc_actf");
if (!pCnc_resetconnect) {
// Throw an Error that is passed back to JavaScript
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "can not get function: cnc_actf from Fwlib32.dll.")));
return;
}


unsigned short arg0 = args[0]->Uint32Value();
ODBAXIS obj = {};;
short value = pCnc_resetconnect(arg0, &obj);


Local objR = Object::New(isolate);
char* pReturn = GetOdbaxis(value, obj, isolate, objR);
args.GetReturnValue().Set(objR/*String::NewFromUtf8(isolate, pReturn)*/);
//Local num = Uint32::New(isolate, value);


// Set the return value (using the passed in
// FunctionCallbackInfo&)
//args.GetReturnValue().Set(num);
}


/* read actual spindle speed(S) */
//FWLIBAPI short WINAPI cnc_acts(unsigned short, ODBACT *);
void Cnc_acts(const FunctionCallbackInfo& args) {
Isolate* isolate = args.GetIsolate();


// Check the number of arguments passed.
if (args.Length() != 2) {
// Throw an Error that is passed back to JavaScript
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "Wrong number of arguments")));
return;
}


HINSTANCE hDLL;
hDLL = LoadLibrary("Fwlib32.dll");//加载动态链接库Fwlib32.dll文件;
if (!hDLL) {
// Throw an Error that is passed back to JavaScript
DWORD dRe = GetLastError();
char sz[4];
sprintf(sz, "cat not get lib, error is %d", dRe);
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, sz)));
return;
}


typedef  short(WINAPI *pMax)(unsigned short, ODBAXIS *);//函数指针
pMax pCnc_resetconnect = NULL;
pCnc_resetconnect = (pMax)GetProcAddress(hDLL, "cnc_acts");
if (!pCnc_resetconnect) {
// Throw an Error that is passed back to JavaScript
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "can not get function: cnc_acts from Fwlib32.dll.")));
return;
}


unsigned short arg0 = args[0]->Uint32Value();
ODBAXIS obj = {};;
short value = pCnc_resetconnect(arg0, &obj);


Local objR = Object::New(isolate);
char* pReturn = GetOdbaxis(value, obj, isolate, objR);
args.GetReturnValue().Set(objR/*String::NewFromUtf8(isolate, pReturn)*/);
//Local num = Uint32::New(isolate, value);


// Set the return value (using the passed in
// FunctionCallbackInfo&)
//args.GetReturnValue().Set(num);
}


typedef struct odbst {
short dummy[2];     /* dummy                    */
short aut;          /* selected automatic mode  */
short manual;       /* selected manual mode     */
short run;          /* running status           */
short edit;         /* editting status          */
short motion;       /* axis, dwell status       */
short mstb;         /* m, s, t, b status        */
short emergency;    /* emergency stop status    */
short write;        /* writting status          */
short labelskip;    /* label skip status        */
short alarm;        /* alarm status             */
short warning;      /* warning status           */
short battery;      /* battery status           */
} ODBST;


void GetODBST( short iRe, const ODBST& dta, Isolate* isolate, Local& obj)
{
Local num = Uint32::New(isolate, iRe);
Local dummy = Array::New(isolate, 2);
dummy->Set(0, Uint32::New(isolate, dta.dummy[0]));
dummy->Set(0, Uint32::New(isolate, dta.dummy[1]));
Local aut = Uint32::New(isolate, dta.aut);
Local manual = Uint32::New(isolate, dta.manual);
Local run = Uint32::New(isolate, dta.run);
Local edit = Uint32::New(isolate, dta.edit);
Local motion = Uint32::New(isolate, dta.motion);
Local mstb = Uint32::New(isolate, dta.mstb);
Local emergency = Uint32::New(isolate, dta.emergency);
Local write = Uint32::New(isolate, dta.write);
Local labelskip = Uint32::New(isolate, dta.labelskip);
Local alarm = Uint32::New(isolate, dta.alarm);
Local warning = Uint32::New(isolate, dta.warning);
Local battery = Uint32::New(isolate, dta.battery);


obj->Set(String::NewFromUtf8(isolate, "re"), num);
obj->Set(String::NewFromUtf8(isolate, "dummy"), dummy);
obj->Set(String::NewFromUtf8(isolate, "aut"), aut);
obj->Set(String::NewFromUtf8(isolate, "manual"), manual);
obj->Set(String::NewFromUtf8(isolate, "run"), run);
obj->Set(String::NewFromUtf8(isolate, "edit"), edit);
obj->Set(String::NewFromUtf8(isolate, "motion"), motion);
obj->Set(String::NewFromUtf8(isolate, "mstb"), mstb);
obj->Set(String::NewFromUtf8(isolate, "emergency"), emergency);
obj->Set(String::NewFromUtf8(isolate, "write"), write);
obj->Set(String::NewFromUtf8(isolate, "labelskip"), labelskip);
obj->Set(String::NewFromUtf8(isolate, "alarm"), alarm);
obj->Set(String::NewFromUtf8(isolate, "warning"), warning);
obj->Set(String::NewFromUtf8(isolate, "battery"), battery);
}


/* read CNC status information */
//FWLIBAPI short WINAPI cnc_statinfo(unsigned short, ODBST *);
void Cnc_statinfo(const FunctionCallbackInfo& args) {
Isolate* isolate = args.GetIsolate();


// Check the number of arguments passed.
if (args.Length() != 2) {
// Throw an Error that is passed back to JavaScript
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "Wrong number of arguments")));
return;
}


HINSTANCE hDLL;
hDLL = LoadLibrary("Fwlib32.dll");//加载动态链接库Fwlib32.dll文件;
if (!hDLL) {
// Throw an Error that is passed back to JavaScript
DWORD dRe = GetLastError();
char sz[4];
sprintf(sz, "cat not get lib, error is %d", dRe);
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, sz)));
return;
}


typedef  short(WINAPI *pMax)(unsigned short, ODBST *);//函数指针
pMax pCnc_resetconnect = NULL;
pCnc_resetconnect = (pMax)GetProcAddress(hDLL, "cnc_statinfo");
if (!pCnc_resetconnect) {
// Throw an Error that is passed back to JavaScript
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "can not get function: cnc_statinfo from Fwlib32.dll.")));
return;
}


unsigned short arg0 = args[0]->Uint32Value();
ODBST obj = {};;
short value = pCnc_resetconnect(arg0, &obj);


Local objR = Object::New(isolate);
/*char* pReturn = */GetODBST(value, obj, isolate, objR);
args.GetReturnValue().Set(objR/*String::NewFromUtf8(isolate, pReturn)*/);


//Local num = Uint32::New(isolate, value);


// Set the return value (using the passed in
// FunctionCallbackInfo&)
//args.GetReturnValue().Set(num);
}


//0iB
/* read program name under execution */
//FWLIBAPI short WINAPI cnc_exeprgname(unsigned short, ODBEXEPRG *);
void Cnc_exeprgname(const FunctionCallbackInfo& args) {
Isolate* isolate = args.GetIsolate();


// Check the number of arguments passed.
if (args.Length() != 2) {
// Throw an Error that is passed back to JavaScript
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "Wrong number of arguments")));
return;
}


HINSTANCE hDLL;
hDLL = LoadLibrary("Fwlib32.dll");//加载动态链接库Fwlib32.dll文件;
if (!hDLL) {
// Throw an Error that is passed back to JavaScript
DWORD dRe = GetLastError();
char sz[4];
sprintf(sz, "cat not get lib, error is %d", dRe);
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, sz)));
return;
}


typedef  short(WINAPI *pMax)(unsigned short, ODBAXIS *);//函数指针
pMax pCnc_resetconnect = NULL;
pCnc_resetconnect = (pMax)GetProcAddress(hDLL, "cnc_exeprgname");
if (!pCnc_resetconnect) {
// Throw an Error that is passed back to JavaScript
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "can not get function: cnc_exeprgname from Fwlib32.dll.")));
return;
}


unsigned short arg0 = args[0]->Uint32Value();
ODBAXIS obj = {};;
short value = pCnc_resetconnect(arg0, &obj);


Local objR = Object::New(isolate);
char* pReturn = GetOdbaxis(value, obj, isolate, objR);
args.GetReturnValue().Set(objR/*String::NewFromUtf8(isolate, pReturn)*/);
//Local num = Uint32::New(isolate, value);


// Set the return value (using the passed in
// FunctionCallbackInfo&)
//args.GetReturnValue().Set(num);
}




void init(Local exports) {
NODE_SET_METHOD(exports, "cnc_allclibhndl3", Cnc_allclibhndl3); 
NODE_SET_METHOD(exports, "cnc_resetconnect", Cnc_resetconnect); 
NODE_SET_METHOD(exports, "cnc_machine", Cnc_machine);
NODE_SET_METHOD(exports, "cnc_relative", Cnc_relative); 
NODE_SET_METHOD(exports, "cnc_absolute", Cnc_absolute);
NODE_SET_METHOD(exports, "cnc_distance", Cnc_distance);
NODE_SET_METHOD(exports, "cnc_actf", Cnc_actf);
NODE_SET_METHOD(exports, "cnc_acts", Cnc_acts);
NODE_SET_METHOD(exports, "cnc_exeprgname", Cnc_exeprgname);
NODE_SET_METHOD(exports, "cnc_statinfo", Cnc_statinfo);
ODBAXISEx::Init(exports);
}


NODE_MODULE(addon, init)


}  // namespace demo

你可能感兴趣的:(nodejs)