### VC++加载DLL详解 #### 一、概述 在软件开发过程中,动态链接库(Dynamic Link Library,简称DLL)是一种非常重要的技术手段。通过DLL,开发者可以实现代码重用、功能扩展等多种目的,并有助于减少内存占用及提高程序的运行效率。在VC++环境下,加载DLL有两种主要方式:隐式的加载时链接和显式的运行时链接。 #### 二、隐式的加载时链接 隐式的加载时链接是在编译和链接阶段由编译器自动完成的。这种方式依赖于DLL工程编译产生的LIB文件,该文件包含了DLL对外暴露的所有函数列表。当应用程序在编译链接阶段引用了这些函数时,链接器会在生成的可执行文件中记录相关信息,指示操作系统在运行时加载相应的DLL。 ##### 加载过程 1. **DLL的映射**:在应用程序运行时,操作系统会根据可执行文件中的信息加载对应的DLL文件,将其映射到进程的地址空间中。 2. **加载路径**:系统会按以下顺序搜索DLL文件: - 程序运行时的目录(即可执行文件所在的目录) - 当前程序的工作目录 - 系统目录:在Windows 95/98中可以通过`GetSystemDirectory`函数获取,通常指向的是`SYSTEM`目录;在Windows NT/2000中则是32位Windows的系统目录,同样可通过`GetSystemDirectory`获取,返回值为`SYSTEM32`。 - Windows目录 - 列在环境变量`PATH`中的所有目录 ##### 在VC++中加载DLL的LIB文件的方法 1. **直接加入工程文件列表**:在VC++中打开File View页面,选择工程名,点击鼠标右键并选择“Add Files to Project”,在弹出的对话框中选中需要的DLL的LIB文件。 2. **设置工程的Project Settings加载DLL的LIB文件**:打开工程的Project Settings菜单,选择Link选项卡,在Object/Library Modules下的文本框中输入DLL的LIB文件名。 3. **通过程序代码方式**:使用预编译指令`#pragma comment(lib, "*.lib")`。这种方法的优点在于可以根据不同的编译模式(如Debug或Release)链接不同的LIB文件版本。例如,在Debug模式下,可能需要链接`Regd.lib`,而在Release模式下则需要链接`Regr.lib`。 #### 三、显式的运行时链接 显式的运行时链接适用于仅提供DLL文件而没有对应的`.h`和`.lib`文件的情况。这种方式需要程序员手动加载DLL,并在需要时调用其中的函数。相比隐式链接,这种方式更加灵活且能够更高效地管理内存资源。 ##### 加载步骤 1. **使用LoadLibrary或AfxLoadLibrary加载DLL**:调用`LoadLibrary`或MFC提供的`AfxLoadLibrary`函数将DLL模块映射到进程的内存空间。 2. **获取函数地址**:使用`GetProcAddress`函数获取要调用的DLL中的函数地址。 3. **卸载DLL**:使用`FreeLibrary`或`AfxFreeLibrary`函数从进程地址空间中卸载DLL。 #### 四、示例代码 下面是一个简单的示例,演示如何在VC++中通过显式链接加载DLL: ```cpp // 设置全局变量glibsample用于存储dll句柄 HINSTANCE gLibSample = NULL; // 第二个变量ShowMe是指向dll库中ShowMe()函数的指针 typedef int(__stdcall *ShowMe)(); void CTestDlg::OnLoadButton() { if (gLibSample != NULL) { MessageBox("The sample.dll has already been loaded."); return; } // 装载sample.dll, 未加路径, 将在三个默认路径中寻找 gLibSample = LoadLibrary("sample.dll"); // 返回dll中ShowMe()函数的地址 ShowMe = (ShowMe)GetProcAddress(gLibSample, "ShowMe"); // ... } ``` ### 总结 无论是隐式的加载时链接还是显式的运行时链接,都为VC++环境中加载和使用DLL提供了方便的方法。选择哪种方式取决于具体的应用场景和需求。对于只需要简单使用的场景,推荐使用隐式链接;而对于需要更多控制权和灵活性的情况,则建议采用显式链接的方式。
- shdx2009cxm2013-10-21确实比较详细 但是百度上可以找到
- qq1025730122013-01-04加载DLL的基本介绍
- acz20062013-03-20很好,介绍了我不知道的显示加载DLL的方法
- 粉丝: 1
- 资源: 11
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Django和OpenCV的智能车视频处理系统.zip
- (源码)基于ESP8266的WebDAV服务器与3D打印机管理系统.zip
- (源码)基于Nio实现的Mycat 2.0数据库代理系统.zip
- (源码)基于Java的高校学生就业管理系统.zip
- (源码)基于Spring Boot框架的博客系统.zip
- (源码)基于Spring Boot框架的博客管理系统.zip
- (源码)基于ESP8266和Blynk的IR设备控制系统.zip
- (源码)基于Java和JSP的校园论坛系统.zip
- (源码)基于ROS Kinetic框架的AGV激光雷达导航与SLAM系统.zip
- (源码)基于PythonDjango框架的资产管理系统.zip