我正在使用 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
现在根据我的理解,该函数返回一个包含字符串地址的整数,我如何将该整数取消引用到节点中的字符串?
我找不到任何方法来设置节点中缓冲区的地址。
update
好的,我找到了如何使用以下代码读取该字符串:
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 在每个字符后面看到一个空字符。
知道如何解决这个问题吗?