我正在使用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());
...
现在,我尝试使用以下节点代码访问dll的CIDR_Info
功能:
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的编码存在问题在每个字符之后看到一个空字符。
知道如何解决吗?