在JS调用很少有调用指针的地方,但是当直接调用DLL库时,需要用到相关指针。
有char* , void* ,int* struct * 函数指针,指针的指针….等。
1. char *
如下为char * 类型,没有实际的内存地址。就等价于char *.
var m_char = ref.refType('char');
如下为实际的char *地址,先申请内存,然后进行取地址操作。
var m_data = ref.alloc('char');
var m_charPtr = m_data.ref();
2. void *
如下为void* 类型,没有实际的内存地址。就等价于void*.
var m_char = ref.refType('void');
如下为实际的void *地址,先申请内存,然后进行取地址操作。
var m_data = ref.alloc('void');
var m_voidPtr = m_data.ref();
3. int *
int 指针和char 的用法一致。
4. struct *
结构体指针为对结构体的引用。
定义结构体需要先引用ref-Struct模块。
var Struct = require("ref-Struct);
先声明结构体
var m_Struct = Struct({ 'arg1':'int', 'arg2':'int' });
定义一个结构体变量,赋值
var m_StructValue = new m_Struct();
m_StructValue.arg1 = 1;
m_StructValue.arg2 = 2;
取地址
var m_StructPtr = m_StructValue.ref();
5. 函数指针
在JS 中,其实函数名就是一个函数指针。可以直接拿来用。
例如我声明一个回调函数
var dll = require("ffi");
var callBack = dll.callback('bool',['pointer','int','int'],Fun_callback);
其中Fun_callback为函数指针。
可以如下方式来实现
function Fun_callback() { console.log("this is callback!"); }
6. 指针的指针
指针的指针是一个比较绕口的东西。
可以这样理解: 指针1 指向 地址1 , 指针2 指向地址2 ,而地址2的值就是指针1。 那么指针2就是一个指针的指针,也可以称之为二维指针。
先声明一个void *指针
var m_Hand = ref.alloc('void');
var HAND= m_Hand.ref();
再取指针的地址
var ptr = HAND.ref();