現在実行中のコードの HMODULE を取得するにはどうすればよいですか?

HMODULE GetCurrentModule()
{ // NB: XP+ solution!
  HMODULE hModule = NULL;
  GetModuleHandleEx(
    GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
    (LPCTSTR)GetCurrentModule,
    &hModule);

  return hModule;
}

__ImageBase モジュールの DOS ヘッダーであるリンカ生成シンボルです (MSVC のみ)。そこから、そのアドレスを HINSTANCE にキャストできます または HMODULE .そのため、API を経由するよりも便利です。

したがって、これを行うだけです:

EXTERN_C IMAGE_DOS_HEADER __ImageBase;
#define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)

https://devblogs.microsoft.com/oldnewthing/20041025-00/?p=37483 から


私なら GetModuleHandleEx() を見ます フラグ GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS の使用 . GetCurrentModule() を変更できるようです VirtualQuery() の代わりにこのルーチンを呼び出す 、 GetCurrentModule() のアドレスを渡します lpModuleName のように

ETA:

const HMODULE GetCurrentModule()
{
    DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS;
    HMODULE hm = 0;
    ::GetModuleHandleEx( flags, reinterpret_cast<LPCTSTR>( GetCurrentModule ), &hm );   
    return hm;
}

私はそれを試していませんが、それはあなたが望むものになると思います.