VC DLL加載方法_第1頁
VC DLL加載方法_第2頁
VC DLL加載方法_第3頁
VC DLL加載方法_第4頁
VC DLL加載方法_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、調(diào)用DLL,首先需要將DLL文件映像到用戶進程的地址空間中,然后才能進行函數(shù)調(diào)用,這個函數(shù)和進程內(nèi)部一般函數(shù)的調(diào)用方法相同。Windows提供了兩種將DLL映像到進程地址空間的方法:1. 隱式的加載時鏈接這種方法需要DLL工程經(jīng)編譯產(chǎn)生的LIB文件,此文件中包含了DLL允許應(yīng)用程序調(diào)用的所有函數(shù)的列表,當(dāng)鏈接器發(fā)現(xiàn)應(yīng)用程序調(diào)用了LIB文件列出的某個函數(shù),就會在應(yīng)用程序的可執(zhí)行文件的文件映像中加入一些信息,這些信息指出了包含這個函數(shù)的DLL文件的名字。當(dāng)這個應(yīng)用程序運行時,也就是它的可執(zhí)行文件被操作系統(tǒng)產(chǎn)生映像文件時,系統(tǒng)會查看這個映像文件中關(guān)于DLL的信息,然后將這個DLL文件映像到進程的地址

2、空間。系統(tǒng)通過DLL文件的名稱,試圖加載這個文件到進程地址空間時,它尋找DLL 文件的路徑按照先后順序如下:·程序運行時的目錄,即可執(zhí)行文件所在的目錄;·當(dāng)前程序工作目錄·系統(tǒng)目錄:對于Windows95/98來說,可以調(diào)用GetSystemDirectory函數(shù)來得到,對于WindowsNT/2000 來說,指的是32位Windows的系統(tǒng)目錄,也可以調(diào)用GetSystemDirectory函數(shù)來得到,得到的值為SYSTEM32。·Windows目錄·列在PATH環(huán)境變量中的所有目錄VC中加載DLL的LIB文件的方法有以下三種:LIB文件直接

3、加入到工程文件列表中在VC中打開File View一頁,選中工程名,單擊鼠標右鍵,然后選中“Add Files to Project”菜單,在彈出的文件對話框中選中要加入DLL的LIB文件即可。設(shè)置工程的 Project Settings來加載DLL的LIB文件打開工程的 Project Settings菜單,選中Link,然后在Object/library modules下的文本框中輸入DLL的LIB文件。通過程序代碼的方式加入預(yù)編譯指令#pragma comment (lib,”*.lib”),這種方法優(yōu)點是可以利用條件預(yù)編譯指令鏈接不同版本的LIB文件。因為,在Debug方式下,產(chǎn)生的L

4、IB文件是Debug 版本,如Regd.lib;在Release方式下,產(chǎn)生的LIB文件是Release版本,如Regr.lib。當(dāng)應(yīng)用程序?qū)LL的LIB文件加載后,還需要把DLL對應(yīng)的頭文件(*.h)包含到其中,在這個頭文件中給出了DLL中定義的函數(shù)原型,然后聲明。2 顯式的運行時鏈接隱式鏈接雖然實現(xiàn)較簡單,但除了必須的*.dll文件外還需要DLL的*.h文件和*.lib文件,在那些只提供*.dll文件的場合就無法使用,而只能采用顯式鏈接的方式。這種方式通過調(diào)用API函數(shù)來完成對DLL的加載與卸載,其能更加有效地使用內(nèi)存,在編寫大型應(yīng)用程序時往往采用此方式。這種方法編程具體實現(xiàn)步驟如下:使

5、用Windows API函數(shù)Load Library或者MFC提供的AfxLoadLibrary將DLL模塊映像到進程的內(nèi)存空間,對DLL模塊進行動態(tài)加載。使用GetProcAddress函數(shù)得到要調(diào)用DLL中的函數(shù)的指針。不用DLL時,用Free Library函數(shù)或者AfxFreeLibrary函數(shù)從進程的地址空間顯式卸載DLL。例:在應(yīng)用程序中調(diào)用dll文件 在應(yīng)用程序中要首先裝入dll后才能調(diào)用導(dǎo)出表中的函數(shù),例如用mfc 創(chuàng)建基于對話框的工程test,并在對話框上放置"load"按鈕,先添加裝載代碼。1.首先在testdlg.cpp的首部添加變量設(shè)置代碼: /設(shè)置

6、全局變量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;

7、 /裝載sample.dll,未加路徑,將在三個默認路徑中尋找 (1)windows的系統(tǒng)目錄:windowssystem; /(2)dos中path所指出的任何目錄; /(3)程序所在的目錄; glibsample=loadlibrary("sample.dll"); /返回dll中showme()函數(shù)的地址 showme=(showme)GetProcAddress(glibsample,"showme");/*應(yīng)用程序使用DLL可以采用兩種方式:一種是隱式鏈接,另一種是顯式鏈接。在使用DLL之前首先要知道DLL中函數(shù)的結(jié)構(gòu)信息。Visual C+6

8、.0在VCbin目錄下提供了一個名為Dumpbin.exe的小程序,用它可以查看DLL文件中的函數(shù)結(jié)構(gòu)。另外,Windows系統(tǒng)將遵循下面的搜索順序來定位DLL: 1包含EXE文件的目錄,2進程的當(dāng)前工作目錄, 3Windows系統(tǒng)目錄, 4Windows目錄,5列在Path環(huán)境變量中的一系列目錄。1隱式鏈接隱式鏈接就是在程序開始執(zhí)行時就將DLL文件加載到應(yīng)用程序當(dāng)中。實現(xiàn)隱式鏈接很容易,只要將導(dǎo)入函數(shù)關(guān)鍵字_declspec(dllimport)函數(shù)名等寫到應(yīng)用程序相應(yīng)的頭文件中就可以了。下面的例子通過隱式鏈接調(diào)用MyDll.dll庫中的Min函數(shù)。首先生成一個項目為TestDll,在Dll

9、Test.h、DllTest.cpp文件中分別輸入如下代碼:/Dlltest.h#pragma comment(lib,"MyDll.lib")extern "C"_declspec(dllimport) int Max(int a,int b);extern "C"_declspec(dllimport) int Min(int a,int b);/TestDll.cpp#include#include"Dlltest.h"void main()int a;a=min(8,10)printf("比較的結(jié)

10、果為%dn",a);在創(chuàng)建DllTest.exe文件之前,要先將MyDll.dll和MyDll.lib拷貝到當(dāng)前工程所在的目錄下面,也可以拷貝到windows的System目錄下。如果DLL使用的是def文件,要刪除TestDll.h文件中關(guān)鍵字extern "C"。TestDll.h文件中的關(guān)鍵字Progam commit是要Visual C+的編譯器在link時,鏈接到MyDll.lib文件,當(dāng)然,開發(fā)人員也可以不使用#pragma comment(lib,"MyDll.lib")語句,而直接在工程的Setting->Link頁的Ob

11、ject/Moduls欄填入MyDll.lib既可。2顯式鏈接顯式鏈接是應(yīng)用程序在執(zhí)行過程中隨時可以加載DLL文件,也可以隨時卸載DLL文件,這是隱式鏈接所無法作到的,所以顯式鏈接具有更好的靈活性,對于解釋性語言更為合適。不過實現(xiàn)顯式鏈接要麻煩一些。在應(yīng)用程序中用LoadLibrary或MFC提供的AfxLoadLibrary顯式的將自己所做的動態(tài)鏈接庫調(diào)進來,動態(tài)鏈接庫的文件名即是上述兩個函數(shù)的參數(shù),此后再用GetProcAddress()獲取想要引入的函數(shù)。自此,你就可以象使用如同在應(yīng)用程序自定義的函數(shù)一樣來調(diào)用此引入函數(shù)了。在應(yīng)用程序退出之前,應(yīng)該用FreeLibrary或MFC提供的A

12、fxFreeLibrary釋放動態(tài)鏈接庫。下面是通過顯式鏈接調(diào)用DLL中的Max函數(shù)的例子。#include #includevoid main(void)typedef int(*pMax)(int a,int b);typedef int(*pMin)(int a,int b);HINSTANCE hDLL;PMax MaxHDLL=LoadLibrary("MyDll.dll");/加載動態(tài)鏈接庫MyDll.dll文件;Max=(pMax)GetProcAddress(hDLL,"Max");A=Max(5,8);Printf("比較的結(jié)

13、果為%dn",a);FreeLibrary(hDLL);/卸載MyDll.dll文件; 在上例中使用類型定義關(guān)鍵字typedef,定義指向和DLL中相同的函數(shù)原型指針,然后通過LoadLibray()將DLL加載到當(dāng)前的應(yīng)用程序中并返回當(dāng)前DLL文件的句柄,然后通過GetProcAddress()函數(shù)獲取導(dǎo)入到應(yīng)用程序中的函數(shù)指針,函數(shù)調(diào)用完畢后,使用FreeLibrary()卸載DLL文件。在編譯程序之前,首先要將DLL文件拷貝到工程所在的目錄或Windows系統(tǒng)目錄下。使用顯式鏈接應(yīng)用程序編譯時不需要使用相應(yīng)的Lib文件。另外,使用GetProcAddress()函數(shù)時,可以利用MAKEINTRESOURCE()函數(shù)直接使用DLL中函數(shù)出現(xiàn)的順序號,如將GetProcAddress(hDLL,"Min")改為GetProcAddress(hDLL, MAKE

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論