天天看點

dll調用

DLL的調用   調用DLL,首先需要将DLL檔案映像到使用者程序的位址空間中,然後才能進行函數調用,這個函數和程序内部一般函數的調用方法相同。Windows提供了兩種将DLL映像到程序位址空間的方法:   1、隐式的加載時連結    這種方法需要DLL工程經編譯産生的LIB檔案,此檔案中包含了DLL允許應用程式調用的所有函數的清單,當連結器發現應用程式調用了LIB檔案列出的 某個函數,就會在應用程式的可執行檔案的檔案映像中加入一些資訊,這些資訊指出了包含這個函數的DLL檔案的名字。當這個應用程式運作時,也就是它的可執 行檔案被作業系統産生映像檔案時,系統會檢視這個映像檔案中關于DLL的資訊,然後将這個DLL檔案映像到程序的位址空間。   系統通過DLL檔案的名稱,試圖加載這個檔案到程序位址空間時,它尋找DLL 檔案的路徑按照先後順序如下:   ·程式運作時的目錄,即可執行檔案所在的目錄;   ·目前程式工作目錄    ·系統目錄:對于Windows95/98來說,可以調用GetSystemDirectory函數來得到,對于WindowsNT/2000來說,指 的是32位Windows的系統目錄,也可以調用GetSystemDirectory函數來得到,得到的值為SYSTEM32。   ·Windows目錄   ·列在PATH環境變量中的所有目錄   VC中加載DLL的LIB檔案的方法有以下三種:   ①LIB檔案直接加入到工程檔案清單中   在VC中打開File View一頁,選中工程名,單擊滑鼠右鍵,然後選中"Add Files to Project"菜單,在彈出的檔案對話框中選中要加入DLL的LIB檔案即可。   ②設定工程的 Project Settings來加載DLL的LIB檔案   打開工程的 Project Settings菜單,選中Link,然後在Object/library modules下的文本框中輸入DLL的LIB檔案。   ③通過程式代碼的方式    加入預編譯指令#pragma comment (lib,"*.lib"),這種方法優點是可以利用條件預編譯指令連結不同版本的LIB檔案。因為,在Debug方式下,産生的LIB檔案是Debug 版本,如Regd.lib;在Release方式下,産生的LIB檔案是Release版本,如Regr.lib。   當應用程式對DLL的LIB檔案加載後,還需要把DLL對應的頭檔案(*.h)包含到其中,在這個頭檔案中給出了DLL中定義的函數原型,然後聲明。   2、顯式的運作時連結    隐式連結雖然實作較簡單,但除了必須的*.dll檔案外還需要DLL的*.h檔案和*.lib檔案,在那些隻提供*.dll檔案的場合就無法使用,而隻 能采用顯式連結的方式。這種方式通過調用API函數來完成對DLL的加載與解除安裝,其能更加有效地使用記憶體,在編寫大型應用程式時往往采用此方式。這種方法 程式設計具體實作步驟如下:   ①使用Windows API函數Load Library或者MFC提供的AfxLoadLibrary将DLL子產品映像到程序的記憶體空間,對DLL子產品進行動态加載。   ②使用GetProcAddress函數得到要調用DLL中的函數的指針。   ③不用DLL時,用Free Library函數或者AfxFreeLibrary函數從程序的位址空間顯式解除安裝DLL。   VC中調用執行個體   資料加密是計算機安全領域的重要内容,其基本思想是通過變換資訊的表現形式來保護敏感資訊,使非授權者不能了解被保護資訊的内容。常見的資料加密算法有:DES,IDEA,RSA,ECC,AES,MD5,SHA等。    《共享軟體加密算法庫》是一款針對個人、企業開發共享軟體的加密工具,支援Windows平台下各類開發工具:VC、VB、Delphi、PB、VFP 等,算法庫內建的算法有:BlowFish、MD5、Secret16、AES、SHA、CRC32、RSA、DES、字元串加/解密、檔案加/解密等多 種功能強愛貓撲.愛生活。其提供了DLL檔案-Reg.dll,可以通過複用它來實作資料加密與解密。   1、隐式連結   其提供了 Reg.h與Reg.lib兩個隐式連結所必須的檔案,是以可以采用此種方式。   ①在VC中打開File View一頁,選中工程名,單擊滑鼠右鍵,然後選中"Add Files to Project"菜單,在彈出的檔案對話框中選中要加入Reg.lib。    ②在VC中打開File View一頁,選中Header files,單擊滑鼠右鍵,然後選中"Add Files to Folder"菜單,在彈出的檔案對話框中選中要加入Reg.h,然後在工程相應的頭檔案中加入#include "Reg.h"。在Reh.h頭檔案中給出了DLL中定義的函數原型及聲明。   如:加密函數原型及聲明為extern "C" BOOL WINAPI File Encrypt(LPCTSTR lpInputFileName, LPCTSTR lpOutputFileName, LPCTSTR lpKey, LPCTSTR lpRegisterCode);解密函數原型及聲明為extern "C" BOOL WINAPI File Decrypt(LPCTSTR lpInputFileName, LPCTSTR lpOutputFileName, LPCTSTR lpKey, LPCTSTR lpRegisterCode)。其中對于WINAPI宏,把它加到函數原型定義前,系統會把它翻譯為适當的調用方式,在Win32中,是把它翻譯為 _stdcall調用方式。   ③直接調用所需要的加密與解密函數,如調用File Encrypt()函數實作文本檔案和二進制檔案的加密,調用File Decrypt()函數實作文本檔案和二進制檔案的解密,調用時的參數要與函數定義參數相符合。   2、顯式連結   如果隻提供Reg.dll一個檔案,那麼須用此種方式。   ①加密子產品:調用File Encrypt()函數實作文本檔案和二進制檔案的加密。 //裝載加密/解密DLL HINSTANCE hdll=::Load Library ("Reg.dll"); //通過類型定義語句typedef來定義函數指針類型 Typedef BOOL (_stdcall *lpFileEncrypt)(LPCTSTR, LPCTSTR, LPCTSTR, LPCTSTR); //函數聲明 LpFileEncrypt FileEncrypt1; //擷取加密函數File Encrypt的函數指針 FileEncrypt1=(lpFileEncrypt)::GetProcAddress(hdll,"FileEncrypt"); //調用DLL中加密函數File Encrypt對檔案加密,user-12345678為軟體注冊号 FileEncrypt1(加密源檔案名,加密生成目标檔案名,密碼,"user-12345678"); //釋放DLL子產品 ::AfxFreeLibrary(hdll);   ②解密子產品:調用File Decrypt()函數實作文本檔案和二進制檔案的解密。 //裝載加密/解密DLL HINSTANCE hdll=::Load Library ("Reg.dll"); //通過類型定義語句typedef來定義函數指針類型 Typedef BOOL (_stdcall *lpFileDecrypt)(LPCTSTR, LPCTSTR, LPCTSTR, LPCTSTR); //函數聲明 LpFileDecrypt FileDecrypt2; //擷取解密函數File Decrypt的函數指針 FileDecrypt2=(lpFileDecrypt)::GetProcAddress(hdll,"FileDecrypt"); //調用DLL中解密函數FileDecrypt對檔案加密,user-12345678為軟體注冊号 FileDecrypt2(解密源檔案名,解密生成目标檔案名,密碼,"user-12345678"); //釋放DLL子產品 ::AfxFreeLibrary(hdll);