关于 nodejs(ffi-napi)调用 c++ dll 的 output parameter 问题

2020-07-03 11:16:06 +08:00
 liangzimo

###第一次用 electron FFI-NPAI 调用 c++dll,遇到出参的问题,如下

调用身份证模块 函数声明:__int16 IDCard_ReadCard(HANDLE icdev,char* message); 入口参数:icdev: 通讯标识符 出口参数:message: 返回的操作信息(长度在 8 到 18 之间,定义时字节长度要大于 18 )

ELECTRON: 8.0.0 NODEJS: 12.18.0

** ffi 文档里面把 出参的 char*定义成 string,于是我这样定义 **

IDCard_ReadCard: ['int', ['int', 'string']]

** 调用 **

const readMsgBuf = new Buffer(60);
const rs = this.$idcard.IDCard_ReadCard(dev, readMsgBuf)

然而会报错 [ERR_ASSERTION]: expected a "string" as the third argument


然后也再网上搜了下其他的方案

如声明成 IDCard_ReadCard: ['int', ['int', 'char *']] 虽然不报错了,但是不能获取返回值

还有一些其他的,都不能获取到数据,请了解这个的道友指导一下,不甚感激

3339 次点击
所在节点    Node.js
9 条回复
zhuweiyou
2020-07-03 11:25:23 +08:00
没用 node 调过 DLL,因为值传递的原因,你这样并不能改变 readMsgBuf 。
以我用 java 调 DLL 的经验来说,这种情况一般传 byte[] 数组。
liangzimo
2020-07-03 11:28:46 +08:00
@zhuweiyou 官方文档是这样写的,而且 Buffer 就相当于字节数组把
ysc3839
2020-07-03 11:33:35 +08:00
这好像一搜索就能搜到呀?
https://github.com/node-ffi-napi/ref-napi
Turn Buffer instances into "pointers"
liangzimo
2020-07-03 12:36:13 +08:00
@ysc3839 兄 dei,还是没搞懂怎么弄,能给个伪代码麽,谢谢
ysc3839
2020-07-03 19:33:20 +08:00
@liangzimo 我完全没研究过 Electron……只是根据你的问题搜索了一下,感觉这个应该符合你的需求。至于要代码的话我就帮不了你了。
liangzimo
2020-07-06 09:09:48 +08:00
@ysc3839 问题解决了,还是很感谢
magicdawn
2020-07-07 11:49:04 +08:00
这有一模一样的实例 https://github.com/node-ffi/node-ffi/wiki/Node-FFI-Tutorial#output-parameters
void get_md5_string(char *out_string);
liangzimo
2020-07-07 15:08:57 +08:00
@magicdawn 嗯,之前看了这个文档,是另一个原因引起的,归根到底还是对这个不熟悉,///尴尬
kevinBon
2021-07-22 14:11:51 +08:00
你好,请问这个 dll 的函数 里面的 HANDLE 具体是什么类型,ffi-napi 要用什么类型去接收,和传入参数的?
HANDLE 可以用 long 进行接收吗?

let device = ffi.Library(pathUtil.getAppResourcePath('DK-4H1/QSApi'), {
QS_Device_Open: ['long', [ref.types.int16, 'long']]
})

HANDLE __stdcall QS_Device_Open(__int16 Port,long Baud);



var int16_with_100 = ref.alloc(ref.types.int16, 100)

var openResult = device.QS_Device_Open(int16_with_100,1)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/686794

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX