从节点js用pAnisChar调用Delphi stdcall函数

时间:2014-01-25 23:17:01

标签: node.js delphi node-ffi

我有一个遗留的Delphi dll,它需要一个json字符串作为输入(pAnsiChar)并返回一个int作为成功或失败。我已经设法使用node-ffi从nodejs连接到dll。但是,我将返回int值指向无效的json字符串。

有人能指出我如何使用pAnsiChar作为函数参数从节点

调用Delphi dll的方向

谢谢

3 个答案:

答案 0 :(得分:5)

据我所知,Node FFI目前不允许您控制调用约定。默认值为cdecl。所以在Delphi方面它看起来像这样:

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

在node-ffi方面,我认为它看起来像这样:

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

如果您无法修改旧版DLL,那么我担心您可能需要将其包装在除了导出cdecl函数之外什么都不做的DLL中,然后将它们传递给旧版DLL {{1函数。

答案 1 :(得分:4)

Delphi中的

PAnsiChar是C / C ++中的char*。在DLL函数的FFI声明中,只需将PAnsiChar参数声明为"string",这是FFI中以null结尾的char *。

例如,给定这个Delphi函数:

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

node.js代码看起来像这样:

var ffi = require('ffi');

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

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

答案 2 :(得分:0)

我自己正在研究这个问题,根据我所做的研究,node-ffi可以处理以下调用约定:

  

Windows上的thiscall,fastcall和MSVC cdecl

根据changelog in the readme

这不是最好的信息来源,但自述文件中没有提到stdcall。虽然支持fastcall,这也是一个被调用者清理调用约定,所以如果你想用node-ffi调用Delphi DLL,最好将你的函数切换到fastcall而不是cdecl。

我会尝试通过node-ffi调用一些简单的StdCall函数来查看它是否能正确处理它们,并在得到一些结果后再回来查看。