版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、VC+动态链接库动态链接库(DLL)编程编程1.概论概论 先来论述一下先来论述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。接拿来用的变量、函数或类。在仓库的开展史上经历了在仓库的开展史上经历了“无库静态链无库静态链接库动态链接库的时代。接库动态链接库的时代。 对动态链接库,需建立如下概念:对动态链接库,需建立如下概念: 1与详细的编程语言及编译器无关与详细的编程语言及编译器无关 只要遵循约定的只要遵循约定的DLL接口规范和调用方接口规
2、范和调用方式,用各种语言编写的式,用各种语言编写的DLL都可以互相都可以互相调用。调用。譬如譬如Windows提供的系统提供的系统DLL其中包其中包括了括了Windows的的API,在任何开发环境,在任何开发环境中都能被调用,不在乎其是中都能被调用,不在乎其是Visual Basic、Visual C+还是还是Delphi。 2动态链接库随处可见动态链接库随处可见 在在Windows目录下的目录下的system32文件夹中文件夹中会看到会看到kernel32.dll、user32.dll和和gdi32.dll,windows的大多数的大多数API都包含都包含在这些在这些DLL中。中。kerne
3、l32.dll中的函数主要处置内存管理中的函数主要处置内存管理和进程调度;和进程调度;user32.dll中的函数主要控制用户界面中的函数主要控制用户界面(MessageBox函数函数);gdi32.dll中的函数那么负责图形方面的操中的函数那么负责图形方面的操作。作。 (3)VC动态链接库的分类动态链接库的分类Visual C+支持三种支持三种DLL,它们分别是非,它们分别是非MFC动动态库、态库、MFC规那么规那么DLL、MFC Extension DLL。 非非MFC动态库不采用动态库不采用MFC类库构造,其导出函类库构造,其导出函数为规范的数为规范的C接口,能被非接口,能被非MFC或或
4、MFC编写的应编写的应用程序所调用;用程序所调用;MFC规那么规那么DLL 包含一个继承自包含一个继承自CWinApp的类,的类,但其无消息循环;但其无消息循环;MFC扩展扩展DLL采用采用MFC的动态链接版本创建,的动态链接版本创建,它只能被用它只能被用MFC类库所编写的应用程序所调用。类库所编写的应用程序所调用。 2.静态链接库静态链接库 在在VC+6.0中中new一个名称为一个名称为libTest的的static library工程工程,并新建并新建lib.h和和lib.cpp两个文件,两个文件,lib.h和和lib.cpp的源代码的源代码如下:如下: /文件:文件:lib.h #ifn
5、def LIB_H #define LIB_H extern C int add(int x,int y);/声明为声明为C编译、连编译、连接方式的外部函数接方式的外部函数 #endif /文件:文件:lib.cpp #include lib.h int add(int x,int y) return x + y; #include #include .lib.h #pragma comment( lib, .debuglibTest.lib ) /指定与静态库指定与静态库一起连接一起连接 int main(int argc, char* argv) printf( 2 + 3 = %d, a
6、dd( 2, 3 ) ); 选择选择tools、options、directories、library files菜单菜单或选项,填入库文件途径或选项,填入库文件途径 4.非非MFC DLL 在建立的工程中添加在建立的工程中添加lib.h及及lib.cpp文件,源代码文件,源代码如下:如下:/* 文件名:文件名:lib.h*/#ifndef LIB_H#define LIB_Hextern C int _declspec(dllexport)add(int x, int y);#endif/* 文件名:文件名:lib.cpp*/#include lib.hint add(int x, int
7、y)return x + y;dllCall #include #include 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)
8、int result = addFun(2, 3); printf(%d, result); FreeLibrary(hDll); return 0;DLL的调用和静态链接库的调用有较大差别的调用和静态链接库的调用有较大差别 首先,语句首先,语句typedef int ( * lpAddFun)(int,int)定义了一个与定义了一个与add函数接受参数类型和返回值均一样的函数指针类型。随函数接受参数类型和返回值均一样的函数指针类型。随后,在后,在main函数中定义了函数中定义了lpAddFun的实例的实例addFun;其次,在函数其次,在函数main中定义了一个中定义了一个DLL HINST
9、ANCE句柄实句柄实例例hDll,通过,通过Win32 Api函数函数LoadLibrary动态加载了动态加载了DLL模块并将模块并将DLL模块句柄赋给了模块句柄赋给了hDll;再次,在函数再次,在函数main中通过中通过Win32 Api函数函数GetProcAddress得得到了所加载到了所加载DLL模块中函数模块中函数add的地址并赋给了的地址并赋给了addFun。经由函数指针经由函数指针addFun进展了对进展了对DLL中中add函数的调用;函数的调用;最后,应用工程使用完最后,应用工程使用完DLL后,在函数后,在函数main中通过中通过Win32 Api函数函数FreeLibrary
10、释放了已经加载的释放了已经加载的DLL模块。模块。声明导出函数声明导出函数 DLL中导出函数的声明有两种方式:中导出函数的声明有两种方式:一种为给出的在函数声明中加上一种为给出的在函数声明中加上_declspec(dllexport);一种方式是采用模块定义一种方式是采用模块定义(.def) 文件声明文件声明;在在DLL中想要中想要export的函数和数据定义的函数和数据定义前添加前添加_declspecdllexport关键字关键字对于函数和变量定义,加在最前面;对于函数和变量定义,加在最前面;对于对于class定义,加在定义,加在class关键字后关键字后;_declspec(dllexp
11、ort) void ShowDlg(void)class _declspec(dllexport) class_name /导导出类出类 这样该函数和数据就会被添加到这样该函数和数据就会被添加到ET中。中。使用这种方法函数将按名字使用这种方法函数将按名字export。_declspec(dllexport)(.def) 文件声明文件声明 为为DLL创建一个创建一个.DEF文件模块定义文件模块定义文件,并在文件,并在build该该DLL时使用这时使用这个个.DEF文件。使用这种方法使你可以文件。使用这种方法使你可以将函数按序号将函数按序号export。 在在LINK选项卡中假设:选项卡中假设:
12、/def:lib.def 将将lib.def参与到工程中。参与到工程中。lib.def; lib.def : 导出导出DLL函数函数LIBRARY dllTestEXPORTSadd 1.def文件的规那么为:文件的规那么为:(1)LIBRARY语句说明语句说明.def文件相应的文件相应的DLL;(2)EXPORTS语句后列出要导出函数的名称。语句后列出要导出函数的名称。可以在可以在.def文件中的导出函数名后加文件中的导出函数名后加n,表示要导,表示要导出函数的序号为出函数的序号为n在进展函数调用时,这个序号在进展函数调用时,这个序号将发挥其作用;将发挥其作用;(3).def 文件中的注释由
13、每个注释行开场处的文件中的注释由每个注释行开场处的分号分号 (;) 指定,且注释不能与语句共享一行。指定,且注释不能与语句共享一行。库的调试与查看库的调试与查看 动态链接库中的导出接口可以使用动态链接库中的导出接口可以使用Visual C+的的Depends工具进展查看,工具进展查看,用用Depends翻开系统目录中的翻开系统目录中的MouseHook.dll .DLL的调用方式的调用方式 隐式调用隐式调用: 将将DLL工程生成的工程生成的.lib文件和文件和.dll文件拷文件拷入当前工程所在的目录,并在入当前工程所在的目录,并在*.cpp文文件的顶部添加:件的顶部添加: #pragma co
14、mment(lib,RegularDll.lib) OR动态调用动态调用特点特点:是完全由编程者用是完全由编程者用 API 函数加载和函数加载和卸载卸载 DLL,程序员可以决定,程序员可以决定 DLL 文件文件何时加载或不加载,显式链接在运行时何时加载或不加载,显式链接在运行时决定加载哪个决定加载哪个 DLL 文件。文件。dllTest.dll 在建立的工程中添加在建立的工程中添加lib.h及及lib.cpp文件,源代码如下:文件,源代码如下:/* 文件名:文件名:lib.h*/#ifndef LIB_H#define LIB_Hextern C int _declspec(dllexport
15、)add(int x, int y);#endif/* 文件名:文件名:lib.cpp*/#include lib.hint add(int x, int y)return x + y;调用调用 dllTest.dll #include #include typedef int(*lpAddFun)(int, int); /宏定义函数指针类型宏定义函数指针类型int main(int argc, char *argv) HINSTANCE hDll; /DLL句柄句柄 lpAddFun addFun; /函数指针函数指针hDll = LoadLibrary(.DebugdllTest.dll)
16、;if (hDll != NULL) addFun = (lpAddFun)GetProcAddress(hDll, add);if (addFun != NULL)int result = addFun(2, 3);printf(%d, result);FreeLibrary(hDll); DLL的的Export和和Import DLL的的export是指将是指将DLL中的函数和数据输出中的函数和数据输出到其它程式中,以供其使用。到其它程式中,以供其使用。DLL的的import是是指使用指使用DLL的程式引入的程式引入DLL中的函数和数据。中的函数和数据。DLL的的export DLL中包含
17、有一个表,称为中包含有一个表,称为export table以下简称以下简称ET,其中包含了,其中包含了DLL中可以被外部程式使用的所有函数和数据中可以被外部程式使用的所有函数和数据的名字。的名字。只要记录在只要记录在ET中的函数和数据才可以被外部中的函数和数据才可以被外部程式所使用假如没有程式所使用假如没有.DEF文件的话,其它文件的话,其它所有没有记录在所有没有记录在ET中的函数和数据都被视为中的函数和数据都被视为是是DLL私有的。私有的。DllMain函数函数 Windows在加载在加载DLL的时候,需要一个入口函的时候,需要一个入口函数,就好像控制台或数,就好像控制台或DOS程序需要程序
18、需要main函数、函数、WIN32程序需要程序需要WinMain函数一样。函数一样。在前面的例子中,在前面的例子中,DLL并没有提供并没有提供DllMain函函数,应用工程也能胜利引用数,应用工程也能胜利引用DLL,这是因为,这是因为Windows在找不到在找不到DllMain的时候,系统会从的时候,系统会从其它运行库中引入一个不做任何操作的缺省其它运行库中引入一个不做任何操作的缺省DllMain函数版本,并不意味着函数版本,并不意味着DLL可以放弃可以放弃DllMain函数。函数。 BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_
19、for_call, LPVOID lpReserved) DllMain函数在函数在DLL被加载和卸载时被调用,在单个线程启动和终止时,被加载和卸载时被调用,在单个线程启动和终止时,DLLMain函数也被调用函数也被调用; ul_reason_for_call指明了被调用的原因。原因共有指明了被调用的原因。原因共有4种,即种,即PROCESS_ATTACH、PROCESS_DETACH、THREAD_ATTACH和和THREAD_DETACH,以,以switch语句列出。语句列出。DLL导出变量导出变量 /* 文件名:文件名:lib.h*/#ifndef LIB_H#define LIB_He
20、xtern int dllGlobalVar;#endif/* 文件名:文件名:lib.cpp */#include lib.h#include int dllGlobalVar;BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) dllGlobalVar = 100; /在在dll被加载时,赋全局变量为被加载时,赋全局变量为100 return TRUE;文件名:文件名:lib.def;在在DLL中导出变量中导出变量LIBRARY dllTestEXPORTSdllGlobalV
21、ar DATA 在主函数中引用在主函数中引用DLL中定义的全局变量:中定义的全局变量:#include #pragma comment(lib,dllTest.lib)extern int _declspec(dllimport) dllGlobalVar; /用用_declspec(dllimport)导入导入int main(int argc, char *argv)printf(%d , dllGlobalVar);dllGlobalVar = 1; printf(%d , dllGlobalVar);return 0;特别要注意特别要注意用用extern int dllGlobalVa
22、r声明所导入的并不是声明所导入的并不是DLL中全局变量自身,而是其地址,应用程序中全局变量自身,而是其地址,应用程序必需通过强迫指针转换来使用必需通过强迫指针转换来使用DLL中的全局变中的全局变量。这一点,从量。这一点,从*(int*)dllGlobalVar可以看出。可以看出。因而在采用这种方式引用因而在采用这种方式引用DLL全局变量时,千全局变量时,千万不要进展这样的赋值操作:万不要进展这样的赋值操作:dllGlobalVar = 1;MFC规那么规那么DLL MFC规那么规那么DLL的概念表达在两方面:的概念表达在两方面:它是它是MFC的的 “是是MFC的意味着可以在这种的意味着可以在这
23、种DLL的内部使的内部使用用MFC;它是规那么的它是规那么的 “是规那么的意味着它不同于是规那么的意味着它不同于MFC扩展扩展DLL,在在MFC规那么规那么DLL的内部虽然可以使用的内部虽然可以使用MFC,但是其与应用程序的接口不能是但是其与应用程序的接口不能是MFC。而。而MFC扩展扩展DLL与应用程序的接口可以是与应用程序的接口可以是MFC,可以从可以从MFC扩展扩展DLL中导出一个中导出一个MFC类的派类的派生类。生类。Regular DLL可以被所有支持可以被所有支持DLL技术的语言技术的语言所编写的应用程序调用,当然也包括使用所编写的应用程序调用,当然也包括使用MFC的应用程序。的应
24、用程序。 Regular DLL分为两类:分为两类: 1静态链接到静态链接到MFC 的规那么的规那么DLL 静态链接到静态链接到MFC的规那么的规那么DLL与与MFC库包括库包括MFC扩展扩展 DLL静态链接,将静态链接,将MFC库的代码直接生成在库的代码直接生成在.dll文件中。文件中。在调用这种在调用这种DLL的接口时,的接口时,MFC使用使用DLL的资源。因而,的资源。因而,在静态链接到在静态链接到MFC 的规那么的规那么DLL中不需要进展模块状态的中不需要进展模块状态的切换。切换。 使用这种方法生成的规那么使用这种方法生成的规那么DLL其程序较大,也可能包含反其程序较大,也可能包含反复
25、的代码。复的代码。 2动态链接到动态链接到MFC 的规那么的规那么DLL 动态链接到动态链接到MFC 的规那么的规那么DLL 可以和使用它的可执行文件可以和使用它的可执行文件同时动态链接到同时动态链接到 MFC DLL 和任何和任何MFC扩展扩展 DLL。在使用。在使用了了MFC共享库的时候,默认情况下,共享库的时候,默认情况下,MFC使用主应用程序使用主应用程序的资源句柄来加载资源模板。这样,当的资源句柄来加载资源模板。这样,当DLL和应用程序中存和应用程序中存在一样在一样ID的资源时即所谓的资源反复问题,系统可能不的资源时即所谓的资源反复问题,系统可能不能获得正确的资源。因而,对于共享能获
26、得正确的资源。因而,对于共享MFC DLL的规那么的规那么DLL,必需进展模块切换以使得,必需进展模块切换以使得MFC可以找到正确的资源可以找到正确的资源模板。模板。MFC规那么规那么DLL的创建的创建 automation自动化技术自动化技术 是否支持是否支持Windows Sockets 在在MFC应用程序中应用程序中CWinApp取代了取代了SDK程序中程序中WinMain的地位,的地位,SDK程序程序WinMain所完成的工作由所完成的工作由CWinApp的三的三个函数完成:个函数完成:virtual BOOL InitApplication( );virtual BOOL InitI
27、nstance( );virtual BOOL Run( ); /传说中传说中MFC程程序的序的“活水源头活水源头MFC规那么规那么DLL接口函数接口函数 #include StdAfx.h #include DllDialog.h _declspec(dllexport) void ShowDlg(void) 或或 extern C _declspec(dllexport) void ShowDlg(void) CDllDialog dllDialog; dllDialog.DoModal(); 分析:分析: 这个接口并不使用这个接口并不使用MFC,但是在其中却可以调用,但是在其中却可以调用
28、MFC扩展类扩展类CdllDialog的函数,这表达了的函数,这表达了“规那么的概类。规那么的概类。 与非与非MFC DLL完全一样,可以使用完全一样,可以使用_declspec(dllexport)声明声明或在或在.def中引出的方式导出中引出的方式导出MFC规那么规那么DLL中的接口。中的接口。MFC规那么规那么DLL的调用的调用 #pragma comment(lib,RegularDll.lib)_declspec(dllexport) void ShowDlg(void)void ShowDlg(void); 或或extern C _declspec(dllexport) void
29、ShowDlg(void)extern C void ShowDlg(void); void CRegularDllCallDlg:OnCalldllButton() ShowDlg();MFC扩展扩展 DLL MFC扩展扩展DLL与与MFC规那么规那么DLL的一样点在于在两种的一样点在于在两种DLL的内部都可以使用的内部都可以使用MFC类库,其不同点在于类库,其不同点在于MFC扩展扩展DLL与应用程序的接口可以是与应用程序的接口可以是MFC的。的。 MFC扩展扩展DLL的含义在于它是的含义在于它是MFC的扩展,其主要功的扩展,其主要功能是实现从现有能是实现从现有MFC库类中派生出可重用的类。
30、库类中派生出可重用的类。 MFC扩展扩展DLL使用使用MFC 动态链接库版本,因而只要动态链接库版本,因而只要用共享用共享MFC 版本生成的版本生成的MFC 可执行文件应用程序可执行文件应用程序或规那么或规那么DLL才干使用才干使用MFC扩展扩展DLL。 一般使用一般使用MFC扩展扩展DLL来包含一些来包含一些MFC的加强功能,的加强功能,譬如扩展譬如扩展MFC的的CStatic、CButton等类使之具备更强等类使之具备更强大的才干。大的才干。三种三种DLL对对DllMain入口函数的不同处置方式:入口函数的不同处置方式: DLLDLL类型类型 入口函数入口函数 非非 MFC DLL MFC
31、 DLL 编程者提供编程者提供DllMainDllMain函数函数 MFCMFC规则规则 DLL DLL CWinAppCWinApp对象的对象的InitInstance InitInstance 和和 ExitInstance ExitInstance MFCMFC扩展扩展 DLL DLL MFC DLLMFC DLL向导生成向导生成DllMain DllMain 函数函数 宏宏宏为宏为DLL和应用程序的编写提供了方便。像和应用程序的编写提供了方便。像AFX_EXT_CLASS、AFX_EXT_API、AFX_EXT_DATA在在DLL和应用程序中将具有不同的定义,这取和应用程序中将具有不同
32、的定义,这取决于决于_AFXEXT宏是否被定义。这使得在宏是否被定义。这使得在DLL和应用程序中,使用统一的一个宏就可以表示和应用程序中,使用统一的一个宏就可以表示出输出和输入的不同意思。出输出和输入的不同意思。在在DLL中,表示输出因为中,表示输出因为_AFXEXT被定义,被定义,通常是在编译器的标识参数中指定通常是在编译器的标识参数中指定/D_AFXEXT;在应用程序中,那么表示输入在应用程序中,那么表示输入_AFXEXT没没有定义。有定义。 AFX_CLASS_IMPORT _declspec(dllexport) AFX_API_IMPORT _declspec(dllexport)
33、AFX_DATA_IMPORT _declspec(dllexport) AFX_CLASS_EXPORT _declspec(dllexport) AFX_API_EXPORT _declspec(dllexport) AFX_DATA_EXPORT _declspec(dllexport) AFX_EXT_CLASS #ifdef _AFXEXT AFX_CLASS_EXPORT #else AFX_CLASS_IMPORT AFX_EXT_API #ifdef _AFXEXT AFX_API_EXPORT #else AFX_API_IMPORT AFX_EXT_DATA #ifdef
34、_AFXEXT AFX_DATA_EXPORT #else AFX_DATA_IMPORT class AFX_EXT_CLASS CExtDialog : public CDialog * #include .ExtDialog.h #pragma comment( lib, ExtDll.lib ) 而而“调用调用DLL按钮的单击事件的消息处置函数为:按钮的单击事件的消息处置函数为: void CLoadExtDllDlg:OnDllcallButton() CExtDialog extDialog; extDialog.DoModal(); Win32系统钩子技术系统钩子技术APIHOO
35、K技术应用广泛,常用于屏幕技术应用广泛,常用于屏幕取词、网络防火墙、病毒木马、加壳软取词、网络防火墙、病毒木马、加壳软件、串口红外通信、游戏外挂、件、串口红外通信、游戏外挂、Internet通信等领域。通信等领域。HOOK的中文意思就是钩子,的中文意思就是钩子,APIHOOK就是钩住就是钩住API,对,对API进展预进展预处置,先执行我们的函数。处置,先执行我们的函数。 APIHOOK技术技术钩子的实质是一段用以处置系统消息的程序,钩子的实质是一段用以处置系统消息的程序,通过系统调用,把它挂入系统。通过系统调用,把它挂入系统。钩子的品种很多,每种钩子可以截获并处置相钩子的品种很多,每种钩子可以
36、截获并处置相应的消息,每当特定的消息发出,在到达目的应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。此时钩子函数可以对截获的此消息的控制权。此时钩子函数可以对截获的消息进展加工处置,甚至可以强迫完毕消息的消息进展加工处置,甚至可以强迫完毕消息的传送。传送。这有点类似与这有点类似与MFC中的中的PreTranslateMessage函数,所不同的是该函数只能用于拦截本进程函数,所不同的是该函数只能用于拦截本进程中的消息,而对系统消息那么无能为力。中的消息,而对系统消息那么无能为力。 Win32系统钩子的实现系
37、统钩子的实现 每品种型的钩子均由系统来维护一个钩每品种型的钩子均由系统来维护一个钩子链,最近装置的钩子位于链的开场,子链,最近装置的钩子位于链的开场,拥有最高的优先级,而最先装置的钩子拥有最高的优先级,而最先装置的钩子那么处在链的末尾。那么处在链的末尾。要实现要实现Win32的系统钩子,首先要调用的系统钩子,首先要调用SDK中的中的API函数函数SetWindowsHookEx来来装置这个钩子函数,其原型是:装置这个钩子函数,其原型是: HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThrea
38、dId); 其中:其中: 第一个参数是钩子的类型,常用的有第一个参数是钩子的类型,常用的有WH_MOUSE、WH_KEYBOARD、WH_GETMESSAGE等;等; 第二个参数是钩子函数的地址,当钩子钩到任何消息后第二个参数是钩子函数的地址,当钩子钩到任何消息后便调用这个函数;便调用这个函数; 第三个参数是钩子函数所在模块的句柄;第三个参数是钩子函数所在模块的句柄; 第四个参数是钩子相关函数的第四个参数是钩子相关函数的ID用以指定想让钩子去钩用以指定想让钩子去钩哪个线程,为哪个线程,为0时那么拦截整个系统的消息此时为全局钩时那么拦截整个系统的消息此时为全局钩子。假如指定确定的线程,即为线程专
39、用钩子。子。假如指定确定的线程,即为线程专用钩子。 全局钩子函数必需包含在全局钩子函数必需包含在DLL动态链动态链接库中,而线程专用钩子那么可包含接库中,而线程专用钩子那么可包含在可执行文件中。在可执行文件中。得到控制权的钩子函数在处置完消息后,得到控制权的钩子函数在处置完消息后,可以调用另外一个可以调用另外一个SDK中的中的API函数函数CallNextHookEx来继续传送该消息。也来继续传送该消息。也可以通过直接返回可以通过直接返回TRUE来丢弃该消息,来丢弃该消息,阻止该消息的传送。阻止该消息的传送。使用全局钩子函数时需要以使用全局钩子函数时需要以DLL为载体,为载体,VC6中有三种形
40、式的中有三种形式的MFC DLL可供选择,即规范可供选择,即规范静态链接静态链接MFC DLL、规范动态链接、规范动态链接MFC DLL以及扩展以及扩展MFC DLL。第一种第一种DLL在编译时把使用的在编译时把使用的MFC代码链接代码链接到到DLL中,执行程序时不需要其他中,执行程序时不需要其他MFC动态动态链接类库的支持,但体积较大;链接类库的支持,但体积较大;第二种第二种DLL在运行时动态链接到在运行时动态链接到MFC类库,类库,因而体积较小,但却依赖于因而体积较小,但却依赖于MFC动态链接类库动态链接类库的支持;这两种的支持;这两种DLL均可被均可被MFC程序和程序和Win32程序使用
41、。程序使用。第三种第三种DLL的也是动态连接,但做为的也是动态连接,但做为MFC类类库的扩展,只能被库的扩展,只能被MFC程序使用。程序使用。 Win32 DLL BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved);其中:其中:第一个参数表示第一个参数表示DLL的实例句柄;的实例句柄;第三个参数系统保管;第三个参数系统保管;第二个参数指明了当前调用该动态连接库的状态,第二个参数指明了当前调用该动态连接库的状态,它有四个可能的值:它有四个可能的值:DLL_PROCESS_ATTACH进程载入、进程
42、载入、DLL_THREAD_ATTACH线程载入、线程载入、DLL_THREAD_DETACH线程卸载、线程卸载、DLL_PROCESS_DETACH进程卸载。进程卸载。DLL的共享问题的共享问题 由于在由于在Win32环境下,所有进程的空间都是互相独立环境下,所有进程的空间都是互相独立的,这减少了应用程序间的互相影响,但大大增加了的,这减少了应用程序间的互相影响,但大大增加了编程的难度。编程的难度。 当进程在动态加载当进程在动态加载DLL时,系统自动把时,系统自动把DLL地址映射地址映射到该进程的私有空间到该进程的私有空间; 而且也复制该而且也复制该DLL的全局数据的一份拷贝到该进程空的全局
43、数据的一份拷贝到该进程空间,每个进程所拥有的一样的间,每个进程所拥有的一样的DLL的全局数据其值却的全局数据其值却并不一定是一样的。并不一定是一样的。 当当DLL内存被映射到进程空间中,每个进程都有自己内存被映射到进程空间中,每个进程都有自己的全局内存拷贝,加载的全局内存拷贝,加载DLL的每一个新的进程都重新的每一个新的进程都重新初始化这一内存区域,也就是说进程不能再共享初始化这一内存区域,也就是说进程不能再共享DLL。全局共享数据的实现全局共享数据的实现 在在Win32环境下要想在多个进程中共享环境下要想在多个进程中共享数据,就必需进展必要的设置。数据,就必需进展必要的设置。一种方法便是把这
44、些需要共享的数据单一种方法便是把这些需要共享的数据单独分别出来,放置在一个独立的数据段独分别出来,放置在一个独立的数据段里,并把该段的属性设置为共享,建立里,并把该段的属性设置为共享,建立一个内存共享的一个内存共享的DLL。 #pragma data_seg用用#pragma data_seg建立一个新的数据段并定义建立一个新的数据段并定义共享数据,其详细格式为:共享数据,其详细格式为: #pragma data_seg shareddata) HWND sharedwnd=NULL;/共享数据共享数据 #pragma data_seg() 所有在所有在data_seg pragmas语句之间声明的变量都语句之间声明的变量都将在将在shareddata段中。仅定义一个数据段还不能段中。仅定义一个数据段还不能到达共享数据的目的,还要告诉编译器该段的属到达共享数据的目的,还要告诉编译器该段的属性,有两种方法可
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年新型城镇化项目宣传策划与广告制作合同3篇
- 二零二五年度数字经济产业园运营管理合同3篇
- 二零二五年酒店客房服务质量监督单位合同范本3篇
- 二零二五年度电梯设备采购与安装一体化服务合同3篇
- 二零二五年路灯照明产品研发、生产、销售及售后服务合同5篇
- 二零二五年高端房地产抵押租赁合同模板3篇
- 二零二五版体育产业贷款合同与信用额度授信协议3篇
- 二零二五版昆明公租房电子合同租赁合同解除与终止流程3篇
- 二零二五年度简单终止劳动合同协议规范劳动合同解除2篇
- 2025年彩钢建筑一体化解决方案承包合同3篇
- NGS二代测序培训
- 《材料合成与制备技术》课程教学大纲(材料化学专业)
- 小红书食用农产品承诺书示例
- 钉钉OA办公系统操作流程培训
- 新生儿科年度护理质控总结
- GB/T 15934-2024电器附件电线组件和互连电线组件
- 《工贸企业有限空间作业安全规定》知识培训
- 高层次人才座谈会发言稿
- 垃圾清运公司管理制度(人员、车辆、质量监督、会计管理制度)
- 《建筑工程设计文件编制深度规定》(2022年版)
- 营销人员薪酬考核方案
评论
0/150
提交评论