2010-06-17 139 views
1

我有一個MFC EXE,試圖動態加載MFC DLL。避免資源衝突

// 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衝突問題嗎?我們可以在MFC和DLL中都有兩個資源,但它們的ID是不同的,但它們是相互獨立的嗎?

這意味着,DLL只會加載DLL的資源。 EXE只會加載EXE的資源。

回答

3

您需要的軌道手柄保留給自己,這將在的DllMain傳遞英寸

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()以獲得DLL的HINSTANCE。然後把它傳遞給CString::LoadString()

/* Code in MFC DLL. */ 

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

AfxGetInstanceHandle()是很好的解決方案時,MFC可以使用。 – YeenFei 2010-06-17 09:57:51

+0

我提到'AfxGetInstanceHandle()',因爲OP使用的是MFC DLL。否則,我會爲你的'DllMain'解決方案。 – 2010-06-17 10:00:25

+1

我試過了,AfxGetInstanceHandle()會返回EXE句柄,而不是DLL。然而,YeenFei的解決方案仍然有效。 – 2010-06-18 02:43:03