1. 程式人生 > >MFC靜態載入dll和動態載入dll示例

MFC靜態載入dll和動態載入dll示例

一、靜態載入DLL 

函式的定義和使用方法:

第一步:

   執行AppWizard,定義專案名為mydll,選擇MFC AppWizard(dll),而不是MFC AppWizards(exe)

第二步:

   在這個例子中,只有一個AppWizard螢幕出現,選擇MFC擴充套件DLL(MFC Extension DLL (using shared MFC DLL),點選FINISH生成工程。

第三步:

   點選File中的New,選擇C/C++ Header FileFile Name中輸入dll,點選OK,建立dll.h。輸入extern "C" __declspec(dllexport) int fun(int x1,int x2,int x3); 

,儲存。

第四步:

   點選File中的New,選擇C++ Source FileFile Name中輸入dll,點選OK,建立dll.cpp。輸入

#include "stdafx.h"
#include "dll.h"
extern "C" __declspec(dllexport) int fun(int x1,int x2,int x3)
{
  return x1+x2+x3;
}

編譯生成mydll.dllmydll.lib 

第五步:

  選擇Project Add To Project 中的New , 重新生成一個工程,選擇MFC AppWizards(exe),專案名為

mydlltest , 選擇Single Document ,點選FINISH,生成一個新的工程。選擇選單中的Project Set as Active Project mydlltest ,mydlltest設為當前活動工程。

第六步:

  拷貝…/mydll/debug/mydll.dll 到 ../mydlltest/debug/下,拷貝…/mydll/debug/mydll.lib到…/mydlltest/目錄下。

第七步:

  在mydlltestView.cpp中的#endif下新增

  extern "C" __declspec(dllimport) int fun(int x1,int x2,int x3);

  在void CMydlltestView::OnDraw(CDC* pDC)中新增程式碼如下:

      void CMydlltestView::OnDraw(CDC* pDC)
   {
    CMydlltestDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    int x=fun(1,2,3);
    CString str;
    str.Format("%d",x);
    pDC->TextOut(10,10,str);
   }

第八步:

  在WorkSpace中的mydlltest files上點選右鍵,選擇Add files to Project ,mydll.lib新增到工程。

至此,靜態載入dll工作已完成。

二、動態載入DLL 

從靜態載入的步驟六開始:

void CMydlltestView::OnDraw(CDC* pDC)中新增程式碼如下:

void CMydlltestView::OnDraw(CDC* pDC)
   {
    CMydlltestDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
int x;
typedef int(*padd)(int x1,int x2,int x3);
HINSTANCE hdll;
padd add;
hdll = LoadLibrary("mydll.dll");
add =(padd)GetProcAddress(hdll,"fun");
x = add(2,6,5);
CString str;
str.Format("%d",x);
pDC->TextOut(10,10,str);
}

WorkSpace中的mydlltest files上點選右鍵,選擇Add files to Project ,mydll.lib新增到工程。 

三、動態載入和靜態載入區別: 

靜態連結庫與動態連結庫都是共享程式碼的方式,如果採用靜態連結庫,則無論你願不願意,lib中的指令都被直接包含在最終生成的EXE檔案中了。但是若使用DLL,該DLL不必被包含在最終EXE檔案中,EXE檔案執行時可以“動態”地引用和解除安裝這個與EXE獨立的DLL檔案。靜態連結庫和動態連結庫的另外一個區別在於靜態連結庫中不能再包含其他的動態連結庫或者靜態庫,而在動態連結庫中還可以再包含其他的動態或靜態連結庫。

http://blog.csdn.net/m372897500/article/details/7246368 

http://blog.csdn.net/m372897500/article/details/7246418

待完善