Могу ли я загрузить более одного COMCTL32.dll в процесс?
-
13-09-2019 - |
Вопрос
Я разрабатываю элемент управления ActiveX, который (в наши дни) используется в основном в приложениях WinForms.
Элемент управления ActiveX имеет диалоговое окно "страница свойств", которое может быть отображено программно с помощью метода ShowPropertyPages в классе AxHost.Это пользовательский пользовательский интерфейс, который можно вызвать в Visual Studio для редактирования свойств элемента управления.
Это диалоговое окно страницы свойств содержит элемент управления ListBox, который использует ImageList для отображения значков рядом с элементами списка.Эти значки представляют собой 32-разрядные растровые изображения с альфа-смешиванием.Для того чтобы они отображались должным образом, версия 6.0 или выше COMCTL32.DLL должен быть использован.
К сожалению, когда я запускаю свое приложение WinForms, оно загружается и использует COMCTL32.DLL версия 5.ххх.В результате, когда отображается диалоговое окно страницы свойств, значки выглядят плохо (полупрозрачные области нарисованы сплошным черным цветом).
Мой вопрос заключается в следующем:есть ли какой-либо способ убедиться, что я использую COMCTL32.dll версию 6.0+ из пользовательского интерфейса страницы свойств элемента управления ActiveX, независимо от того, что использует процесс?Или я могу заставить хост-процесс использовать версию 6.0?(Я думаю, что нет, потому что я думаю, что хост-процесс, возможно, уже загрузился COMCTL32.DLL в память перед любым кодом в элементе управления ActiveX.
Эта веб-страница охватывает некоторые сценарии использования COMCTL32 6.0, но не ту ситуацию, в которой я нахожусь.
Решение
Оригинальная статья MSDN сбила меня с толку, потому что она была сосредоточена на ряде конкретных сценариев, ни один из которых не соответствовал моему.На самом деле, лежащая в основе технология, о которой идет речь, работает в более общем плане.
Автор: добавление XML-файла "манифеста" используя ресурсы библиотеки DLL ActiveX, я могу сообщить параллельной системе, что хочу использовать эту библиотеку DLL COMCTL32.DLL 6.x.Затем эта версия загружается автоматически.Довольно мило.
Этот манифест должен иметь тип ресурса RT_ПРОЯВЛЕНИЕ, с идентификатором ресурса , равным 2.
Вот свидетельство успеха (две версии одной и той же библиотеки DLL загружены в одном процессе!):
(кроме того, значки правильно отображаются в списке ;))
Другие советы
Если ваше приложение вызывает Application.Включите функцию VisualStyles() (обычно перед вызовом Application.Run() для запуска цикла отправки сообщений), тогда следует использовать версию 6 + библиотеки common controls.