MFC-DLL示例介绍
来源:互联网 发布:千牛卖家数据访客 编辑:程序博客网 时间:2024/06/05 06:16
MFC应用向导可以生成MFC支持的两种DLL:扩展DLL和常规DLL。下面将介绍这两种DLL的区别:
扩展DLL支持C++接口,换句话说该DLL可以导出整个类,客户可以构造这些类的对象或从这些类进行派生。扩展DLL动态链接到MFC库中的DLL版本中的代码(所以扩展DLL文件比较小),因此,扩展DLL要求库户程序也必须能够动态链接到MFC库(MFC应用程序向导的默认设置),所以扩展DLL只能应用到MFC应用程序中。
常规dLL可以被任何Win32编程环境装载,它的限制就是常规DLL只能导出C风格的函数,而不能导出C++类、成员函数或重载函数,不过在常规DLL中是可以使用C++类(特别是MFC库的类)。当生成常规DLL时,可以选择静态链接或动态链接到MFC库。如果选择了静态链接DLL将包含所有它需要的MFC库代码的拷贝,因此它是自包含的,当然了这样生成的DLL文件会比较大。如果选择动态链接,则文件会相对小些,但是必须保证在目标机器上存在适当的MFC DLL。
1.扩展DLL源码示例
1.1创建扩展DLL
启动VC6,使用MFC DLL向导创建初始扩展DLL项目;
在此工程中新建了一对话框资源其对应的类文件为MyDlg.h、MyDlg.cpp
//////////////////////////////////////////////MyDlg.h源码////////////////////////////
class AFX_EXT_CLASS CMyDlg : public CDialog//因要到处此类所以需在类名前添加AFX_EXT_CLASS宏
{
......
};
......
编译运行便可生成.lib和.dll文件
1.2DLL调用
将导出DLL对应类的头文件拷贝到客户应用程序目录下并加载到应用程序中,lib和dll文件拷贝到项目的debug目录下;
装入.lib文件:(1)project->Setting...->Link 设置.lib文件所在全路径;(2)#pragma comment(lib, “debug/NewClassDll.lib")
#include "MyDlg.h"
......
void CTemp222Dlg::OnButton1()
{
CMyDlg dlg;
dlg.DoModal();
}
2.常规DLL示例
2.1DLL创建
启动VC6 使用MFC DLL向导创建初始动态链接DLL项目;
向.cpp文件中添加如下函数代码:
extern "c" __declspec(dllexport) double MyFun(double d)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
//当调用的MFC动态链接库mfc70.dll作为进程的一部分被装入时,它把数据存放在一些实际的全局变量中。如果是从MFC程序或DLL中调用MFC函数,则mfc70.dll会知道如何代表调用进程去设置这些全局变量。然而从一个常规MFCDLL 中调用进入mfc70.dll,则这些全局变量并不同步,其结果不可知为了解决这个问题,需在每个导出函数开始处添加此行代码。
......
}
编译运行便可生成.lib和.dll文件
2.2DLL调用
还是以隐式调用为例装入lib库的方式与上面讲的方法一样;
声明导入函数用于查找DLL加载后在内存中预存的到处函数的地址,示例代码:
extern "c" _declspec(dllimport) double MyFun(double d);
关键源码:
#pragma comment(lib, “debug/NewClassDll.lib")
extern "c" _declspec(dllimport) double MyFun(double d);
......
m_dOutput=MyFun(20);
......
3.关于DLL中使用的资源
当一个程序包含了扩展DLL和常规DLL中都且其都使用了资源,资源搜索序列为:首先是EXE文件,然后是扩展DLL;如果是DLL装入一个资源,则搜索序列为:首先是扩展DLL,然后是MFC DLL,最后是EXE。
如果需要的话可以修改资源搜索序列,假如希望EXE代码首先搜索DLL的资源,则可以使用如下代码:HINSTANCE hInstResourceClient=AfxGetResourceHandle();
//Use DLL's instanse handel
AfxSetResourceHandel(::GetMoudleHandle("mydllname.dll"));
CString strRes;
strRes.LoadString(IDS_MYSTRING)//获取DLL中标示为IDS_MYSTRING字符串资源
//Restore Client's instanse handle
AfxSetResourceHandel(hInstResourceClient);
- MFC-DLL示例介绍
- MFC静态加载dll和动态加载dll示例
- MFC-DLL构建完整示例(内含知识点不少)
- DLL示例
- mfc dll
- MFC DLL
- MFC dll
- MFC Dll
- MFC dll
- MFC-DLL
- MFC DLL
- MFC dll
- mfc dll
- mfc dll
- MFC DLL
- MFC DLL
- MFC DLL
- dll介绍
- GDI绘图类示例代码-CFont CPen CBrush
- linux c 信号量编程
- Win32DLL编写与调用模板
- 第四军医大学唐都学院
- 合并排序(递归法)5
- MFC-DLL示例介绍
- Android交互对话框
- MFC-DLL构建完整示例(内含知识点不少)
- matlab 中配置libsvm 的方法。。。。
- android小菜入门详解
- 客户区窗口动态分割示例
- wince开机画面
- android Menu和android Intent使用。
- 求链表长度