VC++动态链接库(DLL)非MFC DLL介绍.docVIP

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
VC++动态链接库(DLL)非MFC DLL介绍 4.1一个简单的DLL   第2节给出了以静态链接库方式提供add函数接口的方法,接下来我们来看看怎样用动态链接库实现一个同样功能的add函数。   如图6,在VC++中new一个Win32 Dynamic-Link Library工程dllTest(单击此处下载本工程附件)。注意不要选择MFC AppWizard(dll),因为用MFC AppWizard(dll)建立的将是第5、6节要讲述的MFC 动态链接库。   图6 建立一个非MFC DLL   在建立的工程中添加lib.h及lib.cpp文件,源代码如下:   /**//* 文件名:lib.h */   #ifndef LIB_H   #define LIB_H   extern C int __declspec(dllexport)add(int x, int y);   #endif   /**//* 文件名:lib.cpp */   #include lib.h   int add(int x, int y)   {   return x + y;   } 与第2节对静态链接库的调用相似,我们也建立一个与DLL工程处于同一工作区的应用工程dllCall,它调用DLL中的函数add,其源代码如下:   #include stdio.h   #include windows.h   typedef int(*lpAddFun)(int, int); //宏定义函数指针类型   int main(int argc, char *argv[])   {   HINSTANCE hDll; //DLL句柄   lpAddFun addFun; //函数指针   hDll = LoadLibrary(..DebugdllTest.dll);   if (hDll != NULL)   {   addFun = (lpAddFun)GetProcAddress(hDll, add);   if (addFun != NULL)   {   int result = addFun(2, 3);   printf(%d, result);   }   FreeLibrary(hDll);   }   return 0;   }   分析上述代码,dllTest工程中的lib.cpp文件与第2节静态链接库版本完全相同,不同在于lib.h对函数add的声明前面添加了__declspec(dllexport)语句。这个语句的含义是声明函数add为DLL的导出函数。DLL内的函数分为两种:   (1)DLL导出函数,可供应用程序调用;   (2) DLL内部函数,只能在DLL程序使用,应用程序无法调用它们。 而应用程序对本DLL的调用和对第2节静态链接库的调用却有较大差异,下面我们来逐一分析。   首先,语句typedef int ( * lpAddFun)(int,int)定义了一个与add函数接受参数类型和返回值均相同的函数指针类型。随后,在main函数中定义了lpAddFun的实例addFun;   其次,在函数main中定义了一个DLL HINSTANCE句柄实例hDll,通过Win32 Api函数LoadLibrary动态加载了DLL模块并将DLL模块句柄赋给了hDll;   再次,在函数main中通过Win32 Api函数GetProcAddress得到了所加载DLL模块中函数add的地址并赋给了addFun。经由函数指针addFun进行了对DLL中add函数的调用;   最后,应用工程使用完DLL后,在函数main中通过Win32 Api函数FreeLibrary释放了已经加载的DLL模块。   通过这个简单的例子,我们获知DLL定义和调用的一般概念:   (1)DLL中需以某种特定的方式声明导出函数(或变量、类);   (2)应用工程需以某种特定的方式调用DLL的导出函数(或变量、类)。   下面我们来对“特定的方式进行”阐述。   4.2 声明导出函数   DLL中导出函数的声明有两种方式:一种为4.1节例子中给出的在函数声明中加上__declspec(dllexport),这里不再举例说明;另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。   下面的代码演示了怎样同.def文件将函数add声明为DLL导出函数(需在dllTest工程中添加lib.def文件):   ; lib.def : 导出DLL函数   LIBRARY dllTest   EXPORTS   add @ 1   .def文件的规则为:   (1)LIBRARY语句说明.def

文档评论(0)

勤能补拙 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档