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。
2. MFC调用DLL
1. 创建MFC应用程序,此处可根据需求设置工程参数,以下仅作为示例。
2. 配置项目路径和工程名等参数,点击“创建”。
3. 选择应用程序属性,“基于对话框”,“在静态库中使用MFC”,点击“完成”。
4. 在UI上添加一个按键“Add”,根据个人需求修改其属性,这里我修改了ID和显示的字符。
2.1 动态调用dll
动态调用,即Run-time Dynamic Linking是一种隐式的调用方式,即程序运行过程中装载dll。该方式只需要.dll文件,不需要.h和.lib。通过LoadLibrary()加载.dll,GetProcAddress()获取想要引入的函数,使用完后通过就FreeLibrary()释放。
1. 双击“Add”控件进入槽函数,添加以下代码,然后生成解决方案。以下代码就是通过动态调用的方法调用dll。
void CTestMyDllDlg::OnBnClickedBtnAdd()
{// dynamic call dllHINSTANCE 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”按键,结果如下:
2.2 静态调用dll
静态调用,即 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”按键,结果如下:
3. MFC创建包含界面的DLL
1. 在MFC_Dll工程的基础上来修改,在资源视图上右键工程,为工程添加一个对话框:
2. 在生成的对话框上右键,为其添加类:
3. 根据需求修改对话框,这里添加一个static作为演示:
4. 在MyDlgDll.h中类之前添加__declspec(dllexport),将整个类导出。
5. 重新编译工程。
4. MFC调用包含界面的DLL
1. 根据上文介绍的方法,将.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”,结果如下:
5. MFC创建C++类的DLL
1. 在上两章节,我们已经实现了包含界面的DLL的创建与调用,实际上,在MyDlgDll类中添加的public方法都可以同样的在外部被调用。在MyDlgDll.h中申明函数如下:
2. 在MyDlgDll.cpp中添加函数定义,如下:
参考代码:
int MyDlgDll::MyMul(int a, int b)
{return (a * b);
}
3. 重新编译。
6. MFC调用C++类的DLL
1. 参考上述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”按键,结果如下:
MFC创建、调用Dll的方法相关推荐
- Delphi环境中编写调用DLL的方法和技巧
Delphi环境中编写调用DLL的方法和技巧 第一章 为什么要使用动态链接库(DLL) top 提起DLL您一定不会陌生,在Windows中有着大量的以DLL为后缀的文件,它们是保证Windows正常 ...
- Delphi中动态调用DLL的方法
Delphi中动态调用dll的方法如下: function CallFunc(dllname, funcname: string; const param: array of const): DWOR ...
- qt/c++调用dll的方法实践
qt/c++调用dll的方法实践 关于c++调用dll的方法,应该说是很成熟的,很多文章介绍的也很详细,可以直接套用. 这里不在详述其原理,而只是根据实际使用做一个实践总结. 主程序添加dll中的头文 ...
- php调用c dll,PHP调用DLL的方法
在PHP 4.2.0 至 4.2.3中,可以使用w32api_register_function 函数调用外部的DLL,前提是需要在php.ini中打开扩展的php_w32api.dll. 如果使用的 ...
- java dll 调用方法_关于Java调用dll的方法 | 学步园
Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也能带来跨平台性. Java调用C/C 写好的DLL库时,由于基本数据类型不同.使用字节 ...
- 用python读取身份证信息的功能分析与实现,兼述python调用dll的方法
背景 有这样一个需求,要求能自动读取用户的身份证信息.如果是一代身份证,这个功能恐怕只能通过图像识别的办法来解决了.不过现在二代身份证已经很普及.客户要求能读二代身份证就可以了. 现在二代身份证阅读器 ...
- VS C++生成dll和静态调用dll的方法
一.动态链接库(dll)概述 在实际编程中,我们可以把完成某项功能的函数放在一个动态链接库里,然后提供给其他程序调用. 1.1 静态库和动态库 静态库: 函数和数据被编译进一个二进制文件(扩展名通常为 ...
- MFC动态调用DLL
1.把xx.DLL拷到目标工程(需调用xx.DLL的工程)的Debug目录下; 2.把xx.lib拷到你目标工程(需调用xx.DLL的工程)目录下; 3.工程属性–>Linker–>Gen ...
- 在MFC中调用DLL .
欲在.EXE 中调用PRO.DLL PRO.DLL中函数如: long MenuExecute( char *, long , HWND , long , char *, long , void * ...
最新文章
- How to be a great Project Director
- 也谈闭包--小白的JS进阶之路
- Spring源代码研究之how is Bean object created
- 父组件和子组件同是使用 beforeDestroy 钩子 保存同一份数据
- xna中的截屏操作处理
- php 判断输入字符串,php 判断(输入框) 字符串函数
- BZOJ 4173: 数学
- 计算n阶行列式的C语言实现
- 来,让我用Python给你算一命
- YP.2.7 Other Representations(双语)
- 综合型集团该如何利用数字化转型支撑磅礴多元的服务?
- 嵌入式linux学习笔记--TCP通讯整理
- python代码实现时间从12小时制到24小时制的转换
- 大数据下的90后事业画像
- 在 Python 中的常见的几种字符串替换操作
- taglib.class.php,thinkphp5 taglib标签库自定义
- 三十岁——男人创业的最佳时机
- PCB设计如何美观的几大原则
- Blink SQL介绍
- matlab提取伴奏原理,如何将音频里的伴奏提取出来
热门文章
- Python OpenCV 批量修改文件夹内所有图片的尺寸
- 跟Xilinx SAE 学HLS系列视频讲座笔记(4)——For循环优化
- 显著性水平对应的临界值_什么是临界值?
- 欧氏空间距离和内积_线性空间和欧氏空间的区别和联系
- 帆软报表之--下拉框联动
- AR(3)模型递推最小二参数估计的MATLAB实现
- Win系统 - 显存反映了显卡的全部性能?
- 关于U盘在装系统之后之后容量变小且不能格式化的解决方法
- vc6.0使用PathFileExists(...)函数的时候链接错误的解决办法
- OpenLayers3加载离线百度地图(百度迁徙底图)