1. 程式人生 > >程序模組控制代碼

程序模組控制代碼

一、注意區別程序模組控制代碼和程序核心控制代碼


二、每個可執行檔案或者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
版權宣告:本文為博主原創文章,轉載請附上博文連結!