更新时间:2015-11-03 22:21:05浏览次数:1+次
再阅读本文之前,希望你看看《动态链接库基础详解》
MFC动态链接库创建过程
我们在VC列表框中选择MFC AppWizard[dll]选项,创建一个名为ResourceDll的工程。随后我们在动态链接库的源文件中ResourceDll.cpp中定义一个C++类。
#define EXPORT _declspec(dllimport)
EXPORT class CShowDlg
{
public:
virtual void _stdcall ShowNoteDlg(char *pszText);
{
MessageBox(pszText,"提示");
}
}
接着我们创建两个函数,用来创建和释放一个CShowDlg类对象。
CShowDlg *_stdcall GetShowDlg()
{
return new CShowDlg();
}
void _stdcall ReleaseShowDlg(CShowDlg *pShowDlg)
{
delete pShowDlg;
}
在工作区的资源窗口导入一个位图,导入位图后,其ID值为2009
编译并运行程序,将生成.dll文件。
下面我们介绍如何使用MFC动态链接库。与访问普通的win32动态链接库相比,访问MFC动态链接库要复杂一些。首先要访问到MFC动态链接库中定义的类。为此需要在应用程序中定义一个与MFC动态链接库中相同的类,该类只是抽象类,类中只定义方法的声明,没有方法的实现。其次是访问MFC动态链接库中的资源,你需要调用函数来实现。
下面我们创建一个基于对话框的工程-UserMFCDll。
向对话框中添加按钮和图像控件:
然后定义一个抽象类:
class CShowDlg //定义抽象类CShowDlg
{
public:
virtual void __stdcall ShowNoteDlg(char* pszText) = 0; //定义纯虚方法
};
接着我们定义两个指针函数,用于访问动态链接库中的函数:
typedef CShowDlg* (__stdcall *funGetShowDlg)(); //定义函数指针类型
typedef void ( __stdcall *funReleaseShowDlg)(CShowDlg* pShowDlg); //定义函数指针类型
最后我们为“确定”按钮建立消息响应:
void CUseMFCDllDlg::OnInvoke()
{
HMODULE hMod = LoadLibrary("./ResourceDll.dll"); //加载动态链接库
if (hMod != NULL) //判断是否加载成功
{
//获取动态链接库中的GetShowDlg函数
funGetShowDlg GetShowDlg = (funGetShowDlg)GetProcAddress(hMod, "GetShowDlg");
funReleaseShowDlg ReleaseShowDlg= (funReleaseShowDlg)GetProcAddress(hMod,
"ReleaseShowDlg"); //获取动态链接库中的ReleaseShowDlg 函数
if (GetShowDlg != NULL && ReleaseShowDlg != NULL) //判断函数指针是否为空
{
CShowDlg* pShowDlg = GetShowDlg(); //调用动态链接库中的方法,构造CShowDlg对象
pShowDlg->ShowNoteDlg("编程词典"); //访问CShowDlg类的ShowNoteDlg方法
ReleaseShowDlg(pShowDlg); //释放pShowDlg对象
}
FreeLibrary(hMod); //卸载动态链接库
}
//加载动态链接库
HMODULE hRes = LoadLibraryEx("./ResourceDll", NULL, LOAD_LIBRARY_AS_DATAFILE);
if (hRes != NULL) //判断是否加载成功
{
//加载动态链接库中的位图,其中2009为动态链接库中的位图资源ID值
HANDLE hBmp = LoadImage(hRes, MAKEINTRESOURCE(2009), IMAGE_BITMAP, 0, 0, 0);
if (hBmp != NULL) //判断加载位图是否成功
{
HBITMAP hOldBmp = m_Bmp.SetBitmap((HBITMAP)hBmp); //在控件中显示位图
if (hOldBmp)
{
DeleteObject(hOldBmp);
}
}
FreeLibrary(hRes); //卸载动态链接库
}
}
最后实现:
先是点击调用出现对话框,接着就是位图了:
相关资讯