Win32 응용 프로그램의 HINSTANCE가 WinMain으로 전달되지만 현재 HINSTANCE를 결정하는 다른 방법이 있습니다 (말할 수없는 경우에 대비하여 Win32 프로그래밍이 새로 도입되었습니다!)? 라이브러리 내부에 창을 만들어야하고 (라이브러리가 크로스 플랫폼이므로) ID는 전달하지 않아도됩니다.현재 HINSTANCE를 결정 하시겠습니까?
답변
를 메모리, GetModuleHandle(NULL);
인스턴스 핸들을 반환 제공하는 경우.
__ImageBase은 특히 라이브러리의 경우 친구입니다. (R. 첸, 아니지만 브라이언 본디으로 연결 한 것과 같은 게시물) 링크 된 블로그 게시물을 읽고 가치가
주 (주석 포함!)
성가신 [GetModuleHandleEx] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms683200.aspx)를'GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS'와 (과) 함께 무시하는 것은 ** 신뢰할 수있는 ** 유일한 방법입니다 모듈 핸들, 그리고 그것은 허용 대답해야합니다. – IInspectable
함수 AfxGetStaticModuleState()는 트릭을 수행 . dll에서 호출하면 함수는 exe 내의 호출이 실행 파일의 핸들을 반환하면 DLL에 대한 핸들을 반환합니다.
DWORD size;
TCHAR fileName [MAX_PATH];
HMODULE hModule = AfxGetStaticModuleState()->m_hCurrentInstanceHandle;
::GetModuleFileName (hModule, fileName, size);
질문에 * winapi * 태그가 지정되어 있습니다. Windows API에는'AfxGetStaticModuleState'가 없습니다. – IInspectable
완전히 수정되지 않았습니다 : 이것은 exe의 HINSTANCE를 반환합니다. 코드가 DLL에서 실행되면 잘못된 동작이 발생할 수 있습니다. –
@Serge : 실행 파일의 HINSTANCE가 원하는 것입니다. –
+1 : 모듈 이름을 전달하면 해당 함수를 사용하여 DLL의 'HINSTANCE'도 가져올 수 있습니다. 'HINSTANCE'와'HMODULE'은 근대 버전의 Windows에서 본질적으로 동등합니다. –