arrdio提供了与C语言交互的功能,在此记录下学习笔记。
这是我个人理解的调用过程
c语言接口 ↔ aardio中间类型 ↔ aardio动态类型
c语言接口
通过封装c语言的常用函数,对外暴露出调用接口,编译成win32的dll,aardio通过动态绑定dll中的函数接口达到交互目的。
c语言标准中包含的语法结构,包括各种数据类型(整形数int,浮点数型double,字符数组类型 char[],指针类型void *,结构体类型struct,公用体类型 union等),以及调用方法(cdcel,fastcall等),函数中参数传递和返回。
win32开发中引入的扩展类型,包括(BYTE,DWORD,LPCSTR等等)
aardio中间类型
aardio的class类型,class元素的类型,raw.loadDll绑定参数的类型,操作字节的各种方法:包括各种raw库(raw.buffer,raw.convert等等),数据类型(type.pointer,type.buffer)
aardio动态类型
平常用到的动态类型(type.number,type.string),不涉及指针类型和内存操作
aardio可以方便的调用tcc,可以迅速生成dll,参考 codes\范例程序\C语言\dll.aardio ,这里直接添加作为模板
C语言基本数据类型:
下面以C语言中int类型作为测试
__declspec(dllexport) int Test_Square(int x)
{
return x * x;
}
aardio:
var dll = raw.loadDll( "/bin.dll" );
var func = dll.api( "Test_Square","int(int)", "cdecl" );
// aardio中type.number类型可以直接传入int
var result1 = func(8);
winform.msgbox((result1)) // 64
返回值和引用类型,按照 返回值,引用参数顺序 以此返回
C:
__declspec(dllexport) int Test_SwapInteger(int* x, int* y)
{
int tmp = *x;
*x = *y;
*y = tmp;
return 0;
}
aardio:
var dll = raw.loadDll( "/bin.dll" );
var func2 = dll.api( "Test_SwapInteger","int(int& x, int& y)", "cdecl" );
// 按照 返回值,引用参数顺序 以此返回
var r, o1, o2 = func2(1, 2); // 0, 2, 1
同样也适用于C语言double类型 type.number -> double
C:
__declspec(dllexport) double Test_SwapDouble(double* x, double* y)
{
double tmp = *x;
*x = *y;
*y = tmp;
return *x *y;
}
aardio:
var func2 = dll.api( "Test_SwapDouble","double(double& x, double& y)", "cdecl" );
var r, o1, o2 = func2(1.2, 2.3); // 3.5, 2.3, 1.2
C语言中回调函数
C:
__declspec(dllexport) int Test_TwoIntCallback(int(*cb)(int, int) , int x, int y)
{
int c = cb(x, y);
return c;
}
aardio函数作为回调函数传入,type.function -> type.cdata -> pointer -> void(*f)()
aardio:
var func3 = dll.api("Test_TwoIntCallback","int(pointer cb, int x, int y)", "cdecl");
var SquareSum_c = raw.tocdecl(function(a, b){
var r = a * a b * b;
return r;
},"int(int a, int b)")
winform.msgbox(type(SquareSum_c)); // cdata
var r = func3(SquareSum_c, 3, 4); // 25
winform.msgbox(r);
主题数 170 | 今日评论 0 | 今日主题 0 |