首先随便写个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。