ATL 初探com编程

首先随便写个ATL程序,版本的不断更新,编程也越来越简单,在ATL编程com程序会节省很多时间。

DLL的编写,在对应的cpp文件中,编写对应的函数,函数编写好后,使用

extern "C" __declspec(dllexport) 来声明函数, extern "C" 表示使用c语言来编译这段话,而 __declspec(dllexport)为DLL的函数导出接口,表示函数导出能被其他程序调用。



(右键项目点添加对象,然后起一个名字,然后其他选项默认,完成。

之后在类视图中点类右键,新建方法,in表示参数,retval表示返回值,设置类型和参数名,点确认。

然后找到类文件,在对应的方法上写好方法即可。简单的dll文件就是这样实现的,这里使用类,用面向对象的方法。)



调用dll:

dll的调用分为隐式调用和动态加载。隐式调用在程序运行时加载所有的dll提供的方法,内存消耗较大。而动态加载只在需要时加载dll,然后就释放掉,比较灵活。


隐式加载:

需要dll文件和lib文件。这里lib文件并非静态库的lib文件,这里的lib文件只提供了对应dll文件的一些相应方法,程序加载时是调用dll文件。


显式调用:

通过调用API函数来实现DLL的加载和卸载,能更有效的使用内存,步骤:

1.使用windows API 函数LoadLibrary 或者MFC提供的AfxLoadLibrary将dll模块映射到进程的内存空间,对dll进行动态加载。

2.使用getProcAddress函数得到要调用的dll的函数指针。

3.不用dll时,使用Free library函数或者AfxFreeLibrary函数从进程的地址空间显示的卸载dll。

代码大致如下:先声明对应函数类型的函数指针。然后使用用此函数指针去强制转换 根据函数名获得的函数地址,获得和对应类型的函数指针,然后就可以随意调用了。

这里对hDLL的加载和函数的加载进行了判断,防止出错。

	typedef int (*Add)(int a,int b);

	HINSTANCE hDLL;
	Add addfun;
	hDLL = LoadLibraryA("FisrtDLL.dll");
	addfun = (Add)GetProcAddress(hDLL,"add");
	long A = 1;
	long B = 2;
	if(hDLL){
		if(addfun)
			B = addfun(A,B);
		else
			printf("NOFOUND\n\r");
	}
	else
		printf("NOFOUND DLL\n\r");
	printf("%d",B);
	FreeLibrary(hDLL);



使用API编程时,经常遇到   "const char *" 类型的实参与 "LPCWSTR" 类型的形参不兼容,以及“LPCSTR”类型,这是由于字符集的问题,unicode和ANSI字符集,调用函数如:MessageBoxA 为使用ANSI字符集,MessageBoxW为UNICODE 字符集。

一般解决方法为:目菜单——项目属性(最后一个)——配置属性——常规——项目默认值——字符集,将使用Unicode字符集改为未设置即可。

未设置为ANSI,而一般默认设置为UNICODE。



你可能感兴趣的:(ATL 初探com编程)