2017-01-18 9 views
0

У меня есть DLL, которая может отображать диалоговое окно с помощью следующего кода MFC:Как включить визуальные стили для общих элементов управления в CDialog, созданных из DLL?

void ShowMyDialog() 
{ 
    BOOL bInitted = SUCCEEDED(::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)); 

    INITCOMMONCONTROLSEX InitCtrls; 
    InitCtrls.dwSize = sizeof(InitCtrls); 
    InitCtrls.dwICC = ICC_WIN95_CLASSES; 
    InitCommonControlsEx(&InitCtrls); 
    //InitCommonControls(); //Tried also with just this call 

    AfxEnableControlContainer(); 

    HMODULE hDll = NULL; 
    if(GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, 
     (LPCWSTR) ShowMyDialog, 
     &hDll) && 
     hDll) 
    { 
     AfxSetResourceHandle(hDll); 

     CMyDialog dl;  //Derived from CDialog 
     dl.DoModal(); 
    } 

    if(bInitted) 
     ::CoUninitialize(); 
} 

Это работает, но диалоговое окно, показанное не визуальные стили включен:

enter image description here

I найдено this article о том, как включить визуальные стили для библиотеки DLL. Поэтому я добавил файл ресурсов с предложенным манифеста содержания:

enter image description here

и дал ему идентификатор ресурса 123:

enter image description here

Но до сих пор нет сигару. Что мне здесь не хватает?

+0

Идентификатор ресурса 123 относится к разделу «Использование ComCtl32 версии 6 в панели управления или DLL, выполняемая RunDll32.exe». Является ли эта DLL страницей на панели управления? Если это так, то 123 необходимо, а что-то еще не так. Если это DLL, запущенная rundll32.dll, [она должна быть преобразована в обычную обычную программу) (https://blogs.msdn.microsoft.com/oldnewthing/20130104-00/?p=5643). Если ни одна из двух не верна, вы смотрите на неправильный раздел. Вероятно, вам понадобится «Добавление поддержки визуального стиля к расширению, подключаемому модулю, оснастке MMC или DLL, которая подключена к процессу». – andlabs

+0

Да, я согласен, что имена этих разделов не очень хорошие. – andlabs

+0

@DavisHeffernan: Спасибо, что указали это. Вау. Кто мог подумать, что нужно использовать эти API-интерфейсы «CreateActCtx»? – c00000fd

ответ

0

Я не думаю, что это сработает. Когда AppWizard создает проект, когда он включает в себя общие элементы управления 6, он использует прагму похожее на это:

#pragma comment(linker,"\"/manifestdependency:type='win32' \ 
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ 
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") 

Если у вас есть манифест, погруженный в EXE, для того, чтобы быть по умолчанию загружается манифест загрузчика, он должен иметь идентификатор 0. У вас есть другой идентификатор, поэтому у вас нет шансов на его работу.

Мое простое предложение - создать тестовое приложение MFC App Wizard и скопировать директиву #pragma из этого проекта. Обычно Мастер приложений помещает его в файл stdafx.h, но вы обычно можете помещать его в любой исходный файл, который вы хотите.

Также, как побочный комментарий, в методе InitInstance() вызовите функцию AfxOleInit() вместо вызова CoInitializeEx() в вашей функции ShowMyDialog(). Я также поставил AfxEnableControlContainer() в InitInsance(). Конечно, это должно быть до вызова ShowMyDialog().

+0

Идентификатор ресурса 123 относится к разделу «Использование ComCtl32 Версии 6 в панели управления или DLL, которая запускается RunDll32.exe». Если эта DLL является страницей панели управления, необходимо 123. Если это DLL, запущенная rundll32.dll, [она должна быть преобразована в обычную обычную программу) (https://blogs.msdn.microsoft.com/oldnewthing/20130104-00/?p=5643). OP специально сказал, что они создают DLL, поэтому, пока ваши советы правильны в отношении исполняемых файлов, он не отвечает на вопрос. Я более подробно прокомментировал это. – andlabs

+0

@andlabs: ну, я не могу контролировать, в какой процесс можно загрузить эту DLL. – c00000fd

+0

@ c00000fd это не о том, какой процесс загружает DLL; это о том, что подразумевается в использовании DLL. Каков предполагаемый прецедент?Часть, которую вы читаете, и я предполагаю, что вы читаете ее случайно, потому что снова имена разделов плохие, были о DLL, которые * предназначены для * запускаться системой панели управления или rundll32.dll. Я ничего не знаю о Windows, в котором вам нужно использовать rundll32.dll ... – andlabs