程序模組控制代碼
一、注意區別程序模組控制代碼和程序核心控制代碼
二、每個可執行檔案或者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;
}
執行結果:
---------------------
作者:jadeshu
來源:CSDN
原文:https://blog.csdn.net/jadeshu/article/details/72796620
版權宣告:本文為博主原創文章,轉載請附上博文連結!