Могу ли я загрузить более одного COMCTL32.dll в процесс?

StackOverflow https://stackoverflow.com/questions/971445

Вопрос

Я разрабатываю элемент управления 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 загружены в одном процессе!):procexp screenshot showing two COMCTL32's loaded in process

(кроме того, значки правильно отображаются в списке ;))

Другие советы

Если ваше приложение вызывает Application.Включите функцию VisualStyles() (обычно перед вызовом Application.Run() для запуска цикла отправки сообщений), тогда следует использовать версию 6 + библиотеки common controls.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top