进程模块句柄
一、注意區別進程模塊句柄和進程內核句柄
?
二、每個可執行文件或者DLL文件被裝入到某個進程地址空間后,都會有一個唯一的實例句柄,來表示裝入后的可執行文件或者DLL,此時我們把這個可執行文件或者DLL叫做進程地址空間中的一個模塊。
? ? ? ?進程模塊句柄的本質就是當前模塊的起始地址。
?
三、如何獲取進程模塊句柄
? ? a.HMODULE??GetModuleHandle(?LPCTSTR ? lpModuleName)
?
? ?1. ?如果這個函數的參數是NULL的話,那么這個函數只返回當前進程的模塊地址!!
? ?2. ?在DLL中,調用GetModuleHandle,返回的不是DLL模塊的地址,而是當前進程的模塊地址!
? ?3. ?這個函數只檢查本進程地址空間,不檢查別的進程的地址空間。
?
獲得進程中模塊對應的文件名
?
?
DWORD GetModuleFileName(HMODULE hInstance,//進程句柄PTSTR pszPath,//文件名DWORD cchPath);//pszPath指向的內存的大小?
? ? b.WinMain函數中的第一個參數hInstance
?
四、如果代碼位于DLL文件中,那么想知道這個DLL文件被裝入進程空間后的模塊地址怎么辦?
? ? 1.
?
extern “C” HANDLE __ImageBase; int main() {printf(“%x\n”,&__ImaggeBase);return 0; }
? ? 2.
?
?
void fun(HMODULE* hModule) {GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,(PCTSTR)fun,&hModule); }五、實例
?
#include <stdio.h> #include <tchar.h> #include <windows.h> #include <locale.h>extern "C" HANDLE __ImageBase; int _tmain(int argc, _TCHAR* argv[]) {_tsetlocale(LC_ALL,_T("chs")); //支持中文_tprintf(L"__ImageBase:%4x \n",&__ImageBase);HMODULE hMoudle = GetModuleHandle(nullptr);_tprintf(L"當前進程模塊句柄為:%4x \n",hMoudle);TCHAR fileName[MAX_PATH] = {0};GetModuleFileName(hMoudle,fileName,MAX_PATH);_tprintf(L"當前進程模塊文件名:%s \n",fileName);_gettchar();return 0; }
運行結果:
?
轉載于:https://www.cnblogs.com/jadeshu/p/10663718.html
總結
- 上一篇: 201521123108《Java程序设
- 下一篇: ADOBE ILLUSTRATOR CS