본문 바로가기
IT-개발,DB

[개발/MFC] HINSTANCE 구하기

by SB리치퍼슨 2011. 9. 20.

1. hWnd를 알면, 그걸로 hInstance를 얻어올 수 있습니다. 
GetWindowLong / GetWindowLongPtr에서 GWLP_HINSTANCE

 

2. AfxGetApp() 를 통해서 App 의 포인터를 얻어온 다음에 m_instance 멤버변수

 

3. HINSTANCE hInst= GetModuleHandle(NULL); 콘솔에서 윈도 뛰울때 자주 씁니다.

 

4. HINSTANCE AfxGetInstanceHandle( );

5. dll의 메모리를 이용한 HINSTANCE 구하기

종종 DLL 내부에서 window를 띄워야하시겠다는 분이 있어서 찾던중에

 

Detecting a HMODULE/HINSTANCE Handle Within the Module You're Running In

 

이라는 codeguru 글을 보았습니다.

 

http://www.codeguru.com/Cpp/W-P/dll/tips/article.php/c3635/

 

코드는

 

 

#if _MSC_VER >= 1300    // for VC 7.0

  // from ATL 7.0 sources

  #ifndef _delayimp_h

  extern "C" IMAGE_DOS_HEADER __ImageBase;

  #endif

#endif

 

HMODULE GetCurrentModule()

{

#if _MSC_VER < 1300    // earlier than .NET compiler (VC 6.0)

 

  // Here's a trick that will get you the handle of the module

  // you're running in without any a-priori knowledge:

  // http://www.dotnet247.com/247reference/msgs/13/65259.aspx

 

  MEMORY_BASIC_INFORMATION mbi;

  static int dummy;

  VirtualQuery( &dummy, &mbi, sizeof(mbi) );

 

  return reinterpret_cast<HMODULE>(mbi.AllocationBase);

 

#else    // VC 7.0

 

  // from ATL 7.0 sources

 

  return reinterpret_cast<HMODULE>(&__ImageBase);

#endif

}

 

위와 같은데.

 

간단히 설명하면 메모리에 할당된 dll정보를 읽어와서

 

HMODULE위치를 리턴해줍니다.

 

현재 win 9x 및 nt계열에서는 동작하는데 추후에 할당된 메모리 레이아웃이

 

아주 대폭적으로 바뀌면 돌아가지 않을수도 있겠죠.

 

첨부파일은 dll에서 window 생성하는 코드 입니다.


 

[출처] MFC에서 hInstance 얻기|작성자 에쑤비


반응형

댓글