例程詳析動態鏈接庫

動態鏈接庫(DLL, Dynamic-Link Library)是可執行的模塊,但它沒有自己的堆棧,必須在調用動態鏈接庫函數的程序環境下運行。動態鏈接庫不僅可以作爲一個運行模塊,包括函數代碼,而且可以包含程序以外的任何數據或資源(位圖、圖標等等)。動態鏈接庫就是給應用程序提供函數或者資源。

  動態鏈接與靜態鏈接是相對立的。靜態鏈接的時候,可執行程序內包含了所訪問的函數的代碼,可執行程序佔用的空間較大;但運行時,不需要其他模塊支持,從而速度相對較快。動態鏈接的可執行程序中不包含動態訪問的函數代碼,僅僅包含對它的參考,運行時需要其他模塊(DLL)的支持,速度相對較慢。

  動態鏈接庫是Windows的一種極其重要的技術。它使得開發人員可以通過編寫動態鏈接庫,方便靈活的實現大型程序的開發,按自己的意願對操作系統進行擴展。

  下面通過例子介紹如何在動態鏈接庫中定義函數、資源、和類以及如何在工程中使用動態鏈接庫中已定義的函數、資源、類。

 


  一、函數的定義和使用方法:

  第一步:

   運行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 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",str);
    pDC->TextOut(10,10,x);
   }

  第八步:

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

 


  二、類的添加和使用步驟:

  在mydll中生成一個新類,類的聲明處改爲class AFX_EXT_CLASS CMyClass ,在此類中和其他類一樣添加自己需要的變量和函數,編譯生成新的dlllib,重複上面的第六步,在mydlltest中利用上面的方法生成一個myclass.h文件,拷貝mydllmyclass.h的所有代碼到新生成的myclass.h中。在需要使用dllCmyClass類的文件中包含myclass.h,然後我們就可以向其他類一樣使用該類了。

  三、字符串的定義和使用

  在mydll中定義字符串資源,編譯生成新的dlllib,重複上面的第六步,在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 ,像其他對話框一樣定義對話框的屬性和功能,編譯生成新的dlllib,重複上面的第六步,在mydlltest中利用上面的方法生成一個dlg.h文件,拷貝mydlldlg.h的所有代碼到新生成的dlg.h中。在需要使用dll中此對話框資源的文件中包含dlg.h,然後我們就可以向其他對話框一樣使用此對話框了。

  CDlg dlg;
  dlg.DoModal()

  好了,到這裏我們所有的功能就都實現了,快編譯運行一下吧!怎麼樣?還滿意嗎?

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章