DLL 程序的入口函數(shù)是 DllMain(),,就像 DOS 程序的入口函數(shù)是 main(),、Win32 程序的入口函數(shù)是 WinMain() 一樣,。前面我們一直在講的就是DOS程序,。
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved); 其中:
一個(gè)簡(jiǎn)單的DLL程序并不比 'Hello World' 程序難,,下面就開始介紹如何利用VC6.0創(chuàng)建DLL及其調(diào)用方式。 首先利用VC6.0新建一個(gè) Win32 Dynamic-Link Library 類型的工程,,工程取名為 dllDemo,,并選擇“An empty Dll project'選項(xiàng),即創(chuàng)建一個(gè)空的動(dòng)態(tài)鏈接庫(kù)工程,。然后,,為該工程添加 一個(gè)C源文件 main.c,并在其中編寫完成加法運(yùn)算和減法運(yùn)算的函數(shù),,代碼如下所示:
#include 然后利用Build命令生成dllDemo這一動(dòng)態(tài)鏈接庫(kù)程序,。之后,在該工程的Debug目錄下,, 可以看到有一個(gè)dllDemo.dll文件,,這就是生成的動(dòng)態(tài)鏈接庫(kù)文件。讀者要記住,,應(yīng)用程序如果想要訪問(wèn)某個(gè)DLL中的函數(shù),,那么該函數(shù)必須是已經(jīng)被導(dǎo)出的函數(shù)。為了導(dǎo)出一些函數(shù),,需要在函數(shù)前面添加標(biāo)識(shí)符_declspec(dllexport),。 為了查看一個(gè)DLL中有哪些導(dǎo)出函數(shù),可 以利用VC6.0提供的命令行工具Dumpbin來(lái)實(shí)現(xiàn),。 Dumpbin.exe文件位于VC6.0安裝目錄下的VC98\bin目錄下,。在該目錄下還有 一個(gè)批處理文件VCVARS32.bat,該文件的作用是用來(lái)建立VC6.0使用的環(huán)境信息,。如果讀者在其他目錄下無(wú)法執(zhí)行Dumpbin命令,,原因可能就是你的VC6.0安裝的環(huán)境信息被破壞了,那么可以運(yùn)行VCVARS32.bat這個(gè)批處理文件,,之后在其他目錄下,,就可以 執(zhí)行Dumpbin命令了。 注意:當(dāng)在命令行界面下執(zhí)行VCVARS32.bat文件后,,該文件所設(shè)置的環(huán)境信息只是在當(dāng)前命令行窗口生效,。如果關(guān)閉該窗口,并再次啟動(dòng)一個(gè)新的命令行窗口后,,仍需要運(yùn)行VCVARS32.bat文件,。 在命令行界面下,cd 到工程目錄下的debug目錄,,輸入dumpbin -exports dllDemo.dll 命令,,然后回車,,即可查看DLL中的導(dǎo)出函數(shù),如下圖: 注意紅色方框標(biāo)出的信息: ordinal hint RVA name 1 0 00001005 add 2 1 0000100A sub 在這段信息中,,'ordinal' 列列出的信息 '1' 和 '2' 是導(dǎo)出函數(shù)的序號(hào),;'hint' 列列出的數(shù)字是提示碼,該信息不重要,;'RVA' 列列出的地址值是導(dǎo)出函數(shù)在DLL模塊中的位置,,也就是說(shuō),通過(guò)該地址值,,可以在DLL中找到它們,;最后一列 'name' 列出的是導(dǎo)出函數(shù)的名稱。 將 add 函數(shù)前面的 _declspec(dllexport) 標(biāo)識(shí)符去掉,,再次編譯 dllDemo 工程,,然后執(zhí)行dumpbin -exports dllDemo.dll 命令,輸出如下圖所示: 可以看到,,add 函數(shù)已經(jīng)不是導(dǎo)出函數(shù)了,。 打開項(xiàng)目目錄下的Debug目錄,發(fā)現(xiàn)有 dllDemo.dll 和 dllDemo.lib 兩個(gè)文件,。上節(jié)已經(jīng)說(shuō)過(guò),,.lib 文件包含DLL導(dǎo)出的函數(shù)和變量的符號(hào)名,.dll 文件才包含實(shí)際的函數(shù)和數(shù)據(jù),。主程序調(diào)用 DLL 需要這兩個(gè)文件,,下節(jié)會(huì)講解如何使用。 注意:DllMain() 函數(shù)在DLL程序載入和卸載時(shí)執(zhí)行,,可以用來(lái)做一些初始化和清理的工作,,如果僅僅是向外暴露函數(shù),就可以省略 DllMain() 函數(shù),。但是如果有 DllMain() 函數(shù),,就一定要#include 例如,,上面DLL如果只想暴露 add() 和 sub() 函數(shù),,而不想進(jìn)行其他操作,那么可以這樣寫:
|
|
來(lái)自: 昵稱34122805 > 《文件夾1》