⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 如何在vc++6_0中使用动态连接库中级乐园编程技术it与数码uum社区.htm

📁 从网上下载的关于学习动态链接库的连载教程
💻 HTM
📖 第 1 页 / 共 5 页
字号:
                    <TR vAlign=top height=100>
                      <TD style="WIDTH: 600px; WORD-BREAK: break-all" 
                        colSpan=3><SPAN 
                        id=lblSubjectContents>动态链接库的创建<BR>&gt;&gt;&gt;&gt;在Visual 
                        C++6.0开发环境下,打开FileNewProject选项,可以选择Win32 Dynamic-Link 
                        Library或MFC AppWizard[dll]来以不同的方式来创建Non-MFC Dll、Regular 
                        Dll、Extension Dll等不同种类的动态链接库。<BR>&gt;&gt;&gt;&gt;1. 
                        Win32 Dynamic-Link Library方式创建Non-MFC 
                        DLL动态链接库<BR>&gt;&gt;&gt;&gt;每一个DLL必须有一个入口点,这就象我们用C编写的应用程序一样,必须有一个WINMAIN函数一样。在Non-MFC 
                        DLL中DllMain是一个缺省的入口函数,你不需要编写自己的DLL入口函数,用这个缺省的入口函数就能使动态链接库被调用时得到正确的初始化。如果应用程序的DLL需要分配额外的内存或资源时,或者说需要对每个进程或线程初始化和清除操作时,需要在相应的DLL工程的.CPP文件中对DllMain()函数按照下面的格式书写。<BR>&gt;&gt;<BR>&gt;&gt;<BR>BOOL 
                        APIENTRY DllMain(HANDLE hModule,DWORD 
                        ul_reason_for_call,LPVOID lpReserved)<BR>{<BR>switch( 
                        ul_reason_for_call )<BR>{<BR>case 
                        DLL_PROCESS_ATTACH:<BR>.......<BR>case 
                        DLL_THREAD_ATTACH:<BR>.......<BR>case 
                        DLL_THREAD_DETACH:<BR>.......<BR>case 
                        DLL_PROCESS_DETACH:<BR>.......<BR>}<BR>return 
                        TRUE;<BR>}<BR><BR>&gt;&gt;&gt;&gt;参数中,hMoudle是动态库被调用时所传递来的一个指向自己的句柄(实际上,它是指向_DGROUP段的一个选择符);ul_reason_for_call是一个说明动态库被调原因的标志,当进程或线程装入或卸载动态链接库的时候,操作系统调用入口函数,并说明动态链接库被调用的原因,它所有的可能值为:DLL_PROCESS_ATTACH: 
                        进程被调用、DLL_THREAD_ATTACH: 线程被调用、DLL_PROCESS_DETACH: 
                        进程被停止、DLL_THREAD_DETACH: 
                        线程被停止;lpReserved为保留参数。到此为止,DLL的入口函数已经写了,剩下部分的实现也不难,你可以在DLL工程中加入你所想要输出的函数或变量了。<BR>&gt;&gt;&gt;&gt;我们已经知道DLL是包含若干个函数的库文件,应用程序使用DLL中的函数之前,应该先导出这些函数,以便供给应用程序使用。要导出这些函数有两种方法,一是在定义函数时使用导出关键字_declspec(dllexport),另外一种方法是在创建DLL文件时使用模块定义文件.Def。需要读者注意的是在使用第一种方法的时候,不能使用DEF文件。下面通过两个例子来说明如何使用这两种方法创建DLL文件。<BR>&gt;&gt;&gt;&gt;1)使用导出函数关键字_declspec(dllexport)创建MyDll.dll,该动态链接库中有两个函数,分别用来实现得到两个数的最大和最小数。在MyDll.h和MyDLL.cpp文件中分别输入如下原代码:<BR>&gt;&gt;<BR>//MyDLL.h<BR>extern 
                        'C' _declspec(dllexport) int Max(int a, int 
                        b);<BR>extern 'C' _declspec(dllexport) int Min(int a, 
                        int 
                        b);<BR>//MyDll.cpp<BR>#include<BR>#include'MyDll.h'<BR>int 
                        Max(int a, int b)<BR>{<BR>if(a&gt;=b)return 
                        a;<BR>else<BR>return b;<BR>}<BR>int Min(int a, int 
                        b)<BR>{<BR>if(a&gt;=b)return b;<BR>else<BR>return 
                        a;<BR>}<BR><BR>&gt;&gt;&gt;&gt;该动态链接库编译成功后,打开MyDll工程中的debug目录,可以看到MyDll.dll、MyDll.lib两个文件。LIB文件中包含DLL文件名和DLL文件中的函数名等,该LIB文件只是对应该DLL文件的'映像文件',与DLL文件中,LIB文件的长度要小的多,在进行隐式链接DLL时要用到它。读者可能已经注意到在MyDll.h中有关键字'extern 
                        C',它可以使其他编程语言访问你编写的DLL中的函数。<BR>&gt;&gt;&gt;&gt;2)用.def文件创建工程MyDll<BR>&gt;&gt;&gt;&gt;为了用.def文件创建DLL,请先删除上个例子创建的工程中的MyDll.h文件,保留MyDll.cpp并在该文件头删除#include 
                        MyDll.h语句,同时往该工程中加入一个文本文件,命名为MyDll.def,再在该文件中加入如下代码:<BR>LIBRARY 
                        MyDll<BR>EXPORTS<BR>Max<BR>Min<BR>&gt;&gt;&gt;&gt;其中LIBRARY语句说明该def文件是属于相应DLL的,EXPORTS语句下列出要导出的函数名称。我们可以在.def文件中的导出函数后加@n,如Max@1,Min@2,表示要导出的函数顺序号,在进行显式连时可以用到它。该DLL编译成功后,打开工程中的Debug目录,同样也会看到MyDll.dll和MyDll.lib文件。<BR>&gt;&gt;&gt;&gt;2.MFC 
                        AppWizard[dll]方式生成常规/扩展DLL<BR>&gt;&gt;&gt;&gt;在MFC 
                        AppWizard[dll]下生成DLL文件又有三种方式,在创建DLL是,要根据实际情况选择创建DLL的方式。一种是常规DLL静态链接到MFC,另一种是常规DLL动态链接到MFC。两者的区别是:前者使用的是MFC的静态链接库,生成的DLL文件长度大,一般不使用这种方式,后者使用MFC的动态链接库,生成的DLL文件长度小;动态链接到MFC的规则DLL所有输出的函数应该以如下语句开始: 
                        <BR>&gt;&gt;<BR>AFX_MANAGE_STATE(AfxGetStaticModuleState( 
                        )) 
                        //此语句用来正确地切换MFC模块状态<BR><BR>&gt;&gt;&gt;&gt;最后一种是MFC扩展DLL,这种DLL特点是用来建立MFC的派生类,Dll只被用MFC类库所编写的应用程序所调用。前面我们已经介绍过,Extension 
                        DLLs 和Regular 
                        DLLs不一样,它没有一个从CWinApp继承而来的类的对象,编译器默认了一个DLL入口函数DLLMain()作为对DLL的初始化,你可以在此函数中实现初始化,代码如下:<BR>&gt;&gt;<BR>BOOL 
                        WINAPI APIENTRY DLLMain(HINSTANCE hinstDll,DWORD reason 
                        ,LPVOID 
                        flmpload)<BR>{<BR>switch(reason)<BR>{<BR>……………//初始化代码;<BR>}<BR>return 
                        true;<BR>}<BR><BR>&gt;&gt;&gt;&gt;参数hinstDll存放DLL的句柄,参数reason指明调用函数的原因,lpReserved是一个被系统所保留的参数。对于隐式链接是一个非零值,对于显式链接值是零。<BR>&gt;&gt;&gt;&gt;在MFC下建立DLL文件,会自动生成def文件框架,其它与建立传统的Non-MFC 
                        DLL没有什么区别,只要在相应的头文件写入关键字_declspec(dllexport)函数类型和函数名等,或在生成的def文件中EXPORTS下输入函数名就可以了。需要注意的是在向其它开发人员分发MFC扩展DLL 
                        时,不要忘记提供描述DLL中类的头文件以及相应的.LIB文件和DLL本身,此后开发人员就能充分利用你开发的扩展DLL了。<BR>四、动态链接库DLL的链接<BR>&gt;&gt;&gt;&gt;应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接。在使用DLL之前首先要知道DLL中函数的结构信息。Visual 
                        C++6.0在VCin目录下提供了一个名为Dumpbin.exe的小程序,用它可以查看DLL文件中的函数结构。另外,Windows系统将遵循下面的搜索顺序来定位DLL: 
                        1.包含EXE文件的目录,2.进程的当前工作目录, 3.Windows系统目录, 
                        4.Windows目录,5.列在Path环境变量中的一系列目录。<BR>&gt;&gt;&gt;&gt;1.隐式链接<BR>&gt;&gt;&gt;&gt;隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当中。实现隐式链接很容易,只要将导入函数关键字_declspec(dllimport)函数名等写到应用程序相应的头文件中就可以了。下面的例子通过隐式链接调用MyDll.dll库中的Min函数。首先生成一个项目为TestDll,在DllTest.h、DllTest.cpp文件中分别输入如下代码:<BR>&gt;&gt;<BR>&gt;&gt;<BR>//Dlltest.h<BR>#pragma 
                        comment(lib,'MyDll.lib')<BR>extern 
                        'C'_declspec(dllimport) int Max(int a,int b);<BR>extern 
                        'C'_declspec(dllimport) int Min(int a,int 
                        b);<BR>//TestDll.cpp<BR>#include<BR>#include'Dlltest.h'<BR>void 
                        main()<BR>{int a;<BR>a=min(8,10)<BR>printf('比较的结果为%d 
                        ',a);<BR>}<BR>&gt;&gt;<BR><BR>&gt;&gt;&gt;&gt;在创建DllTest.exe文件之前,要先将MyDll.dll和MyDll.lib拷贝到当前工程所在的目录下面,也可以拷贝到windows的System目录下。如果DLL使用的是def文件,要删除TestDll.h文件中关键字extern 
                        'C'。TestDll.h文件中的关键字Progam commit是要Visual 
                        C+的编译器在link时,链接到MyDll.lib文件,当然,开发人员也可以不使用#pragma 
                        comment(lib,'MyDll.lib')语句,而直接在工程的Setting-&gt;Link页的Object/Moduls栏填入MyDll.lib既可。<BR>&gt;&gt;&gt;&gt;2.显式链接<BR>&gt;&gt;&gt;&gt;显式链接是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件,这是隐式链接所无法作到的,所以显式链

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -