Избегайте конфликта ресурсов - PullRequest
1 голос
/ 17 июня 2010

У меня есть 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 имеют одинаковый идентификатор ресурса, может возникнуть конфликт.

// 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);

Могу ли я узнать, как избежать проблемы конфликта идентификаторов ресурсов?Можем ли мы иметь два ресурса как в MFC, так и в DLL, хотя их ID различны, но они независимы друг от друга?

Это означает, что DLL будет загружать только ресурсы DLL.EXE будет загружать только ресурс EXE.

Ответы [ 2 ]

3 голосов
/ 17 июня 2010

Вам нужно будет отслеживать дескриптор при себе, который будет передан во время dllmain.

HINSTANCE hDLLInstance = 0;

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

затем, когда вы хотите обратиться к локальным ресурсам (т. Е. LoadString), передайте дескриптор dll

...
CString s; 
s.LoadString(hDLLInstance, 101); 
AfxMessageBox(s); 
...
0 голосов
/ 17 июня 2010

Попробуйте использовать AfxGetInstanceHandle() в MFC DLL, чтобы получить HINSTANCE в DLL.Затем передайте его CString::LoadString():

/* Code in MFC DLL. */

CString s;
// Load resource 101 in the DLL.
s.LoadString(AfxGetInstanceHandle(), 101); 
AfxMessageBox(s); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...