2009-11-17 10 views
37

Win32 응용 프로그램의 HINSTANCE가 WinMain으로 전달되지만 현재 HINSTANCE를 결정하는 다른 방법이 있습니다 (말할 수없는 경우에 대비하여 Win32 프로그래밍이 새로 도입되었습니다!)? 라이브러리 내부에 창을 만들어야하고 (라이브러리가 크로스 플랫폼이므로) ID는 전달하지 않아도됩니다.현재 HINSTANCE를 결정 하시겠습니까?

답변

61

를 메모리, GetModuleHandle(NULL); 인스턴스 핸들을 반환 제공하는 경우.

+4

완전히 수정되지 않았습니다 : 이것은 exe의 HINSTANCE를 반환합니다. 코드가 DLL에서 실행되면 잘못된 동작이 발생할 수 있습니다. –

+1

@Serge : 실행 파일의 HINSTANCE가 원하는 것입니다. –

+4

+1 : 모듈 이름을 전달하면 해당 함수를 사용하여 DLL의 'HINSTANCE'도 가져올 수 있습니다. 'HINSTANCE'와'HMODULE'은 근대 버전의 Windows에서 본질적으로 동등합니다. –

8

MFC를 사용하는 경우 AfxGetInstanceHandle을 사용할 수 있습니다. 당신이 MFC를 사용하지 않는 경우

당신이 사용할 수를 GetWindowLong (HWND, GWL_HINSTANCE)

+0

해당 방법은 MFC입니까? – dicroce

+0

예,하지만 비 MFC 방식으로 업데이트되었습니다. –

+1

내가 이미 창을 가지고 있다고 가정하고 (따라서 hwnd) ... 창작 작업을 내 라이브러리로 푸시하려고합니다. – dicroce

13

__ImageBase은 특히 라이브러리의 경우 친구입니다. (R. 첸, 아니지만 브라이언 본디으로 연결 한 것과 같은 게시물) 링크 된 블로그 게시물을 읽고 가치가

주 (주석 포함!)

+0

성가신 [GetModuleHandleEx] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms683200.aspx)를'GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS'와 (과) 함께 무시하는 것은 ** 신뢰할 수있는 ** 유일한 방법입니다 모듈 핸들, 그리고 그것은 허용 대답해야합니다. – IInspectable

0

함수 AfxGetStaticModuleState()는 트릭을 수행 . dll에서 호출하면 함수는 exe 내의 호출이 실행 파일의 핸들을 반환하면 DLL에 대한 핸들을 반환합니다.

DWORD size; 
TCHAR fileName [MAX_PATH]; 
HMODULE hModule = AfxGetStaticModuleState()->m_hCurrentInstanceHandle; 
::GetModuleFileName (hModule, fileName, size); 
+1

질문에 * winapi * 태그가 지정되어 있습니다. Windows API에는'AfxGetStaticModuleState'가 없습니다. – IInspectable

관련 문제