.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リソースをロードすることです。)
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=3748
フラグ_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;
}
_
私はそれを試しませんでしたが、それはあなたが望むことをするでしょう。