向動態連結庫中新增類和資源-並訪問動態連結庫中的類和資源
1#define EXPORTDLL _declspec(dllimport); //定義一個巨集
EXPORTDLL class CShowDlg
{
public:
virtual void _stdcall ShowNote(char *pszText)//客戶端想要訪問動態連結庫中的方法,此方法必須宣告為虛擬函式
{
MessageBox(NULL,pszText,"提示",0);
}
};
CShowDlg* _stdcall GetShowDlg()
{
return new CShowDlg();
}
void _stdcall ReleaseShowDlg(CShowDlg *pShowDlg)
{
delete pShowDlg;
}
2.向動態連結庫中匯入資原始檔,看一下資原始檔的ID
將動態連結庫中的函式匯出,並防止C++編譯器對函式名重新命名改變
.def檔案
定義EXPORTS 點將兩個函式匯出
GetShowDlg=GetShowDlg;
ReleaseShowDlg=ReleaseShowDlg
3.如何訪問動態連結庫中的類和資源
為了訪問MFC中動態連結庫中定義類
在應用程式中,定義了一個和MFC中動態連結庫中相同的類,抽象類
只有宣告,沒有實現
在應用程式中,定義一個抽象類
Class CShowDlg
{
public:
virtual void _stdcall ShowNoteDlg(char* pszText)=0;
}
定義函式指標型別
typedef ShowDlg*(_stdcall *funGetShowDlg)();
typedef void (_stdcall *funReleaseShowDlg) (CShowDlg* pShowDlg);
4.定義按鈕事件
//載入動態資料庫
HMODULE hMod=LoadLibrary("./test.dll");
if(hMod!=NULL)
{
//獲取動態資料庫中的GetShowDlg函式
funGetShowDlg GetShowDlg=(funGetShowDlg)GetProcessAdress(hMod,"GetShowDlg");
funReleaseShowDlg ReleaseShowDlg=(funReleaseShowDlg)GetProcessAdress(hMod,"ReleaseShowDlg");
if(GetShowDlg!=NULL&& ReleaseShowDlg!=NULL)
{
CShowDlg * pShowDlg=GetShowDlg();
pShowDlg->ShowNoteDlg("程式設計詞典")
ReleaseShowDlg(pShowDlg);//釋放pShowDlg物件
}
FreeLibrary(pShowDlg);
//載入資源
HMODULE hRes=LoadLibraryEx("./tell.dlll”,NULL,Load_LIBRARY_AS_DATAFILE);
if(hRes!=NULL)
{
HANDLE HbmP=LoadImage(hRes,MAKEINTRESOUCE(1000),IMAGE_BITMAP,0,0,0);
if(hBmp!=NULL)
{
HBITMAP holdBmp=m_Bmp.SetBitmap((HBITMAP)hBmp);
if(oldBmp)
{
deleteobject(holdBmp);
}
FreeLibrary(hRes);
}
}
}
如果有不正確的地方,請參考我的資源 dllTest