MFC创建、调用Dll的方法 | 您所在的位置:网站首页 › Dll函数 › MFC创建、调用Dll的方法 |
1. MFC创建DLL
1. 打开VS,新建项目,选择“MFC动态链接库”,点击“下一步”。
2. 设置项目名,路径等参数,点击“创建”。
3. 选择“静态链接到MFC的规则DLL”->“完成”。 4. 以上步骤就将MFC Dll动态库的编译环境配置好了, 然后编写需要导出的函数,在MyDll.cpp中写入函数的实现: extern "C" __declspec(dllexport) int MyAdd (int a, int b) { return (a + b); }5. 接下来就是定义函数的导出接口了,也就是在头文件中声明这个函数 extern "C" __declspec(dllexport) int MyAdd(int a, int b);6. 点击“生成”->“生成解决方案”,这样,在Debug路径下就生成了MyDll.dll和动态链接库MyDll.lib。
1. 创建MFC应用程序,此处可根据需求设置工程参数,以下仅作为示例。 2. 配置项目路径和工程名等参数,点击“创建”。 3. 选择应用程序属性,“基于对话框”,“在静态库中使用MFC”,点击“完成”。 4. 在UI上添加一个按键“Add”,根据个人需求修改其属性,这里我修改了ID和显示的字符。 动态调用,即Run-time Dynamic Linking是一种隐式的调用方式,即程序运行过程中装载dll。该方式只需要.dll文件,不需要.h和.lib。通过LoadLibrary()加载.dll,GetProcAddress()获取想要引入的函数,使用完后通过就FreeLibrary()释放。 1. 双击“Add”控件进入槽函数,添加以下代码,然后生成解决方案。以下代码就是通过动态调用的方法调用dll。 void CTestMyDllDlg::OnBnClickedBtnAdd() { // dynamic call dll HINSTANCE m_hDll = LoadLibrary(L"MyDll.dll"); if (NULL == m_hDll) { MessageBox(L"Load dll failed!"); return; } else { typedef int (*AddFun)(int a, int b); AddFun m_Add = (AddFun)GetProcAddress(m_hDll,"MyAdd"); if (m_Add == NULL) { MessageBox(L"Find Add function failed!"); return; } else { CString str = L""; int c = 0; c = m_Add(12, 13); str.Format(L"c = %d", c); MessageBox(str); } FreeLibrary(m_hDll); } }2. 运行.exe,点击“Add”控件,发现提示如下错误,那是因为我们没有将第一章生成的.dll文件添加到工程目录下。 将MyDll.dll复制到.exe路径下: 再次点击“Add”按键,结果如下: 静态调用,即 Load-time Dynamic Linking。正如我们常用的配置方式,同时需要.h、.lib和.dll文件,缺一不可。 1. 将MyDll.h复制到TestMyDll代码所在路径,并在TestMyDllDlg.cpp中将头文件include进来。 2. 修改“Add”控件槽函数,如下: void CTestMyDllDlg::OnBnClickedBtnAdd() { int c = 0; CString str = L""; c = MyAdd(1, 2); str.Format(L"c = %d", c); MessageBox(str); }3. 编译后发现,提示错误如下: 这是因为我们没有将.lib文件添加到工程中,接下来将介绍如何将.lib文件添加到工程中。 2.3 将.lib文件添加到工程方法一: 右键工程->“添加”->“现有项”,选择MyDll.lib文件,直接将.lib文件添加到工程中。 重新编译运行,结果如下:
方法二: 将MyDll.lib复制到.exe所在路径下,若其它路径以下代码对应修改即可。 在TestMyDllDlg.cpp中添加如下代码 #pragma comment (lib, "../Debug/MyDll.lib")重新编译运行,结果如下: 方法三: 1. 将MyDll.lib复制到.exe所在路径下 2. 在工程上右键->属性->配置属性->链接器->输入->附加依赖项,设置.lib文件所在路径,由于我们已经将.lib文件复制到工程Debug路径下,所以可以直接设置为: $(SolutionDir)$(Configuration)\MyDll.lib如果你没有将.lib复制到工程中,则直接设置其所在路径即可。 注意:这种方法需要对Debug和Release编译分别进行设置!
重新编辑运行,点击“Add”按键,结果如下: 1. 在MFC_Dll工程的基础上来修改,在资源视图上右键工程,为工程添加一个对话框: 2. 在生成的对话框上右键,为其添加类: 3. 根据需求修改对话框,这里添加一个static作为演示: 4. 在MyDlgDll.h中类之前添加__declspec(dllexport),将整个类导出。 5. 重新编译工程。 4. MFC调用包含界面的DLL1. 根据上文介绍的方法,将.dll及.lib文件复制到TestMyDll工程指定目录下。 2. 将MyDlgDll.h复制到TestMyDll工程代码路径下。 3. #include包含DlgTest.h头文件。 4. 导入.lib文件,添加类实例,并在析构函数中释放内存。
参考代码: #pragma comment(lib, "../Debug/MyDll.lib") MyDlgDll* m_pMyDll = new MyDlgDll; CTestMyDllDlg:: ~CTestMyDllDlg() { if (m_pMyDll != NULL) { delete m_pMyDll; m_pMyDll = NULL; } }5. TestMyDll工程中添加一个按键“Dialog”,根据需要修改控件属性,双击进入槽函数,添加如下代码,实现对话框的创建和显示: 参考代码: void CTestMyDllDlg::OnBnClickedBtnDlg() { if (m_pMyDll != NULL) { m_pMyDll->Create(IDD_DIALOG1); m_pMyDll->ShowWindow(SW_SHOW); } }由于在TestMyDll中没有IDD_DIALOG1的定义,因此自行添加一下宏定义即可。 6. 重新编译运行,点击“Dialog”,结果如下: 1. 在上两章节,我们已经实现了包含界面的DLL的创建与调用,实际上,在MyDlgDll类中添加的public方法都可以同样的在外部被调用。在MyDlgDll.h中申明函数如下: 2. 在MyDlgDll.cpp中添加函数定义,如下:
参考代码: int MyDlgDll::MyMul(int a, int b) { return (a * b); }3. 重新编译。 6. MFC调用C++类的DLL1. 参考上述MFC调用dll的步骤,将MyDll.dll和MyDll.lib添加到TestMyDll工程的Debug路径下; 2. 将MyDlgDll.h拷贝到TestMyDll的工程代码路径下; 3. TestMyDll工程中添加一个按键“Mul”,双击进入槽函数,添加如下代码: 参考代码: void CTestMyDllDlg::OnBnClickedBtnMul() { int c = 0; CString str = L""; if (m_pMyDll != NULL) { c = m_pMyDll->MyMul(12, 3); } str.Format(L"c = %d", c); MessageBox(str); }4. 重新编译运行,点击“Mul”按键,结果如下: |
CopyRight 2018-2019 实验室设备网 版权所有 |