動態鏈接庫(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();
好了,到這裡我們所有的功能就都實現了,快編譯運行一下吧!怎麼樣?還滿足嗎?