很多初學(xué)DLL和COM編程的人都為DLL的調(diào)試方法發(fā)愁。我結(jié)合自己學(xué)習(xí)COM的體驗(yàn),總結(jié)DLL程序的調(diào)試如下。
DLL是一個(gè)不可運(yùn)行的程序,它必須有其它程序的加載才可運(yùn)行。故要調(diào)試DLL程序,需要一個(gè)測(cè)試程序。根據(jù)測(cè)試程序的不同,我將DLL調(diào)試分三種請(qǐng)況。
1.測(cè)試程序有源碼。
2.測(cè)試程序無源碼,只有可執(zhí)行(exe)文件。
3.對(duì)DLLRegisterServer函數(shù)和DLLUnregisterServer函數(shù)的調(diào)試。
一:測(cè)試程序有源碼
對(duì)于這種情況,我們可將測(cè)試程序的工程(dllCall)和dll程序的工程(dllTest)建立在同一個(gè)工作區(qū)下。
編譯鏈接dllCall文件,確保生成了dllCall.exe,然后我們將dllTest設(shè)置為活動(dòng)工程。因dllTest需要有測(cè)試程序,我們可按如下方法設(shè)置。
選擇Project->Settings->Debug->Executable for Debug session:
在其文本框中填入dllCall.exe的路徑。
按以上操作設(shè)置好后,編譯,鏈接dllTest沒錯(cuò)后,開始調(diào)試。
在dllCall中設(shè)置斷點(diǎn)。
在dllTest中設(shè)置斷點(diǎn)。
斷點(diǎn)設(shè)置好后,在確保dllTest為活動(dòng)工程的前提下,開始調(diào)試,程序?qū)⒃跀帱c(diǎn)處停下。
二:測(cè)試程序無源碼
如果測(cè)試程序無源碼,則不能將測(cè)試程序和dll程序聯(lián)合調(diào)試,但可以只調(diào)試dll文件。在這種情況下,dllCall.exe的路徑要填對(duì),確定dllCall.exe的確調(diào)用了dllTest工程下的dllTest.dll文件。
三:對(duì)DLLRegisterServer函數(shù)和DLLUnregisterServer函數(shù)的調(diào)試
編程com程序,一般將com的注冊(cè)和卸載集成在dll文件中,故在dll文件中會(huì)實(shí)現(xiàn)DllRegisterServer函數(shù)和DllUnregisterServer函數(shù),然后通過windows自帶的regsvr32.exe命令來實(shí)現(xiàn)dll的安裝和卸載。
Regsvr32.exe dllTest.dll安裝dllTest.dll
Regsvr32.exe /u dllTest.dll卸載dllTest.dll
從上可看出,調(diào)試程序?yàn)镽egsvr32.exe,它帶有參數(shù),這是和上述兩種情況不同的地方,其余的過程基本相似。
先看看DLLRegisterServer的調(diào)試,路徑設(shè)置。
然后在DllRegisterServer處設(shè)置斷點(diǎn)。
DllUnregisterServer調(diào)試。
在DllUnregisterServer出設(shè)置斷點(diǎn)
DLL是一個(gè)不可運(yùn)行的程序,它必須有其它程序的加載才可運(yùn)行。故要調(diào)試DLL程序,需要一個(gè)測(cè)試程序。根據(jù)測(cè)試程序的不同,我將DLL調(diào)試分三種請(qǐng)況。
1.測(cè)試程序有源碼。
2.測(cè)試程序無源碼,只有可執(zhí)行(exe)文件。
3.對(duì)DLLRegisterServer函數(shù)和DLLUnregisterServer函數(shù)的調(diào)試。
一:測(cè)試程序有源碼
對(duì)于這種情況,我們可將測(cè)試程序的工程(dllCall)和dll程序的工程(dllTest)建立在同一個(gè)工作區(qū)下。
編譯鏈接dllCall文件,確保生成了dllCall.exe,然后我們將dllTest設(shè)置為活動(dòng)工程。因dllTest需要有測(cè)試程序,我們可按如下方法設(shè)置。
選擇Project->Settings->Debug->Executable for Debug session:
在其文本框中填入dllCall.exe的路徑。
按以上操作設(shè)置好后,編譯,鏈接dllTest沒錯(cuò)后,開始調(diào)試。
在dllCall中設(shè)置斷點(diǎn)。
在dllTest中設(shè)置斷點(diǎn)。
斷點(diǎn)設(shè)置好后,在確保dllTest為活動(dòng)工程的前提下,開始調(diào)試,程序?qū)⒃跀帱c(diǎn)處停下。
二:測(cè)試程序無源碼
如果測(cè)試程序無源碼,則不能將測(cè)試程序和dll程序聯(lián)合調(diào)試,但可以只調(diào)試dll文件。在這種情況下,dllCall.exe的路徑要填對(duì),確定dllCall.exe的確調(diào)用了dllTest工程下的dllTest.dll文件。
三:對(duì)DLLRegisterServer函數(shù)和DLLUnregisterServer函數(shù)的調(diào)試
編程com程序,一般將com的注冊(cè)和卸載集成在dll文件中,故在dll文件中會(huì)實(shí)現(xiàn)DllRegisterServer函數(shù)和DllUnregisterServer函數(shù),然后通過windows自帶的regsvr32.exe命令來實(shí)現(xiàn)dll的安裝和卸載。
Regsvr32.exe dllTest.dll安裝dllTest.dll
Regsvr32.exe /u dllTest.dll卸載dllTest.dll
從上可看出,調(diào)試程序?yàn)镽egsvr32.exe,它帶有參數(shù),這是和上述兩種情況不同的地方,其余的過程基本相似。
先看看DLLRegisterServer的調(diào)試,路徑設(shè)置。
然后在DllRegisterServer處設(shè)置斷點(diǎn)。
DllUnregisterServer調(diào)試。
在DllUnregisterServer出設(shè)置斷點(diǎn)