使用节点js的pAnisChar调用Delphi stdcall函数
我有一个传统的Delphi DLL需要一个JSONstring作为input(pAnsiChar),并返回一个int作为成功或失败。 我设法使用node-ffi从nodejs连接到dll。 但是,我正在返回int值的值无效的jsonstring。
有人能指出我如何调用一个delphiDLL与pAnsiChar作为节点的函数参数
谢谢
Delphi中的PAnsiChar
是C / C ++中的一个char*
。 在DLL函数的FFI声明中,只需将PAnsiChar
参数声明为"string"
,即在FFI中以空字符结尾的char *。
例如,给定这个delphifunction:
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目前不允许你控制调用约定。 而默认是cdecl
。 所以在delphi方面看起来像这样:
function MyFunction(str: PAnsiChar): Integer; cdecl;
在节点,我认为它看起来像这样:
var ffi = require('ffi'); var mylib = ffi.Library('libname', { 'MyFunction': [ 'int', [ 'string' ] ] }); var retval = mylib.MyFunction("some string");
如果你不能修改遗留的DLL,那么恐怕你可能需要把它包装在一个除导出cdecl
函数之外什么也不做的DLL中,然后把它们传递给遗留的DLL的stdcall
函数。
我正在研究这个问题,根据我所做的研究,node-ffi可以处理以下调用约定:
Windows上的thiscall,fastcall和MSVC cdecl
根据自述文件中的更新日志 。
这不是最好的信息来源,但是自述文件中没有提到stdcall。 fastcall支持,这也是一个被调用者清理调用约定,所以如果你打算用node-ffi调用一个Delphi DLL,最好把函数切换到fastcall而不是cdecl。
我会尝试通过node-ffi调用一些简单的StdCall函数来查看它是否可以正确处理它们,并且在得到一些结果后再回来查看。