현재 실행 중인 코드에 대한 HMODULE을 얻으려면 어떻게 해야 합니까?
나는 정적 라이브러리를 가지고 있는데 둘 중 하나에 연결될 수 있습니다..exe
아니면..dll
. 실행 시 라이브러리 함수 중 하나가 다음을 얻길 원합니다.HMODULE
정적 라이브러리 코드가 연결된 모든 것에 대해.
저는 현재 다음과 같은 트릭을 사용하고 있습니다(이 포럼에서 영감을 얻었습니다).
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만 해당)인 링커 생성 심볼입니다.거기서 주소를 A로 보낼 수 있습니다.HINSTANCE
아니면HMODULE
. 따라서 API를 거치는 것보다 편리합니다.
그럼 이 작업만 수행하면 됩니다.
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
#define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)
출처 https://web.archive.org/web/20100123173405/http ://blogs.msdn.com/oldnewthing/archive/2004/10/25/247180.aspx
제가 볼께.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;
}
해보지는 않았지만, 그렇게 하면 당신이 원하는 대로 될 것 같습니다.
#if _MSC_VER >= 1300 // for VC 7.0
#ifndef _delayimp_h
extern "C" IMAGE_DOS_HEADER __ImageBase;
#endif
#endif
...
HMODULE module()
{
#if _MSC_VER < 1300 // earlier than .NET compiler (VC 6.0)
MEMORY_BASIC_INFORMATION mbi;
static int address;
;::VirtualQuery(&address, &mbi, sizeof(mbi));
return reinterpret_cast(mbi.AllocationBase);
#else // VC 7.0
// from ATL 7.0 sources
return reinterpret_cast(&__ImageBase);
#endif
}
자세한 내용은 여기 https://www.apriorit.com/dev-blog/74-hmodule-hinstance-handle-from-static-library-in-c
HMODULE은 HINSTANCE 모듈의 기본 주소입니다.그래서, 어떻게 작동하는지 볼 겁니다.그러나 실행 파일의 HMODULE만 원한다면 프로세스(EnumProcessModules)에 있는 모든 HMODULE를 열거하는 것이 좋습니다.그들 중 하나는 당신의 .lib이 연결될 것입니다.
제한점은 당신이 당신의 .lib이 어느 DLL이나 EXE에서 왔는지 모른다는 것입니다..lib에서 얻은 _ReturnAddress_와 HMODULE(기본 주소)를 비교할 수 있습니다..lib은 _ReturnAddress_보다 작은 가장 높은 HMODLUE에 속합니다.
언급URL : https://stackoverflow.com/questions/557081/how-do-i-get-the-hmodule-for-the-currently-executing-code
'programing' 카테고리의 다른 글
윈도우즈 7 x64/VS2012에 컴파일이 필요한 노드 모듈을 설치할 수 없음 (0) | 2023.10.17 |
---|---|
Oracle에서 A,B 형식의 두 열 데이터를 검색하는 방법 (0) | 2023.10.17 |
POSIX가 CHAR_B를 의무화한 이유는 무엇입니까?IT==8? (0) | 2023.10.17 |
AngularJS에서 페이지에 iframe을 동적으로 삽입합니다. (0) | 2023.10.17 |
실행 중인 컨테이너가 없는데도 이미지를 제거할 수 없습니다. (0) | 2023.10.17 |