Могу ли я загрузить более одного файла COMCTL32.dll в процесс? - PullRequest
2 голосов
/ 09 июня 2009

Я разрабатываю элемент управления ActiveX, который (в наши дни) используется в основном в приложениях WinForms.

Элемент управления ActiveX имеет диалоговое окно «страница свойств», которое можно программно отобразить с помощью метода ShowPropertyPages в классе AxHost. Это пользовательский интерфейс, который можно вызвать в Visual Studio для редактирования свойств элемента управления.

Этот диалог страницы свойств содержит элемент управления ListBox, который использует ImageList для отображения значков рядом с элементами списка. Эти значки являются 32-битными альфа-смешанными растровыми изображениями. Чтобы они отображались правильно, необходимо использовать версию 6.0 или выше COMCTL32.DLL.

К сожалению, когда я запускаю свое приложение WinForms, оно загружается и использует версию COMCTL32.DLL 5.xxx . В результате при отображении диалогового окна страницы свойств значки выглядят плохо (полупрозрачные области отображаются сплошным черным цветом).

Мой вопрос: есть ли способ убедиться, что я использую COMCTL32.dll версии 6.0+ из пользовательского интерфейса страницы свойств элемента управления ActiveX, независимо от того, какой процесс используется? Или я могу заставить хост-процесс использовать версию 6.0? (Я думаю, что нет, потому что я думаю, что хост-процесс, возможно, уже загрузил COMCTL32.DLL в память до того, как какой-либо код в элементе управления ActiveX.

Эта веб-страница охватывает некоторые сценарии использования COMCTL32 6.0, но не ситуацию, в которой я нахожусь.

Ответы [ 2 ]

2 голосов
/ 10 июня 2009

Оригинальная статья MSDN смутила меня, потому что она была сосредоточена на ряде конкретных сценариев, ни один из которых не соответствовал моему. Фактически, базовая технология, о которой идет речь, работает в более общем смысле.

Путем добавления XML-файла манифеста ресурса в DLL-библиотеку ActiveX я могу сигнализировать параллельной системе, что я хочу, чтобы эта DLL-библиотека использовала COMCTL32.DLL 6.x. Эта версия загружается автоматически. Довольно мило.

Этот манифест должен иметь тип ресурса RT_MANIFEST , с идентификатором ресурса 2 .

Вот свидетельство успеха (две версии одной и той же DLL, загруженные в одном процессе!): procexp screenshot showing two COMCTL32's loaded in process

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

0 голосов
/ 09 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...