본문 바로가기

Programming

MFC DLL의 resource 찾는 순서

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
링크: http://support.microsoft.com/kb/600771/ko




MFC extension DLL에서 resource를 가져오기 위해 CString::LoadString 혹은 CBitmap::LoadBitmap를 사용할 때, EXE file과 DLL file의 중복된 ID가 있는 경우에는 EXE file의 resource를 가져오게 된다. 이것은 MFC에서 resource를 찾는 순서가 Extension DLL 인 경우 EXE file의 resource를 가장 먼저 살펴 보고 여기에서 발견이 안된 경우에 Extension DLL resouce를 그리고 마지막 으로 MFC DLL resource를 찾게되기 때문이다.

그러나 MFC Regular DLL인 경우에는 DLL 의 함수가 resource를 load할 때 DLL의 resource만을 살펴보기 때문에 이러한 문제가 없다.

MFC Extension DLL에서 올바른 자신의 resource를 가져오기 위해서는 AfxSetResourceHandle()를 이용하여 DLL...
MFC Extension DLL에서 올바른 자신의 resource를 가져오기 위해서는 AfxSetResourceHandle()를 이용하여 DLL의 instance를 application의 default resource 위치로 잠시 setting해 주어야 한다.

예를 들면 다음과 같이 coding할수 있다.
HINSTANCE hInstResourceClient = AfxGetResourceHandle();
AfxSetResourceHandle(g_hInstance);	// uses DLL's instance handle
                        		// set in DllMain
CString strRes;
strRes.LoadString(IDS_MYSTRING);
AfxSetResoourceHandle(hInstResourceClient);
위의 code에서 g_hInstance는 DllMain에서 grobal 변수에 미리 저장하여 사용할수 있으며, Extension DLL를 AppWizard를 이용해 만들었다면 wizard가 만들어 놓은 AFX_EXTENSION_MODULE type 변수의 hResource 값을 이용해도 좋다. 그러나 AfxGetInstanceHandle은 이용할수 없다. Extenstion DLL에서 이 함수는 DLL의 instance가 아닌 EXE 의 instance를 return하기 때문이다.

참고로 Regular DLL에서 EXE 의 resource를 가져오기 위해서는 위의 code와 는 역으로 EXE file의 resource instance 값을 가지고 default resource 위치를 다시 setting해주어야 한다.

예를 들어 다음과 같이 coding할수 있다.
HINSTANCE hInstResourceDll = AfxGetResourceHandle();
HINSTANCE hInstResourceClient = (HINSTANCE) ::GetModuleHandle(NULL);
	// use EXE's instance handle
AfxSetResourceHandle(hInstResourceClient);

CString strRes;
strRes.LoadString(IDS_MYSTRING);
AfxSetResoourceHandle(hInstResourceDll);
위의 code에서 GetModuleHandle 대신 AfxGetInstanceHandle를 사용해서는 안된다. Regular DLL에서 AfxGetInstanceHandle 함수는 DLL 의 instance를 return하기 때문이다.

[주의] AfxGetInstanceHandle 함수는 Extension DLL과 Regular DLL에서 서로 정반대의 instance를 return한다.

'Programming' 카테고리의 다른 글

[GUI] 사용이 쉬운 사용자 인터페이스 구현방법 및 디자인 원칙  (0) 2009.06.23
Http File Upload Code (C++)  (0) 2009.04.23
WebDEV  (0) 2009.04.23