Guillaume Vincent Guillaume Vincent - 26 days ago 14
Node.js Question

javascript equivalent for python ctypes with node-gyp

I want to transform a python script into a javascript script. My python script loads a dll and use its API.

processings2D = ctypes.CDLL('processings2D.dll')
print(processings2D.ImageProcessor2DCreate())


I try do to the same with node-gyp but my script doesn't find the dll.

console.log(processings2D.ImageProcessor2DCreate());
^
TypeError: Cannot load processings2D.dll library


test.js

var processings2D = require('./build/Release/processings2D.node');
console.log(processings2D.ImageProcessor2DCreate());


addon.cc

#include <nan.h>
#include "processings2D/processings2D.h"

HINSTANCE hDLL = NULL;
typedef int(*Fn)();

void ImageProcessor2DCreate(const Nan::FunctionCallbackInfo<v8::Value>& info) {
hDLL = LoadLibrary("processings2D.dll");
if(!hDLL)
{
Nan::ThrowTypeError("Cannot load processings2D.dll library");
return;
}

Fn fn = (Fn)GetProcAddress(hDLL, "ImageProcessor2DCreate");
if (!fn) {
Nan::ThrowTypeError("Could not load ImageProcessor2DCreate function");
FreeLibrary(hDLL);
return;
}

info.GetReturnValue().Set(Nan::New(fn()));
}

void Init(v8::Local<v8::Object> exports) {
exports->Set(Nan::New("ImageProcessor2DCreate").ToLocalChecked(), Nan::New<v8::FunctionTemplate>(ImageProcessor2DCreate)->GetFunction());
}

NODE_MODULE(twoD, Init)


binding.gyp

{
"targets": [
{
"target_name": "processings2D",
"sources": [
"addon.cc"
],
"include_dirs": [
"<!(node -e \"require('nan')\")"
]
}
]
}


dll is in the Release folder
/build/Release/processings2D.dll


Am I in the right direction ?

Answer

The solution was really simple :

My dll was a 32 bit version, so I should build my module with the good arch and execute my test with the good version of node.

node-gyp clean configure --arch=ia32 build
"C:\Program Files (x86)\nodejs\node.exe" test.js
Comments