我正在使用 node-ffi 访问由我购买的自定义硬件提供的 dll,该 dll 使用设备驱动程序来做事,他们不提供 dll 文档,但他们在 c# 中有一个示例应用程序,dll 在 c# 中使用像这样:
[DllImport("POS_CIDR.dll", CharSet = CharSet.Unicode)]
private static extern IntPtr CIDR_Info();
...
result = Marshal.PtrToStringUni(CIDR.CIDR_Info());
...
现在我尝试CIDR_Info使用以下节点代码访问 dll 的功能:
var ffi = require('ffi')
var ref = require('ref')
var int = ref.types.int;
var libprime = ffi.Library('POS_CIDR.dll', {
'CIDR_Info': [ int ,[]],
});
console.log(libprime.CIDR_Info()); // 73402156
现在从我所了解的函数返回一个包含字符串地址的整数,我如何将该整数取消引用到节点中的字符串?我找不到任何方法来设置节点中缓冲区的地址。
更新
好的,我找到了如何使用以下代码读取该字符串:
var ffi = require('ffi')
var ref = require('ref')
var stringPtr = ref.refType(ref.types.CString);
var int = ref.types.int
var libprime = ffi.Library('POS_CIDR.dll', {
'CIDR_Info': [ stringPtr ,[]],
});
buf = new Buffer(255);
buf=libprime.CIDR_Info();
console.log(ref.readCString(buf, 0));
现在控制台输出p这是字符串的第一个字符,如果我将偏移量设置为 2 它给出o的第二个字符,我认为编码存在问题,即 readCString 在每个字符之后看到一个空字符。知道如何解决吗?