/********************************************\
|????歡迎轉(zhuǎn)載, 但請(qǐng)保留作者姓名和原文鏈接, 祝您進(jìn)步并共勉!???? |
\********************************************/
動(dòng)態(tài)鏈接庫(kù)小結(jié)
作者: Jerry Cat
時(shí)間: 2006/09/02
鏈接: http://www.shnenglu.com/jerysun0818/archive/2006/09/02/11974.html
一.庫(kù)模塊:
?(略)
?
二.實(shí)現(xiàn)(可以使用Visual C++提供的向?qū)?lái)創(chuàng)建動(dòng)態(tài)鏈接庫(kù)和靜態(tài)鏈接庫(kù))
1>:Win32 Static Library
2>:Win32 Dynamic-Link-Library
3>:MFC AppWizard(dll)
Regular Dll With MFC statically linked
Regular Dll using shared MFC Dll
MFC Extension Dll (using shared MFC DLL)
?
三.Win32 DLL可以直接使用API,但是不可以直接使用MFC
MFC AppWizard可以直接使用MFC
四.
Regular Dll using shared MFC Dll
和
MFC Extension Dll
兩者比較
(表1 )
Regular Dll using shared MFC Dll
|
MFC Extension Dll (using shared MFC DLL)
|
1.??????
能導(dǎo)出
C
風(fēng)格函數(shù),全局變量
2.??????
能導(dǎo)出資源
|
1.??????
能導(dǎo)出
C
風(fēng)格函數(shù),全局變量
2.??????
能導(dǎo)出資源
3.??????
能導(dǎo)出
C++
類(lèi),成員函數(shù),重載函數(shù)
|
允許靜態(tài)或者動(dòng)態(tài)鏈接
MFC
類(lèi)庫(kù)
|
只能動(dòng)態(tài)鏈接
MFC
類(lèi)庫(kù)
|
它允許客戶(hù)程序靜態(tài)或者動(dòng)態(tài)鏈接
|
只允許客戶(hù)程序動(dòng)態(tài)鏈接
|
?
|
?
|
?
五.調(diào)用
1>
隱式鏈接
隱式鏈接時(shí),使用
DLL
的程序需要獲取以下信息:
?1.
包含了導(dǎo)出函數(shù)(類(lèi))聲明的頭文件
?2.
導(dǎo)入庫(kù)
(lib_
?3.
實(shí)際的
DLL
?
使用導(dǎo)出函數(shù)的源文件需要
#include
(
1
)的頭文件,調(diào)用導(dǎo)出函數(shù)與其它函數(shù)完全一樣
?
建立可執(zhí)行程序時(shí),需要導(dǎo)入
LIB
文件,可通過(guò)以下方式實(shí)現(xiàn)
1.??????
Project->Setting->Link
在
Object/Library Modules
編輯框中指定
LIB
名字
2.??????
#pragma comment(lib,”LIB
名字
”)
例如:我們想使用
opengl
函數(shù),我們可以
1.#include<gl/gl.h>
?#include<gl/glu.h>
2.#pragma comment(lib, “glu32.lib”)
?#pragma comment(lib, “opengl32.lib”)
2>
顯式鏈接
使用
DLL
的程序在運(yùn)行時(shí)通過(guò)函數(shù)調(diào)用來(lái)顯式加載或卸載
DLL
,并通過(guò)函數(shù)調(diào)用來(lái)調(diào)用
DLL
的導(dǎo)出函數(shù)。
?1.
使用
LoadLibrary
來(lái)加載
DLL
,得到模塊句柄
?2.
調(diào)用
GetProcessAddress
來(lái)獲取應(yīng)用程序要調(diào)用的導(dǎo)出函數(shù)指針
?3.
使用結(jié)束后,用
FreeLibrary
來(lái)卸載
DLL
?
例如:我們想使用
xxx.dll
中的
GetVersion
函數(shù),我們可以
typedef UINT (CALLBACK* LPFNDLLFUN)(DWORD,UINT);
HINSTANCE hDll = LoadLibrary(“xxx.dll”);
if(hDll != NULL)
{
??? LPFNDLLFUN lpfnDllFun1 = (LPFNDLLFUN)GetProcess(hDll, “GetVersion”);
??? if(lpfnDllFun1)
??? {
??????? // 你的函數(shù)調(diào)用
??? }
?? FreeLibrary(hDll);
}
posted on 2006-09-02 21:37
Jerry Cat 閱讀(1106)
評(píng)論(0) 編輯 收藏 引用