2010-06-17 127 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