1、注意區別進程模塊句柄和進程內核句柄windows
2、每一個可執行文件或者DLL文件被裝入到某個進程地址空間後,都會有一個惟一的實例句柄,來表示裝入後的可執行文件或者DLL,此時咱們把這個可執行文件或者DLL叫作進程地址空間中的一個模塊。函數
進程模塊句柄的本質就是當前模塊的起始地址。.net
3、如何獲取進程模塊句柄blog
a.HMODULE GetModuleHandle( LPCTSTR lpModuleName)進程
1. 若是這個函數的參數是NULL的話,那麼這個函數只返回當前進程的模塊地址!!內存
2. 在DLL中,調用GetModuleHandle,返回的不是DLL模塊的地址,而是當前進程的模塊地址!jade
3. 這個函數只檢查本進程地址空間,不檢查別的進程的地址空間。get
得到進程中模塊對應的文件名io
DWORD GetModuleFileName(
HMODULE hInstance,//進程句柄
PTSTR pszPath,//文件名
DWORD cchPath);//pszPath指向的內存的大小file
b.WinMain函數中的第一個參數hInstance
4、若是代碼位於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);
}
5、實例
#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;
}
運行結果: