如何用vc创建及调用dll

上传人:自*** 文档编号:80914749 上传时间:2019-02-20 格式:DOC 页数:10 大小:54.01KB
返回 下载 相关 举报
如何用vc创建及调用dll_第1页
第1页 / 共10页
如何用vc创建及调用dll_第2页
第2页 / 共10页
如何用vc创建及调用dll_第3页
第3页 / 共10页
如何用vc创建及调用dll_第4页
第4页 / 共10页
如何用vc创建及调用dll_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《如何用vc创建及调用dll》由会员分享,可在线阅读,更多相关《如何用vc创建及调用dll(10页珍藏版)》请在金锄头文库上搜索。

1、【转】如何用VC+创建及调用DLL(2010-12-01 13:57:33) 一、前言自从微软推出16位的Windows操作系统起,此后每种版本的Windows操作系统都非常依赖于动态链接库(DLL)中的函数和数据,实际上 Windows操作系统中几乎所有的内容都由DLL以一种或另外一种形式代表着,例如显示的字体和图标存储在GDI DLL中、显示Windows桌面和处理用户的输入所需要的代码被存储在一个User DLL中、Windows编程所需要的大量的API函数也被包含在Kernel DLL中。在Windows操作系统中使用 DLL有很多优点,最主要的一点是多个应用程序、甚至是不同语言编写的

2、应用程序可以共享一个DLL文件,真正实现了资源共享,大大缩小了应用程序的执行代码,更加有效的利用了内存;使用DLL的另一个优点是DLL文件作为一个单独的程序模块,封装性、独立性好,在软件需要升级的时候,开发人员只需要修改相应的DLL文件就可以了,而且,当DLL中的函数改变后,只要不是参数的改变,程序代码并不需要重新编译。这在编程时十分有用,大大提高了软件开发和维护的效率。既然DLL那么重要,所以搞清楚什么是DLL、如何在Windows操作系统中开发使用DLL是程序开发人员不得不解决的一个问题。本文针对这些问题,通过一个简单的例子,即在一个DLL中实现比较最大、最小整数这两个简单函数,全面地解析

3、了在Visual C+编译环境下编程实现DLL的过程,文章中所用到的程序代码在Windows98系统、Visual C+6.0编译环境下通过。二、DLL的概念DLL是建立在客户/服务器通信的概念上,包含若干函数、类或资源的库文件,函数和数据被存储在一个DLL(服务器)上并由一个或多个客户导出而使用,这些客户可以是应用程序或者是其它的DLL。DLL库不同于静态库,在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为*.LIB),Visual C+的编译器在处理程序代码时将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。这个过程称为静态链接,此时因为应

4、用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB 文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL 和.LIB文件必须随应用程序一起发行,否则应用程序将

5、会产生错误。微软的Visual C+支持三种DLL,它们分别是:Non-MFC Dll(非MFC动态库)Regular Dll(常规DLL)Extension Dll(扩展DLL)。Non-MFC DLL:指的是不用MFC的类库结构,直接用C语言写的DLL,其导出的函数是标准的C接口,能被非MFC或MFC编写的应用程序所调用。Regular DLL:和下述的Extension Dlls一样,是用MFC类库编写的,它的一个明显的特点是在源文件里有一个继承CWinApp的类(注意:此类DLL虽然从CWinApp派生,但没有消息循环),被导出的函数是C函数、C+类或者C+成员函数(注意不要把术语C+

6、类与MFC的微软基础C+类相混淆),调用常规DLL的应用程序不必是MFC应用程序,只要是能调用类C函数的应用程序就可以,它们可以是在Visual C+、Dephi、Visual Basic、Borland C等编译环境下利用DLL开发应用程序。常规DLL又可细分成静态链接到MFC和动态链接到MFC上的,这两种常规DLL的区别将在下面介绍。与常规DLL相比,使用扩展DLL用于导出增强MFC基础类的函数或子类,用这种类型的动态链接库,可以用来输出一个从MFC所继承下来的类。Extension Dll:扩展DLL是使用MFC的动态链接版本所创建的,并且它只被用MFC类库所编写的应用程序所调用。例如你

7、已经创建了一个从MFC的CtoolBar类的派生类用于创建一个新的工具栏,为了导出这个类,你必须把它放到一个MFC扩展的DLL中。扩展DLL 和常规DLL不一样,它没有一个从CWinApp继承而来的类的对象,所以,开发人员必须在DLL中的DllMain函数添加初始化代码和结束代码。三、动态链接库的创建在Visual C+6.0开发环境下,打开FileNewProject选项,可以选择Win32 Dynamic-Link Library或MFC AppWizarddll来以不同的方式来创建Non-MFC Dll、Regular Dll、Extension Dll等不同种类的动态链接库。1 Win

8、32 Dynamic-Link Library方式创建Non-MFC DLL动态链接库 每一个DLL必须有一个入口点,这就象我们用C编写的应用程序一样,必须有一个WINMAIN函数一样。在Non-MFC DLL中DllMain是一个缺省的入口函数,你不需要编写自己的DLL入口函数,用这个缺省的入口函数就能使动态链接库被调用时得到正确的初始化。如果应用程序的DLL需要分配额外的内存或资源时,或者说需要对每个进程或线程初始化和清除操作时,需要在相应的DLL工程的.CPP文件中对 DllMain()函数按照下面的格式书写。BOOL APIENTRY DllMain(HANDLE hModule,DW

9、ORD ul_reason_for_call,LPVOID lpReserved)switch( ul_reason_for_call )case DLL_PROCESS_ATTACH:.case DLL_THREAD_ATTACH:.case DLL_THREAD_DETACH:.case DLL_PROCESS_DETACH:.return TRUE;参数中:hMoudle:是动态库被调用时所传递来的一个指向自己的句柄(实际上,它是指向_DGROUP段的一个选择符);ul_reason_for_call:是一个说明动态库被调原因的标志,当进程或线程装入或卸载动态链接库的时候,操作系统调用入

10、口函数,并说明动态链接库被调用的原因,它所有的可能值为: DLL_PROCESS_ATTACH: 进程被调用 DLL_THREAD_ATTACH: 线程被调用 DLL_PROCESS_DETACH: 进程被停止 DLL_THREAD_DETACH: 线程被停止lpReserved :为保留参数。到此为止,DLL的入口函数已经写了,剩下部分的实现也不难,你可以在DLL工程中加入你所想要输出的函数或变量了。 我们已经知道DLL是包含若干个函数的库文件,应用程序使用DLL中的函数之前,应该先导出这些函数,以便供给应用程序使用。要导出这些函数有两种方法,一是在定义函数时使用导出关键字_declspec

11、(dllexport),另外一种方法是在创建DLL文件时使用模块定义文件.Def。需要读者注意的是在使用第一种方法的时候,不能使用DEF文件。下面通过两个例子来说明如何使用这两种方法创建DLL文件。1)使用导出函数关键字_declspec(dllexport)创建MyDll.dll,该动态链接库中有两个函数,分别用来实现得到两个数的最大和最小数。在MyDll.h和MyDLL.cpp文件中分别输入如下原代码:/MyDLL.hextern C _declspec(dllexport) int Max(int a, int b);extern C _declspec(dllexport) int M

12、in(int a, int b);/MyDll.cppincludeincludeMyDll.hint Max(int a, int b)if(a=b)return a;elsereturn b;int Min(int a, int b)if(a=b)return b;elsereturn a;该动态链接库编译成功后,打开MyDll工程中的debug目录,可以看到MyDll.dll、MyDll.lib两个文件。LIB文件中包含DLL文件名和DLL文件中的函数名等,该LIB文件只是对应该DLL文件的映像文件,与DLL文件中,LIB文件的长度要小的多,在进行隐式链接DLL时要用到它。读者可能已经注

13、意到在MyDll.h中有关键字extern C,它可以使其他编程语言访问你编写的DLL中的函数。2)用.def文件创建工程MyDll为了用.def文件创建DLL,请先删除上个例子创建的工程中的MyDll.h文件,保留MyDll.cpp并在该文件头删除include MyDll.h语句,同时往该工程中加入一个文本文件,命名为MyDll.def。一个.def文件中只有两个必需的部分:LIBRARY 和 EXPORTS。在该文件中加入如下代码:LIBRARY MyDllEXPORTSMaxMin其中LIBRARY语句说明该def文件是属于相应DLL的(在这里是指属于MyDLL.DLL的),EXPOR

14、TS语句下列出要导出的函数名称。我们可以在.def文件中的导出函数后加 n,如Max1,Min2,表示要导出的函数顺序号,在进行显式连时可以用到它。该DLL编译成功后,打开工程中的Debug目录,同样也会看到 MyDll.dll和MyDll.lib文件。注:_declspec(dllexport)和.def文件这两种方式不能同时使用。2MFC AppWizarddll方式生成常规/扩展DLL 在MFC AppWizarddll下生成DLL文件又有三种方式,在创建DLL时,要根据实际情况选择创建DLL的方式。一种是常规DLL静态链接到MFC,另一种是常规DLL动态链接到MFC。两者的区别是:前者

15、使用的是MFC的静态链接库,生成的DLL文件长度大,一般不使用这种方式,后者使用MFC的动态链接库,生成的DLL文件长度小;动态链接到MFC的规则DLL所有输出的函数应该以如下语句开始:AFX_MANAGE_STATE(AfxGetStaticModuleState( ) /此语句用来正确地切换MFC模块状态 最后一种是MFC扩展DLL,这种DLL特点是用来建立MFC的派生类,Dll只被用MFC类库所编写的应用程序所调用。前面我们已经介绍过,Extension DLLs 和Regular DLLs不一样,它没有一个从CWinApp继承而来的类的对象,编译器默认了一个DLL入口函数DLLMain()作为对DLL的初始化,你可以在此函数中实现初始化,代码如下:BOOL WINAPI APIENTRY DLLMain(HINSTANCE hinstDll,DWORD reason ,LPVOID flmpload)switch(reason)/初始化代码;return true;参数hinstDll存放DLL的句柄,参数reason指明调用函数的原因,lpReserv

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号