### VC++ EXE工程转DLL工程方法 在VC++开发环境中,将一个现有的EXE(可执行文件)项目转换为DLL(动态链接库)项目是一个常见的需求,尤其是在需要将现有功能封装成库供多个项目共享时。下面将详细介绍这一转换过程中的关键步骤和技术要点。 #### 一、理解EXE与DLL的区别 在开始转换之前,首先需要了解EXE与DLL之间的基本区别: 1. **EXE**:是一个独立的应用程序,可以直接运行。 2. **DLL**:是一个库文件,可以被多个应用程序同时加载和使用。 #### 二、DSP文件的转换 ##### 1. DSP文件的转换 - **DSP文件**是Visual C++早期版本中使用的项目文件格式。如果要将EXE项目转换为DLL项目,首先需要修改项目的.DSP文件。具体操作包括但不限于更改项目类型、添加或移除特定宏定义等。 - **Resource.h**中的修改:通常需要更新资源标识符,例如将`#define IDR_MAINFRAME 1283`中的资源ID更新为新的值。 - **部分代码示例**:在`xxxxDlg.h`文件中,可以看到对`afx_msg void OnAbout();`的声明。这表明需要处理的消息函数。 - **代码示例**:在`xxxxDlg.app`文件中,有一段代码涉及图标资源的加载以及消息映射的注册。例如,通过`AfxGetApp()->LoadIcon(IDR_MAINFRAME);`加载图标资源,以及通过`ON_BN_CLICKED(IDC_BUTTON1, OnAbout)`注册按钮点击事件的处理函数。 - **代码示例**:对于`CBlockerDlg::OnAbout()`函数,原代码中包含了对话框版本信息的显示逻辑,但这里将其注释掉了。这是因为DLL项目通常不会包含完整的用户界面逻辑。 #### 三、资源文件的调整 ##### 2. 资源文件的修改 - **RC文件**:在`XXXX.rc`文件中,可以看到`ICON IDR_MAINFRAME, IDC_STATIC, 533, 7, 20, 20`这样的行,表示定义了一个名为`IDR_MAINFRAME`的图标资源。 - **DEF文件**:在`XXXX.def`文件中,可能会看到类似`EXPORTS`这样的关键字,用于指定DLL对外公开的符号。 #### 四、主程序入口的更改 ##### 3. 主程序入口的调整 - 在`XXXX.cpp`文件中,可以看到`CBlockerApp::InitInstance()`函数。对于DLL项目来说,这部分代码通常是不需要的,因为DLL项目不需要像EXE那样具备独立的启动流程。因此,通常会将这部分代码进行适当的删减或注释掉。 - **示例代码**: ```cpp BOOL CBlockerApp::InitInstance() { AfxEnableControlContainer(); // Standard initialization // ... return CWinApp::InitInstance(); } ``` #### 五、代码屏蔽及其他注意事项 - **代码屏蔽**:在将EXE项目转换为DLL项目的过程中,需要对原代码进行一定的屏蔽处理,确保只导出那些希望对外公开的接口,而其他内部实现则应隐藏起来。 - **其他注意事项**: - 确保所有对外公开的函数都通过`__declspec(dllexport)`进行修饰。 - 删除或注释掉所有与主程序启动相关的代码。 - 更新资源文件,如`.rc`文件中的资源ID。 通过上述步骤,可以有效地将一个原有的EXE工程转换为DLL工程,并确保其能够正确编译和使用。需要注意的是,在实际操作过程中可能还需要根据具体项目的需求做出相应的调整。
2、resource.h屏蔽掉//#define IDR_MAINFRAME 128
3、xxxxDlg.h文件中屏蔽afx_msg void OnAbout();
4、xxxxDlg.app文件中屏蔽
A)m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
B)ON_BN_CLICKED(IDC_BUTTON1, OnAbout)
C)//void CBlockerDlg::OnAbout()
//{
// // TODO: Add your control notification handler code here
// CDlgVersion dlgVersion;
//
// dlgVersion.DoModal();
//
//}
5、XXXX.rc文件中屏蔽ICON IDR_MAINFRAME,IDC_STATIC,533,7,20,20
6、添加文件XXXX.def文件
7、XXXX.cpp文件中修改下面函数
BOOL CBlockerApp::InitInstance()
{
AfxEnableControlContainer();
// Standard initialization
// If you are not using these features and wish to reduce the size
- 粉丝: 0
- 资源: 8
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
- 1
- 2
- 3
前往页