C++中調(diào)用DLL實(shí)現(xiàn)數(shù)據(jù)加密

字號(hào):

模塊化思想貫穿于軟件工程各個(gè)發(fā)展階段,模塊復(fù)用是構(gòu)建大系統(tǒng)的一種重要思想。模塊復(fù)用方法有:函數(shù)、函數(shù)庫(kù)、動(dòng)態(tài)鏈接庫(kù)、COM。其都是基于模塊化的基本思想。函數(shù)是最簡(jiǎn)單的模塊化思想,也是后面方法的基礎(chǔ),甚至是一個(gè)應(yīng)用程序的基礎(chǔ)。函數(shù)庫(kù)是函數(shù)的組合,一般將一些功能相似的函數(shù)放在一起作為函數(shù)庫(kù),這種函數(shù)庫(kù)通常叫做靜態(tài)庫(kù),其鏈接方式是靜態(tài)的。COM即組件對(duì)象模型,是一種集成技術(shù),可以使程序在運(yùn)行時(shí)把各種不相關(guān)的軟件程序混合在一起,而不必考慮這些不相關(guān)的程序是用什么語(yǔ)言編寫的,它也是一種標(biāo)準(zhǔn)或者稱為協(xié)議,負(fù)責(zé)將一個(gè)軟件模塊和另一個(gè)軟件連接起來。動(dòng)態(tài)鏈接庫(kù)DLL(Dynamic Link Library)是一個(gè)可以被其它應(yīng)用程序共享的程序模塊,其中封裝了一些可以被共享的例程和資源,其鏈接方式是動(dòng)態(tài)的。動(dòng)態(tài)鏈接庫(kù)文件的擴(kuò)展名一般是dll,也有可能是fon、sys和dry,它和可執(zhí)行文件(.exe)非常相似,區(qū)別在于DLL中雖然包含了可執(zhí)行代碼卻不能單獨(dú)執(zhí)行,而應(yīng)由Windows應(yīng)用程序直接或間接調(diào)用。Windows操作系統(tǒng)包含大量動(dòng)態(tài)鏈接庫(kù),其中最主要的是KERNEL32.DLL、USER32.DLL、GDI32.DLL 。
    DLL的調(diào)用
    調(diào)用DLL,首先需要將DLL文件映像到用戶進(jìn)程的地址空間中,然后才能進(jìn)行函數(shù)調(diào)用,這個(gè)函數(shù)和進(jìn)程內(nèi)部一般函數(shù)的調(diào)用方法相同。Windows提供了兩種將DLL映像到進(jìn)程地址空間的方法:
    1、隱式的加載時(shí)鏈接
    這種方法需要DLL工程經(jīng)編譯產(chǎn)生的LIB文件,此文件中包含了DLL允許應(yīng)用程序調(diào)用的所有函數(shù)的列表,當(dāng)鏈接器發(fā)現(xiàn)應(yīng)用程序調(diào)用了LIB文件列出的某個(gè)函數(shù),就會(huì)在應(yīng)用程序的可執(zhí)行文件的文件映像中加入一些信息,這些信息指出了包含這個(gè)函數(shù)的DLL文件的名字。當(dāng)這個(gè)應(yīng)用程序運(yùn)行時(shí),也就是它的可執(zhí)行文件被操作系統(tǒng)產(chǎn)生映像文件時(shí),系統(tǒng)會(huì)查看這個(gè)映像文件中關(guān)于DLL的信息,然后將這個(gè)DLL文件映像到進(jìn)程的地址空間。
    系統(tǒng)通過DLL文件的名稱,試圖加載這個(gè)文件到進(jìn)程地址空間時(shí),它尋找DLL 文件的路徑按照先后順序如下:
    ·程序運(yùn)行時(shí)的目錄,即可執(zhí)行文件所在的目錄;
    ·當(dāng)前程序工作目錄
    ·系統(tǒng)目錄:對(duì)于Windows95/98來說,可以調(diào)用GetSystemDirectory函數(shù)來得到,對(duì)于WindowsNT/2000來說,指的是32位Windows的系統(tǒng)目錄,也可以調(diào)用GetSystemDirectory函數(shù)來得到,得到的值為SYSTEM32。
    ·Windows目錄
    ·列在PATH環(huán)境變量中的所有目錄
    VC中加載DLL的LIB文件的方法有以下三種:
    ①LIB文件直接加入到工程文件列表中
    在VC中打開File View一頁(yè),選中工程名,單擊鼠標(biāo)右鍵,然后選中"Add Files to Project"菜單,在彈出的文件對(duì)話框中選中要加入DLL的LIB文件即可。
    ②設(shè)置工程的 Project Settings來加載DLL的LIB文件
    打開工程的 Project Settings菜單,選中Link,然后在Object/library modules下的文本框中輸入DLL的LIB文件。
    ③通過程序代碼的方式
    加入預(yù)編譯指令#pragma comment (lib,"*.lib"),這種方法優(yōu)點(diǎn)是可以利用條件預(yù)編譯指令鏈接不同版本的LIB文件。因?yàn)?,在Debug方式下,產(chǎn)生的LIB文件是Debug版本,如Regd.lib;在Release方式下,產(chǎn)生的LIB文件是Release版本,如Regr.lib。
    當(dāng)應(yīng)用程序?qū)LL的LIB文件加載后,還需要把DLL對(duì)應(yīng)的頭文件(*.h)包含到其中,在這個(gè)頭文件中給出了DLL中定義的函數(shù)原型,然后聲明。