当前位置:C++技术网 > 资讯 > 示例程序详解MFC动态链接库

示例程序详解MFC动态链接库

更新时间: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);							//卸载动态链接库
	}
}
最后实现:


先是点击调用出现对话框,接着就是位图了: