環(huán)境下運行。動(dòng)態(tài)鏈接庫不僅可以作為一個(gè)運行模塊,包括函數代碼,而且可以包含程序以外的任何數據或資源(位圖、圖標
等等)。動(dòng)態(tài)鏈接庫就是給應用程序提供函數或者資源。
動(dòng)態(tài)鏈接與靜態(tài)鏈接是相對立的。靜態(tài)鏈接的時(shí)候,可執行程序內包含了所訪(fǎng)問(wèn)的函數的代碼,可執行程序占用的空間較
大;但運行時(shí),不需要其他模塊支持,從而速度相對較快。動(dòng)態(tài)鏈接的可執行程序中不包含動(dòng)態(tài)訪(fǎng)問(wèn)的函數代碼,僅僅包含對
它的參考,運行時(shí)需要其他模塊(DLL)的支持,速度相對較慢。
動(dòng)態(tài)鏈接庫是Windows的一種極其重要的技術(shù)。它使得開(kāi)發(fā)人員可以通過(guò)編寫(xiě)動(dòng)態(tài)鏈接庫,方便靈活的實(shí)現大型程序的開(kāi)
發(fā),按自己的意愿對操作系統進(jìn)行擴展。
下面通過(guò)例子介紹如何在動(dòng)態(tài)鏈接庫中定義函數、資源、和類(lèi)以及如何在工程中使用動(dòng)態(tài)鏈接庫中已定義的函數、資源、
類(lèi)。
一、 函數的定義和使用方法:
第一步:
運行AppWizard,定義項目名為mydll,選擇MFC AppWizard(dll),而不是MFC AppWizards(exe)。
第二步:
在這個(gè)例子中,只有一個(gè)AppWizard屏幕出現,選擇MFC擴展DLL(MFC Extension DLL (using shared MFC DLL),點(diǎn)擊
FINISH生成工程。
第三步:
點(diǎn)擊File中的New,選擇C/C++ Header File,File Name中輸入dll,點(diǎn)擊OK,創(chuàng )建dll.h。輸入extern "C" __declspec(dllexport)
int fun(int x1,int x2,int x3); ,保存。
第四步:
點(diǎn)擊File中的New,選擇C++ Source File,File Name中輸入dll,點(diǎn)擊OK,創(chuàng )建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 , 重新生成一個(gè)工程,選擇MFC AppWizards(exe),項目名為mydlltest , 選擇Single
Document ,點(diǎn)擊FINISH,生成一個(gè)新的工程。選擇菜單中的Project àSet Active Project àmydlltest ,將mydlltest設為當前活動(dòng)工程
。
第六步:
拷貝…\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上點(diǎn)擊右鍵,選擇Add files to Project ,將mydll.dll添加到工程。
好了,我們的工作做完了,運行一下看看吧!
二、 類(lèi)的添加和使用步驟:
在mydll中生成一個(gè)新類(lèi),類(lèi)的聲明處改為class AFX_EXT_CLASS CMyClass ,在此類(lèi)中和其他類(lèi)一樣添加自己需要的變量
和函數,編譯生成新的dll和lib,重復上面的第六步,在mydlltest中利用上面的方法生成一個(gè)myclass.h文件,拷貝mydll中
myclass.h的所有代碼到新生成的myclass.h中。在需要使用dll中CmyClass類(lèi)的文件中包含myclass.h,然后我們就可以向其他類(lèi)
一樣使用該類(lèi)了。
三、 字符串的定義和使用
在mydll中定義字符串資源,編譯生成新的dll和lib,重復上面的第六步,在mydlltest中的myclass.h中添加 #define IDS_MYSTR
1(假設我們定義的字符串資源的ID號為IDS_MYSTR),在需要是要該字符串的地方添加#include "myclass.h",即可使用該字
符串了。
CString str2;
str2.LoadString(IDS_MYSTR);
四、 對話(huà)框的定義和使用
在mydll中定義對話(huà)框資源,生成一個(gè)新類(lèi)CDlg,類(lèi)的聲明處改為class AFX_EXT_CLASS CDlg : public CDialog ,像其他對
話(huà)框一樣定義對話(huà)框的屬性和功能,編譯生成新的dll和lib,重復上面的第六步,在mydlltest中利用上面的方法生成一個(gè)dlg.h文件
,拷貝mydll中dlg.h的所有代碼到新生成的dlg.h中。在需要使用dll中此對話(huà)框資源的文件中包含dlg.h,然后我們就可以向其他
對話(huà)框一樣使用此對話(huà)框了。
CDlg dlg;
dlg.DoModal();
好了,到這里我們所有的功能就都實(shí)現了,快編譯運行一下吧!
聯(lián)系客服