dll的概念dll导出变量函数类.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
dll的概念dll导出变量函数类

1、 DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数、变量或类。这些可以直接拿来使用。 静态链接库与动态链接库的区别: ? (1)静态链接库与动态链接库都是共享代码的方式。静态链接库把最后的指令都包含在最终生成的EXE文件中了;动态链接库不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。 ? (2)静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。 ? 动态链接库的分类:Visual C++支持三种DLL,它们分别是: (1)Non-MFC DLL(非MFC动态库): ?非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用; ? (2)MFC Regular DLL(MFC规则DLL): ?MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环; ? (3)MFC Extension DLL(MFC扩展DLL):MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。 ? 2、 创建一个DLL ? 2.1 非MFC的DLL ? 2.1.1声明导出函数: ? extern “C” __declspec(dllexport) int add(int a, int b); ? 其中 extern “C”为声明为C编译。由于C++编译器在编译的时候会造成其函数名的该变,在其他应用程序中导致函数不可调用,而C编译器则不会在编译后改变其函数名。这样如果用C编译的程序来调用该dll中的函数时,可能会造成找不到该函数。 ? __declspec(dllexport)表示该函数为DLL输出函数,即其他应用程序可以调用该函数 ? 从dll中声明输出函数有两种方式: (1)?用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。 (2)?用__declspec(dllexport)来声明函数 ? 如果使用Visual C++来创建dll,对于同样用VC创建的exe来说,调用dll没有什么问题。 而如果用其他工具来创建的exe来调用dll,就会出现问题。因为即使你不用C++编译器,Microsoft C编译器也会损害C函数。 当用__stdcall将函数输出时,C编译器会将函数改为_func@1的形式。在这里需要在.def文件中加入EXPORTS节来输出函数: ? EXPORTS func 这样,dll将用func函数名来输出函数。 ? 另一种方式是用#pragma (linker, “/exports:func=_func@1”),告诉编译器输出函数func,这种方式没有前一种好。 ? 如果通过VC++编写的DLL欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall方式。 WINAPI都采用这种方式,而C/C++ 缺省的调用方式却为__cdecl。__stdcall方式与__cdecl对函数名最终生成符号的方式不同。 若采用C编译方式(在C++中需将函数声明为extern C),__stdcall调用约定在输出函数名前面加下划线,后面加“@”符号和参数的字节数, 形如_functionname@number;而__cdecl调用约定仅在输出函数名前面加下划线,形如_functionname。 ? lib.def : 导出DLL函数 LIBRARY dllTest EXPORTS add @ 1 .def文件的规则为:    (1)LIBRARY语句说明.def文件相应的DLL;    (2)EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加@n,表示要导出函数的序号为n (在进行函数调用时,这个序号将发挥其作用);    (3).def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能与语句共享一行。    由此可以看出,例子中lib.def文件的含义为生成名为“dllTest”的动态链接库,导出其中的add函数,并指定add函数的序号为1。 ? 2.1.2 Dll的调用方式:? ? DLL的调用分为两种方式:动态和静态(显示动态链接和隐式动态链接) ? (1)?动态调用(显示动态链接): typedef int(*lpAddFun)(int, int); //宏定义函数指针类型 lpAddFun add;//函数指针 HINSTANCE hDll=LoadLibrary(“path”); add=(lpAddFun)GetProcAddress(hDll, add);//获得dll中

文档评论(0)

haihang2017 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档