例程詳析動態連結庫 (轉)

gugu99發表於2008-01-28
例程詳析動態連結庫 (轉)[@more@]

  例程詳析動態連結庫
  bull77


  動態連結庫(DLL,即 Dynamic-Link Library)是可的模組,但它沒有自己的堆疊,必須在動態連結庫的

環境下執行。動態連結庫不僅可以作為一個執行模組,包括函式程式碼,而且可以包含程式以外的任何資料或資源(點陣圖、圖示

等等)。動態連結庫就是給應用程式提供函式或者資源。

  動態連結與靜態連結是相對立的。靜態連結的時候,可執行程式內包含了所訪問的函式的程式碼,可執行程式佔用的空間較

大;但執行時,不需要其他模組支援,從而速度相對較快。動態連結的可執行程式中不包含動態訪問的函式程式碼,僅僅包含對

它的參考,執行時需要其他模組(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 File,File Name中輸入dll,點選OK,建立dll.h。輸入extern "C" __declspec(dllexport)

int fun(int x1,int x2,int x3); ,儲存。

  第四步:

   點選File中的New,選擇C++ File,File 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.dll和mydll.lib。

  第五步:

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

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

  第六步:

  複製…mydlldemydll.dll 到 ..mydlltestdebug下,複製…mydlldebugmydll.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",str);
    pDC->TextOut(10,10,x);
   }

  第八步:

  在WorkSpace中的mydlltest files上點選右鍵,選擇Add files to Project ,將mydll.dll新增到工程。
好了,我們的工作做完了,執行一下看看吧!

二、 類的新增和使用步驟:

  在mydll中生成一個新類,類的宣告處改為class AFX_EXT_CLASS CMyClass ,在此類中和其他類一樣新增自己需要的變數

和函式,編譯生成新的dll和lib,重複上面的第六步,在mydlltest中利用上面的方法生成一個myclass.h,複製mydll中

myclass.h的所有程式碼到新生成的myclass.h中。在需要使用dll中CmyClass類的檔案中包含myclass.h,然後我們就可以向其他類

一樣使用該類了。

  三、 字串的定義和使用

  在mydll中定義字串資源,編譯生成新的dll和lib,重複上面的第六步,在mydlltest中的myclass.h中新增 #define IDS_MYSTR

1(假設我們定義的字串資源的ID號為IDS_MYSTR),在需要是要該字串的地方新增#include "myclass.h",即可使用該字

符串了。

  CString str2;
  str2.LoadString(IDS_MYSTR);

  四、 對話方塊的定義和使用

  在mydll中定義對話方塊資源,生成一個新類CDlg,類的宣告處改為class AFX_EXT_CLASS CDlg : public CDialog ,像其他對

話框一樣定義對話方塊的屬性和功能,編譯生成新的dll和lib,重複上面的第六步,在mydlltest中利用上面的方法生成一個dlg.h檔案

,複製mydll中dlg.h的所有程式碼到新生成的dlg.h中。在需要使用dll中此對話方塊資源的檔案中包含dlg.h,然後我們就可以向其他

對話方塊一樣使用此對話方塊了。

  CDlg dlg;
  dlg.odal();

  好了,到這裡我們所有的功能就都實現了,快編譯執行一下吧!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-998615/,如需轉載,請註明出處,否則將追究法律責任。

相關文章