Question

I have a legacy Delphi dll which requires a json string as input (pAnsiChar) and returns an int as success or failure. I have managed to connect to the dll from nodejs using node-ffi. However, i am getting return int value points to invalid json string.

Could someone point me in the direction as to how to call a Delphi dll with pAnsiChar as function arguments from node

Thanks

Was it helpful?

Solution 2

PAnsiChar in Delphi is a char* in C/C++. In the FFI declaration for the DLL function, simply declare the PAnsiChar parameter as a "string", which is a null-terminated char* in FFI.

For example, given this Delphi function:

function ProcessJson(Json: PAnsiChar): Integer; stdcall;

The node.js code would look something like this:

var ffi = require('ffi');

var mydll = ffi.Library('mydll', {
  'ProcessJson': [ 'int', [ 'string' ] ]
});

var ret = mydll.ProcessJson("json content here");

OTHER TIPS

So far as I can tell, Node FFI does not currently allow you to control the calling convention. And the default is cdecl. So on the Delphi side it looks like this:

function MyFunction(str: PAnsiChar): Integer; cdecl;

On the node-ffi side I think it looks like this:

var ffi = require('ffi');
var mylib = ffi.Library('libname', {
  'MyFunction': [ 'int', [ 'string' ] ]
});
var retval = mylib.MyFunction("some string");

If you cannot modify the legacy DLL then I'm afraid that you may need to wrap it in a DLL that does nothing other than export cdecl functions, and then pass them through to the legacy DLL's stdcall functions.

I'm looking into this myself, and based on the research I've done node-ffi can handle the following calling conventions:

thiscall, fastcall and MSVC cdecl on Windows

Per the changelog in the readme.

This isn't the best source of information, but there is no mention of stdcall in the readme. fastcall is supported though, which is also a callee clean-up calling convention, so it may be best to switch your functions to fastcall instead of cdecl if you're looking to call a Delphi DLL with node-ffi.

I'll try calling some simple StdCall functions through node-ffi to see if it can handle them properly and check back here once I have some results.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top