1. 程式人生 > >向動態連結庫中新增類和資源-並訪問動態連結庫中的類和資源

向動態連結庫中新增類和資源-並訪問動態連結庫中的類和資源

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