4

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

有人可以指出我如何使用 pAnsiChar 作为来自节点的函数参数调用 Delphi dll 的方向吗

谢谢

4

3 回答 3

5

据我所知,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函数。

于 2014-01-25T23:48:43.340 回答
4

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");
于 2014-01-25T23:47:53.623 回答
0

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

Windows 上的 thiscall、fastcall 和 MSVC cdecl

根据自述文件中的更改日志

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

我将尝试通过 node-ffi 调用一些简单的 StdCall 函数,看看它是否可以正确处理它们,并在得到一些结果后返回这里查看。

于 2016-11-02T18:08:57.940 回答