/********************************************\
|????歡迎轉載, 但請保留作者姓名和原文鏈接, 祝您進步并共勉!???? |
\********************************************/
動態鏈接庫小結
作者: Jerry Cat
時間: 2006/09/02
鏈接: http://www.shnenglu.com/jerysun0818/archive/2006/09/02/11974.html
一.庫模塊:
?(略)
?
二.實現(可以使用Visual C++提供的向導來創建動態鏈接庫和靜態鏈接庫)
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.??????
能導出
C
風格函數,全局變量
2.??????
能導出資源
|
1.??????
能導出
C
風格函數,全局變量
2.??????
能導出資源
3.??????
能導出
C++
類,成員函數,重載函數
|
允許靜態或者動態鏈接
MFC
類庫
|
只能動態鏈接
MFC
類庫
|
它允許客戶程序靜態或者動態鏈接
|
只允許客戶程序動態鏈接
|
?
|
?
|
?
五.調用
1>
隱式鏈接
隱式鏈接時,使用
DLL
的程序需要獲取以下信息:
?1.
包含了導出函數(類)聲明的頭文件
?2.
導入庫
(lib_
?3.
實際的
DLL
?
使用導出函數的源文件需要
#include
(
1
)的頭文件,調用導出函數與其它函數完全一樣
?
建立可執行程序時,需要導入
LIB
文件,可通過以下方式實現
1.??????
Project->Setting->Link
在
Object/Library Modules
編輯框中指定
LIB
名字
2.??????
#pragma comment(lib,”LIB
名字
”)
例如:我們想使用
opengl
函數,我們可以
1.#include<gl/gl.h>
?#include<gl/glu.h>
2.#pragma comment(lib, “glu32.lib”)
?#pragma comment(lib, “opengl32.lib”)
2>
顯式鏈接
使用
DLL
的程序在運行時通過函數調用來顯式加載或卸載
DLL
,并通過函數調用來調用
DLL
的導出函數。
?1.
使用
LoadLibrary
來加載
DLL
,得到模塊句柄
?2.
調用
GetProcessAddress
來獲取應用程序要調用的導出函數指針
?3.
使用結束后,用
FreeLibrary
來卸載
DLL
?
例如:我們想使用
xxx.dll
中的
GetVersion
函數,我們可以
typedef UINT (CALLBACK* LPFNDLLFUN)(DWORD,UINT);
HINSTANCE hDll = LoadLibrary(“xxx.dll”);
if(hDll != NULL)
{
??? LPFNDLLFUN lpfnDllFun1 = (LPFNDLLFUN)GetProcess(hDll, “GetVersion”);
??? if(lpfnDllFun1)
??? {
??????? // 你的函數調用
??? }
?? FreeLibrary(hDll);
}
posted on 2006-09-02 21:37
Jerry Cat 閱讀(1098)
評論(0) 編輯 收藏 引用