我有一个遗留的 Delphi dll,它需要一个 json 字符串作为输入(pAnsiChar)并返回一个 int 作为成功或失败。我已经设法使用 node-ffi 从 nodejs 连接到 dll。但是,我将返回 int 值指向无效的 json 字符串。
有人可以指出我如何使用 pAnsiChar 作为来自节点的函数参数调用 Delphi dll 的方向吗
谢谢
据我所知,Node FFI 目前不允许您控制调用约定。并且默认是cdecl
. 所以在德尔福方面它看起来像这样:
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 的stdcall
函数。
PAnsiChar
在 Delphi 中是char*
C/C++ 中的。在 DLL 函数的 FFI 声明中,只需将PAnsiChar
参数声明为 a "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");
我自己正在研究这个,根据我所做的研究 node-ffi 可以处理以下调用约定:
Windows 上的 thiscall、fastcall 和 MSVC cdecl
根据自述文件中的更改日志。
这不是最好的信息来源,但自述文件中没有提到 stdcall。虽然支持 fastcall,这也是一种被调用者清理调用约定,因此如果您希望使用 node-ffi 调用 Delphi DLL,最好将您的函数切换为 fastcall 而不是 cdecl。
我将尝试通过 node-ffi 调用一些简单的 StdCall 函数,看看它是否可以正确处理它们,并在得到一些结果后返回这里查看。