C语言交互之调用dll

admin2021-10-28  780

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);
转载请注明原文地址: https://seopai.com/read-256.html
最新回复(0)
aardio问答
aardio编程语言