轉(zhuǎn)自: http://blog.163.com/xjchilli/blog/static/45347739200951013454647/
通常我們在調(diào)用DLL時所需的DLL文件必須位于以下三個目錄之一:
(1)Windows的系統(tǒng)目錄:\windows\system;
(2)DOS中path所指出的任何目錄;
(3)程序所在的目錄。
一、動態(tài)鏈接庫的結(jié)構(gòu)
動態(tài)鏈接庫中定義有兩種函數(shù):導(dǎo)出函數(shù)(export function)和內(nèi)部函數(shù)(internal function),
導(dǎo)出函數(shù)可以被其它模塊調(diào)用,內(nèi)部函數(shù)只能在庫內(nèi)部使用。我們在用C++定制動態(tài)庫文件時,
需要編寫的就是包含導(dǎo)出函數(shù)表的模塊定義文件(.DEF)和實現(xiàn)導(dǎo)出函數(shù)功能的C++文件。下面以
Sample.dll為例介紹DEF文件和實現(xiàn)文件的結(jié)構(gòu)。
1.模塊定義文件(.DEF)是一個或多個用于描述DLL屬性的模塊語句組成的文本文件,每個DEF文
件至少必須包含以下模塊定義語句:
·第一個語句必須是LIBRARY語句,指出DLL的名字;
·EXPORTS語句列出被導(dǎo)出函數(shù)的名字;
·可以使用DESCRIPTION語句描述DLL的用途(此句可選);
·";"對一行進行注釋(可選)。
2.實現(xiàn)文件
實現(xiàn)入口表函數(shù)的cpp文件中,包含DLL入口點處理的API函數(shù)和導(dǎo)出函數(shù)的代碼。
二、創(chuàng)建Sample.dll
1.首先創(chuàng)建Sample.dll的工程,啟動VC++5.0按以下步驟生成DLL工程:
·在選單中選擇File\New\Project;
·在工程列表中選擇Win32 Dynamic-Link Library;
·在Project Name中輸入工程名:Sample;
·單擊Location右邊按鈕,選擇c:\sample目錄;
·單擊OK完成,至此已創(chuàng)建了Sample.dll的工程文件。
2.創(chuàng)建Sample.def文件:
·在選單中選擇File\New\Text File;
·輸入以下代碼后保存文件名"Sample.def":
;Sample.def
;指出DLL的名字Sample,鏈接器將這個名字放到DLL導(dǎo)入庫中
LIBRARY Sample
;定義導(dǎo)出函數(shù)ShowMe()為例
EXPORTS
ShowMe
;def文件結(jié)束
3.創(chuàng)建Sample.cpp
.在選單中選擇File\New\C++ Source File項
.輸入以下代碼后保存文件名"Sample.cpp"
//Sample.cpp
#include 〈windows.h〉
int ShowMe(void);
//DllEntryPoint為DLL入口點函數(shù),負責(zé)初試化并終止DLL
BOOL WINAPI DllEntryPoint(HINSTANCE hDLL,DWORD dwReason,LPVOID Reserved)
{ switch(dwReason)
{ case DLL-PROCESS-ATTACH:
{ break; }
case DLL-PROCESS-DETACH:
{ break; } }
return TRUE; }
int ShowMe(void)
{ //蜂鳴器響一下
MessageBeep((WORD)-1);
MessageBox("你好!");
return 1; }
4.編譯DLL文件
從Build選單中選擇Build Sample.DLL,產(chǎn)生Sample.DLL文件,以后就可以隨時調(diào)用了。
三、在應(yīng)用程序中調(diào)用DLL文件
在應(yīng)用程序中要首先裝入DLL后才能調(diào)用導(dǎo)出表中的函數(shù),例如用MFC創(chuàng)建基于對話框的工
程Test,并在對話框上放置"Load"按鈕,你就必須添加裝載代碼。
1.首先在TestDlg.cpp的首部添加變量設(shè)置代碼:
//設(shè)置全局變量gLibSample用于存儲DLL句柄
HINSTANCE gLibSample=NULL;
//第二個變量ShowMe是指向DLL庫中ShowMe()函數(shù)的指針
typedef int( SHOWME)(void);
SHOWME ShowMe;
2.利用ClassWizard為"Load"按鈕添加裝載DLL的代碼:
Void CTestDlg::OnLoadButton()
{ //要添加的代碼如下
if(gLibMyDLL!=NULL)
{ MessageBox("The Sample.DLL has already been load.");
return; }
//裝載Sample.dll,未加路徑,將在三個默認路徑中尋找
gLibSample=LoadLibrary("SAMPLE.DLL");
//返回DLL中ShowMe()函數(shù)的地址
ShowMe=(SHOWME)GetProcAddress(gLibSample,"ShowMe"); }
3.只要DLL裝載成功,在應(yīng)用程序中就可以直接調(diào)用ShowMe()函數(shù)(本程序在Windows 95,VC++5.0中運行通過)。