web-dev-qa-db-ja.com

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

.exeまたは.dllにリンクされる可能性のある静的ライブラリがあります。実行時に、ライブラリ関数の1つだけに、静的ライブラリコードがリンクされているもののHMODULEを取得させたい。

私は現在次のトリックを使用しています( this forum からインスピレーションを得ています):

const HMODULE GetCurrentModule()
{
    MEMORY_BASIC_INFORMATION mbi = {0};
    ::VirtualQuery( GetCurrentModule, &mbi, sizeof(mbi) );

    return reinterpret_cast<HMODULE>(mbi.AllocationBase);
}

これを行うには、それほどハッキーに見えないより良い方法はありますか?

(注:これの目的は、ユーザーが静的ライブラリと同時にリンクすることがわかっているWin32リソースをロードすることです。)

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

  return hModule;
}
54
Serge Wautier

__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=3748

29
MSN

フラグ_GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS_を使用してGetModuleHandleEx()を確認します。 GetCurrentModule()の代わりにこのルーチンを呼び出すようにVirtualQuery()を変更し、lpModuleName引数としてGetCurrentModule()のアドレスを渡すことができるようです。

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;
}
_

私はそれを試しませんでしたが、それはあなたが望むことをするでしょう。

3
Rob K