2010-06-17 4 views
1

MFC dll을 동적으로로드하려고 시도하는 MFC exe가 있습니다.리소스 충돌 방지

// This is code in MFC exe 
HINSTANCE h = AfxLoadLibrary(_T("DLL.dll")); 
typedef void(*FUN)(); 
FUN fun = (FUN)GetProcAddress(h, "loveme"); 
FreeLibrary(h); 

MFC exe와 MFC dll은 모두 고유 한 리소스 파일을 가지고 있습니다.

그러나 MFC exe와 MFC dll에 동일한 리소스 ID가 있으면 충돌이 발생할 수 있음을 알고 있습니다.

// This is code in MFC dll. Both exe and dll, are having resources with 
// ID 101. 
CString s; 
s.LoadString(101); 
// Resource 101 in exe is being shown :(
AfxMessageBox(s); 

리소스 ID 충돌 문제를 피할 수있는 방법을 알고 있습니까? ID가 다르긴하지만 MFC와 DLL 모두에 두 개의 리소스가있을 수 있지만 서로 독립적입니다.

즉, DLL은 DLL의 리소스 만로드합니다. EXE는 EXE의 리소스 만로드합니다.

답변

3

당신은 dllmain 동안 전달 될 자신에게 트랙 핸들을 유지해야합니다. 당신은 로컬 리소스 (예. LoadString)를 참조 할 때 MFC를 사용할 수있을 때

HINSTANCE hDLLInstance = 0; 

extern "C" int APIENTRY 
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) 
{ 
    hDLLInstance = hInstance; 
    ... 
} 

는 그 다음 DLL 핸들

... 
CString s; 
s.LoadString(hDLLInstance, 101); 
AfxMessageBox(s); 
... 
0

MFC DLL에 AfxGetInstanceHandle()을 사용하여 HINSTANCE을 DLL에 가져 오십시오. 그런 다음 CString::LoadString()에 전달 :

/* Code in MFC DLL. */ 

CString s; 
// Load resource 101 in the DLL. 
s.LoadString(AfxGetInstanceHandle(), 101); 
AfxMessageBox(s); 
+0

AfxGetInstanceHandle()는 좋은 솔루션을 전달합니다. – YeenFei

+0

OP가 MFC DLL을 사용하기 때문에'AfxGetInstanceHandle()'에 대해 언급했습니다. 그렇지 않으면, 나는 당신의'DllMain' 솔루션으로 갈 것입니다. –

+1

AfxGetInstanceHandle()은 DLL이 아닌 EXE 핸들을 반환합니다. 그러나 YeenFei의 솔루션은 작동합니다. –