programing

현재 실행 중인 코드에 대한 HMODULE을 얻으려면 어떻게 해야 합니까?

testmans 2023. 10. 17. 20:07
반응형

현재 실행 중인 코드에 대한 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

반응형