程序调用动态链接库中的方法,位图,类
1. 添加MFC Dll项目。
在全局区域添加需要用到的方法、类等信息。
void _stdcall ShowDlg() { AfxMessageBox(_T("动态链接库中的Dll对话框!")); } //-------------------------------// HBITMAP _stdcall GetBitmapFromDll() { return LoadBitmap(AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_BITMAP_W));//IDB_BITMAP_W位图ID } //--------------------------------// class CSkin { public: virtual HBITMAP GetBkMap() { return LoadBitmap(AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_BITMAP_W)); //在向动态链接库中添加类时,如果应用程序要访问类中的方法,则方法必须是虚方法。 } }; CSkin * _stdcall GetSkobj() { return new CSkin(); //构建CSkin对象 } void _stdcall RealeaseSkobj(CSkin * cs) { delete cs; //释放CSkin对象 cs=0; }
找到项目中扩展名为“.def”的文件,在EXPORTS中导出需要的函数。
; SkinDll.def : 声明 DLL 的模块参数。 LIBRARY "SkinDll" EXPORTS ShowDlg; GetBitmapFromDll; GetSkobj; RealeaseSkobj ; 此处可以是显式导出
2. 对上个项目编译完成后,添加MFC应用程序,此处为对话框应用程序。
在界面上添加一个图片控件,并添加一个变量CStatic 类型的m_bit。
typedef void (_stdcall *funShowDlg)(); typedef HBITMAP (_stdcall *funGetBitFromDll)(); void CSlinMainDlg::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 HMODULE hMod=LoadLibrary(_T("SkinDll.dll")); funShowDlg ShowDlg; if(hMod) { ShowDlg=(funShowDlg)GetProcAddress(hMod,"ShowDlg"); if(ShowDlg) { ShowDlg(); } FreeLibrary(hMod); } } void CSlinMainDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 HMODULE hMod=LoadLibrary(_T("SkinDll.dll")); funGetBitFromDll GetBmp; //定义函数指针 if(hMod) { GetBmp=(funGetBitFromDll)GetProcAddress(hMod,"GetBitmapFromDll"); if(GetBmp) { HBITMAP hMap=GetBmp(); m_bit.SetBitmap(hMap); } FreeLibrary(hMod); } } //------------------------------------------------- class CSkin { public : virtual HBITMAP GetBkMap()=0; }; typedef CSkin* (_stdcall *funGetSkobj)(); typedef void (_stdcall *funRealeaseSkobj)(CSkin * cs); void CSlinMainDlg::OnBnClickedBtnC() { // TODO: 在此添加控件通知处理程序代码 HMODULE hMod=LoadLibrary(_T("SkinDll.dll")); funGetSkobj Getobj; funRealeaseSkobj Realeaseobj; if(hMod) { Getobj=(funGetSkobj)GetProcAddress(hMod,"GetSkobj"); Realeaseobj=(funRealeaseSkobj)GetProcAddress(hMod,"RealeaseSkobj"); if(Getobj) { CSkin * skin=Getobj(); m_bit.SetBitmap(skin->GetBkMap()); Realeaseobj(skin); } FreeLibrary(hMod); } }
人生无处不代码,没有代码不人生。