FUNCTION ulong DesEnCodeHex(string str, string key, ref string outstr) library "zm_2007.dll"
int DesEnCodeHex(const char* str,const char* key, char* outstr) ; //c 接口描述 字符指针传出
function long LIV_open(long vender,long index,ref long handle) library "living1.dll"
int LIV_open(int vender,int index, int* handle);////c 接口描述 整形指针传出。
function long LIV_get_hardware_info(long handle, ref LIV_hardware_info info) library "living1.dll"
int LIV_get_hardware_info(int handle,LIV_hardware_info info); //结构体指针传出
node.js调用动态库,采用node-ffi 模块。
1、根据参数类型声明函数。
char* => string //也可以直接用 char *
int* => ref.refType('int') //也可以直接用 int *
struct *=>ref.refType(liv_hardware_info)
struct[] *=> ref.refType(liv_hardware_info,3) //结构体数组
VOID * => ref.refType('pointer')
结构体中的参数:char* [] => refArray('byte', 8)
基本类型
基本类型已经定义在了ref.types
里,可以直接使用类型字符串或者'ref.types'中的类型对象。而对于枚举类型,简单当作int
或者uint
处理就可以了。
指针
对于指针类型,简单类型可以直接在参数列表里写int *
,pointer
这样的,生成类型的指针可以用ref.refType(type)
。在调用函数时,执行var vRef = ref.alloc(type)
得到一个引用对象,将对象传入函数即可。需要获取vRef
指向的值v
可以用var v = ref.deref(vRef)
。对字符串类型的buffer
可能需要使用ref.readCString(buffer)
来读取(它可以处理末尾的'\0'
)。
补充一点:字符集引起的中文乱码问题
默认node.js是utf8字符串,而我们的dll很多都是gbk编码,从参数的传入需要转成gbk
转码一般用这个模块,纯js版本
//开始调用。infoRef中是dll返回的gbk 数据串。
总结: 中文 传入参数需要转码成gbk ,传出参数需要转码成utf8.