使用节点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函数来查看它是否可以正确处理它们,并且在得到一些结果后再回来查看。