起因: 因?yàn)楣ぷ餍枰?寫了一個(gè)小工具,嵌入到各個(gè)項(xiàng)目中(這些項(xiàng)目都是DLL項(xiàng)目).然后,在這個(gè)工具可以輸出一些信息到日志文件.當(dāng)然,輸出信息需要標(biāo)明這些信息來自哪個(gè)程序模塊.首先,就想到了GetModuleFileName,一查MSDN,第一個(gè)參數(shù)hModule無法提供,如果提供NULL,只能得到創(chuàng)建進(jìn)程的那個(gè)EXE文件。又順藤摸瓜,找到了GetModuleHandle函數(shù)。然而,問題仍然存在:GetModuleHandle需要一個(gè)lpModuleName參數(shù),這不是死循環(huán)了么?想尋覓一個(gè)GetCurrentModuleHandle,沒有;google,無果。郁悶之余,看到HMODULE的本質(zhì):模塊的起始地址。 至此,至少我可以有個(gè)笨辦法解決了:枚舉所有模塊,排序。然后用當(dāng)前函數(shù)地址去匹配模塊句柄,比函數(shù)地址小的句柄中最大的那個(gè)句柄,就是當(dāng)前模塊句柄。方法有點(diǎn)笨,但是可行。 忽然想到,GetModuleHandleEx是不是有額外的功能呢?查閱之下,大喜,于是如下獲得當(dāng)前模塊文件名: HMODULE hModule = NULL; GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCSTR)&getLogFile, //這是函數(shù)名,強(qiáng)轉(zhuǎn) &hModule); DWORD len = GetModuleFileNameA(hModule, buffer, sizeof buffer); 成功!猜想,之所以要提供一個(gè)函數(shù)地址作為參考,大概和我想到的方法也類似吧?只是也許它內(nèi)部不需要枚舉,直接訪問模塊列表就可以了。 |
|