WTL способ заставить ресурсы загружаться из DLL в не MFC-приложении?(мы используем WTL / ATL, а не прямой win32) - PullRequest
3 голосов
/ 17 марта 2011

Я отправил этот вопрос ранее и теперь загружены локализованные строки (те, которые мы получаем с LoadString ()), но мне также нужно загрузить все другие ресурсы из сателлитной DLL.

MFC имеет вызов AfxSetResourceHandle (), но мне нужно что-то эквивалентное для приложения, не относящегося к mfc? Я подозреваю, что должен установить это в коде инициализации где-нибудь, чтобы все мои ресурсы загружались из другой DLL. Как мне это сделать в контексте WTL (библиотека шаблонов Windows)?

EDIT:

Это обобщает нашу проблему .

Мы не используем прямой win32, но ATL и WTL для Windows. Таким образом, мы не можем полагаться на материал MFC, и у нас нет низкоуровневого контроля загрузки меню и ресурсов диалога.

EDIT: Хммм ... Кажется, у этого есть ответ , но я надеялся на что-то лучшее, чем это. Например, метод SetResourceInstance (), аналогичный методу GetResourceInstance () в объекте CAppModule.

Ответы [ 2 ]

6 голосов
/ 17 марта 2011

Функции ресурсов (FindResource, LoadResource) принимают дескриптор модуля в качестве одного из параметров.

Используйте GetModuleHandleEx, чтобы получить дескриптор модуля для DLL.

Редактировать: Дополнительная информация для ATL / WTL.

WTL использует ATL::_AtlBaseModule.GetResourceInstance() для дескриптора модуля в своих вызовах Win32.Есть функция SetResourceInstance, которую вы можете вызвать, чтобы изменить используемый модуль.Примерно так должно работать в начале вашей программы:

HMODULE hmod;
::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_PIN, myDllFuncPtr, &hmod);
ATL::_AtlBaseModule.SetResourceInstance(hmod);
0 голосов
/ 14 октября 2014

Иногда вышеупомянутый метод не может быть использован, например, когда вам все еще приходится поддерживать Windows 2000 по какой-либо причине.В таком случае полезно иметь следующий трюк:

Мы объявляем статическую переменную, что означает, что ее адрес будет внутри модуля, с которым она была связана.Затем мы используем адрес этой переменной, чтобы запросить базовый адрес этой выделенной области, то есть HMODULE.

HMODULE GetCurrentModuleHandle()
{
    MEMORY_BASIC_INFORMATION mbi;
    static int iDummy;
    VirtualQuery(&iDummy, &mbi, sizeof(mbi));
    return (HMODULE)mbi.AllocationBase;
}

Это никоим образом не делает недействительным ответ Марка!Просто имейте это в виду в качестве запасного варианта, если вам нужно, чтобы ваши программы работали на древних системах.

...