(动态链接库)DLL编写与使用方法

(动态链接库)DLL编写与使用方法

ID:40486268

大小:37.00 KB

页数:6页

时间:2019-08-03

(动态链接库)DLL编写与使用方法_第1页
(动态链接库)DLL编写与使用方法_第2页
(动态链接库)DLL编写与使用方法_第3页
(动态链接库)DLL编写与使用方法_第4页
(动态链接库)DLL编写与使用方法_第5页
资源描述:

《(动态链接库)DLL编写与使用方法》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、DLL的创建与调用1、DLL的概念DLL(DynamicLinkableLibrary),动态链接库,可以向程序提供一些函数、变量或类。这些可以直接拿来使用。静态链接库与动态链接库的区别:(1)静态链接库与动态链接库都是共享代码的方式。静态链接库把最后的指令都包含在最终生成的EXE文件中了;动态链接库不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。(2)静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。动态链接库的分类:VisualC++支持三种DLL,它们分别是Non-MFCD

2、LL(非MFC动态库)、MFCRegularDLL(MFC规则DLL)、MFCExtensionDLL(MFC扩展DLL)。非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。2、创建一个DLL2.1非MFC的DLL2.1.1声明导出函数:extern“C”__declspec(dllexport)intadd(inta,intb);其中extern“C”为声明为C编译。由于C

3、++编译器在编译的时候会造成其函数名的该变,在其他应用程序中导致函数不可调用,而C编译器则不会在编译后改变其函数名。这样如果用C编译的程序来调用该dll中的函数时,可能会造成找不到该函数。__declspec(dllexport)表示该函数为DLL输出函数,即其他应用程序可以调用该函数从dll中声明输出函数有两种方式:(1)另外一种方式是采用模块定义(.def)文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。(2)用__declspec(dllexport)来声明函数如果使用VisualC++来创建dll,对于同样用VC创建的exe来说,调用dll没

4、有什么问题。而如果用其他工具来创建的exe来调用dll,就会出现问题。因为即使你不用C++编译器,MicrosoftC编译器也会损害C函数。当用__stdcall将函数输出时,C编译器会将函数改为_func@1的形式。在这里需要在.def文件中加入EXPORTS节来输出函数:EXPORTSfunc这样,dll将用func函数名来输出函数。另一种方式是用#pragma(linker,“/exports:func=_func@1”),告诉编译器输出函数func,这种方式没有前一种好。如果通过VC++编写的DLL欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall方式,

5、WINAPI都采用这种方式,而C/C++缺省的调用方式却为__cdecl。__stdcall方式与__cdecl对函数名最终生成符号的方式不同。若采用C编译方式(在C++中需将函数声明为extern"C"),__stdcall调用约定在输出函数名前面加下划线,后面加“@”符号和参数的字节数,形如_functionname@number;而__cdecl调用约定仅在输出函数名前面加下划线,形如_functionname。;lib.def:导出DLL函数LIBRARYdllTestEXPORTSadd@1.def文件的规则为:  (1)LIBRARY语句说明.def文件相应的DLL; 

6、 (2)EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加@n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用);  (3).def文件中的注释由每个注释行开始处的分号(;)指定,且注释不能与语句共享一行。  由此可以看出,例子中lib.def文件的含义为生成名为“dllTest”的动态链接库,导出其中的add函数,并指定add函数的序号为1。2.1.2Dll的调用方式:DLL的调用分为两种方式:动态和静态(1)动态调用:typedefint(*lpAddFun)(int,int);//宏定义函数指针类型lpAddFunadd;//函数

7、指针HINSTANCEhDll=LoadLibrary(“path”);add=(lpAddFun)GetProcAddress(hDll,"add");//获得dll中的add函数指针FreeLibrary(hDll);在从dll调用中返回的函数、指针或者类都是以指针的方式会的,即返回的是函数、变量或类的地址。这里一定要注意,不能简单的用函数名来赋值。(2)静态调用:将生成的.dll和.lib文件拷入到调用dll的工程中,用命令#pragmacomment(lib,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。