您的位置:首页 > 其它

程序调用动态链接库中的方法,位图,类

2013-09-11 15:29 417 查看
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: