一、Dll優(yōu)點(diǎn) 簡單的說,dll有以下幾個優(yōu)點(diǎn): 1) 節(jié)省內(nèi)存。同一個軟件模塊,若是以源代碼的形式重用,則會被編譯到不同的可執(zhí)行程序中,同時運(yùn)行這些exe時這些模塊的二進(jìn)制碼會被重復(fù)加載到內(nèi)存中。如果使用dll,則只在內(nèi)存中加載一次,所有使用該dll的進(jìn)程會共享此塊內(nèi)存(當(dāng)然,像dll中的全局變量這種東西是會被每個進(jìn)程復(fù)制一份的)。 2) 不需編譯的軟件系統(tǒng)升級,若一個軟件系統(tǒng)使用了dll,則該dll被改變(函數(shù)名不變)時,系統(tǒng)升級只需要更換此dll即可,不需要重新編譯整個系統(tǒng)。事實上,很多軟件都是以這種方式升級的。例如我們經(jīng)常玩的星際、魔獸等游戲也是這樣進(jìn)行版本升級的。 3) Dll庫可以供多種編程語言使用,例如用c編寫的dll可以在vb中調(diào)用。這一點(diǎn)上DLL還做得很不夠,因此在dll的基礎(chǔ)上發(fā)明了COM技術(shù),更好的解決了一系列問題。
Dumpbin命令可以查看一個dll中的輸出函數(shù)符號名,鍵入如下命令: Dumpbin –exports mylib.dll 三、VS2005創(chuàng)建Dll win32控制臺 -> Application type 選擇 DLL, 然后點(diǎn)擊Finish 1.Mylib.h #pragma once extern "C" __declspec(dllexport) void FuncInDll (void); 2.Mylib.CPP #include "stdafx.h" extern "C" __declspec(dllexport) void FuncInDll (void)
return TRUE; 3.編譯后可生成Mylib.DLL,但是沒有MyLib.lib,可以在當(dāng)前目錄新建空文件Mylib.def,然后在工程設(shè)置Link->Module Definition File 里輸入Mylib.def 四、調(diào)用Dll,Dll調(diào)用分為2中,一種顯示調(diào)用,一種隱式調(diào)用 新建win32控制臺工程TestLib,將Mylib.DLL 和 Mylib.lib 復(fù)制到工程目錄下 1.顯示調(diào)用 #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) //定義一個函數(shù)指針變量 DLLWITHLIB pfFuncInDll = NULL; //加載我們的dll HMODULE hinst= ::LoadLibrary(TEXT("MyLib.dll")); if (NULL != hinst) //找到dll的FuncInDll函數(shù) pfFuncInDll = (DLLWITHLIB)GetProcAddress(hinst, "FuncInDll"); //調(diào)用dll里的函數(shù) if (NULL != pfFuncInDll) return 0; 2.隱式調(diào)用 包含頭文件MyLib.h, TestLib.cpp鍵入如下code #include "stdafx.h" #pragma comment(lib,"MyLib.lib") int _tmain(int argc, _TCHAR* argv[]) return 0; |