我有一个遗留的Delphi dll,它需要一个json字符串作为输入(pAnsiChar)并返回一个int作为成功或失败。我已经设法使用node-ffi从nodejs连接到dll。但是,我将返回int值指向无效的json字符串。
有人能指出我如何使用pAnsiChar作为函数参数从节点
调用Delphi dll的方向谢谢
答案 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)
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
这不是最好的信息来源,但自述文件中没有提到stdcall。虽然支持fastcall,这也是一个被调用者清理调用约定,所以如果你想用node-ffi调用Delphi DLL,最好将你的函数切换到fastcall而不是cdecl。
我会尝试通过node-ffi调用一些简单的StdCall函数来查看它是否能正确处理它们,并在得到一些结果后再回来查看。