程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> 例程詳析動態鏈接庫

例程詳析動態鏈接庫

編輯:C語言基礎知識

  動態鏈接庫(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 File,File Name中輸入dll,點擊OK,創建dll.h。輸入extern "C" __declspec(dlleXPort) int fun(int x1,int x2,int x3); ,保存。
  
  第四步:
  
   點擊File中的New,選擇C++ Source 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設為當前活動工程。
  
  第六步:
  
  拷貝…mydlldebugmydll.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.DoModal();
  
  好了,到這裡我們所有的功能就都實現了,快編譯運行一下吧!怎麼樣?還滿足嗎?
  
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved