aardio 文档
aardio 范例: 调用 C 语言之弹性数组
//aardio 调用 C 语言之弹性数组
import tcc;
tcc.build( "/.flexible_array.dll").code = /**
#include <stdlib.h>
#include <string.h>
typedef struct{
int length;
char bytes[];
} TestStruct;
__declspec(dllexport) TestStruct* createTestStruct(){
TestStruct *ts = (TestStruct *) malloc (sizeof (TestStruct) + 100);
ts->length = strlen("测试一下");
strcpy(ts->bytes, "测试一下");
return ts;
}
__declspec(dllexport) void freeTestStruct(TestStruct* p){
free(p);
}
**/
//加载生成的DLL
var dll = raw.loadDll( "/.flexible_array.dll",,"cdecl" );
//方法1
var pStruct = dll.createTestStructP();
//首先得到弹性数组的长度
var length = raw.convert(pStruct,{int length}).length;
//获取弹性数组
var struct = raw.convert(pStruct,{
BYTE bytes[/*不能指定变量值*/] = [
length:length; //弹性数组的长度必须用 length 属性指定
]
},4/*raw.sizeof("int")*/);
print( string.pack( struct.bytes ) );
// 也可以这样写
// struct = raw.convert( pStruct, raw.array(length,"BYTE","bytes"),4/*raw.sizeof("int")*/ )
// 或者这样写
// var bytes = raw.convertArray(pStruct,length,"BYTE",4/*raw.sizeof("int")*/);
//也可以直接计算指针地址,直接获取数据
var offset = raw.sizeof({int length});
var str = raw.tostring(pStruct,offset+1,offset + length);
print(str);
dll.freeTestStruct(pStruct);
Markdown 格式