file-type

深入浅出VC++动态链接库DLL编程技术

RAR文件

下载需积分: 50 | 1.23MB | 更新于2025-05-05 | 81 浏览量 | 24 下载量 举报 收藏
download 立即下载
在探讨VC++动态链接库(DLL)编程之前,首先需要理解什么是动态链接库以及它与静态链接库的区别。动态链接库(Dynamic Link Library,简称DLL)是一种实现共享函数库的方式,在Windows操作系统中被广泛使用。DLL允许程序运行时动态地加载和卸载,这意味着多个应用程序可以共享同一个DLL,以节省内存资源,并且使得程序更新和维护更加容易。 接下来,详细说明标题和描述中提到的三种类型的DLL以及相关的编程知识。 ### 1. MFC DLL MFC(Microsoft Foundation Classes)DLL 是一种特殊的DLL,它包含了MFC库代码。开发者可以使用MFC DLL来创建基于MFC的库,这些库可以被使用MFC的应用程序调用。MFC DLL主要分为以下几种类型: #### 1.1 标准DLL 标准DLL使用MFC的动态链接版本,并且可以被非MFC应用程序调用。这类DLL在运行时不包含MFC的代码,而是使用导入的MFC函数。标准DLL使用的是静态链接到MFC的C运行时库。 #### 1.2 扩展DLL 扩展DLL与MFC自身链接,可以为MFC应用程序提供扩展的类和功能。它通常用来提供共享的MFC类,比如继承自MFC类库中的窗口类。扩展DLL经常用于实现自定义的文档模板、视图类或者框架窗口。 #### 1.3 非MFC DLL 非MFC DLL并不是用MFC库来创建的,它使用Win32 API来实现。这种类型的DLL不包含任何MFC代码,但是它可以被MFC应用程序调用,或者反过来,MFC应用程序可以被非MFC DLL调用。非MFC DLL允许用C语言编写,也支持C++,但是不使用MFC类。 ### 2. 实例程序 为了加深理解,通过一个具体的实例来说明如何创建和使用这些不同类型的DLL。在这个实例中,我们可以展示如何创建一个简单的MFC扩展DLL,并向MFC应用程序提供一些额外的功能。 #### 2.1 创建MFC扩展DLL项目 使用Visual Studio,创建一个新的MFC扩展DLL项目。在创建过程中,需要选择DLL类型,并且可以选择支持MFC的共享DLL版本。 #### 2.2 编写DLL代码 在项目中编写导出函数或类。为了让DLL函数可以被外部调用,需要使用`__declspec(dllexport)`来标记。比如: ```cpp // ExampleDLL.h #ifdef EXPORTING #define DLL_EXPORT __declspec(dllexport) #else #define DLL_EXPORT __declspec(dllimport) #endif class DLL_EXPORT CExampleClass { public: void DoSomething(); }; ``` #### 2.3 导入和使用DLL 在MFC应用程序中,可以通过`#include`包含对应的头文件,并在链接时指定导入的DLL。使用`__declspec(dllimport)`来标记需要从DLL导入的函数或类。 ### 3. 动态库在MFC中的应用 在MFC中使用动态库,可以大大扩展应用程序的功能,而不必担心资源的重复使用和程序的大小。程序员可以将重复使用的代码封装到DLL中,并且可以在需要时才加载它们。 ### 总结 DLL是一种在程序运行时动态加载和卸载的代码库,它提供了一种模块化的方式来组织程序。在VC++中,使用MFC DLL可以很方便地为基于MFC的应用程序提供额外的类和功能。了解和掌握DLL的编程技术,对于开发大型的、模块化的应用程序具有重要意义。通过本篇的知识介绍,希望能够对VC++动态链接库编程有一个清晰的认识,并能结合实例加深理解,为实际开发工作打下坚实的基础。

相关推荐

filetype
最简单的dll并不比c的helloworld难,只要一个DllMain函数即可,包含objbase.h头文件(支持COM技术的一个头文件)。若你觉得这个头文件名字难记,那么用windows.H也可以。源代码如下:dll_nolib.cpp #include #include BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, void* lpReserved) { HANDLE g_hModule; switch(dwReason) { case DLL_PROCESS_ATTACH: cout<<"Dll is attached!"<<endl; g_hModule = (HINSTANCE)hModule; break; case DLL_PROCESS_DETACH: cout<<"Dll is detached!"<<endl; g_hModule=NULL; break; } return true; } 其中DllMain是每个dll的入口函数,如同c的main函数一样。DllMain带有三个参数,hModule表示本dll的实例句柄(听不懂就不理它,写过windows程序的自然懂),dwReason表示dll当前所处的状态,例如DLL_PROCESS_ATTACH表示dll刚刚被加载到一个进程中,DLL_PROCESS_DETACH表示dll刚刚从一个进程中卸载。当然还有表示加载到线程中和从线程中卸载的状态,这里省略。最后一个参数是一个保留参数(目前和dll的一些状态相关,但是很少使用)。 从上面的程序可以看出,当dll被加载到一个进程中时,dll打印"Dll is attached!"语句;当dll从进程中卸载时,打印"Dll is detached!"语句。 编译dll需要以下两条命令: cl /c dll_nolib.cpp 这条命令会将cpp编译为obj文件,若不使用/c参数则cl还会试图继续将obj链接为exe,但是这里是一个dll,没有main函数,因此会报错。不要紧,继续使用链接命令。 Link /dll dll_nolib.obj 这条命令会生成dll_nolib.dll。 注意,因为编译命令比较简单,所以本文不讨论nmake,有兴趣的可以使用nmake,或者写个bat批处理来编译链接dll。 加载DLL(显式调用)