Загрузите и создайте экземпляр элемента управления COM

Я использую ff-activex-host для размещения элемента управления .NET ActiveX в Firefox и Chrome. Он создаст экземпляр зарегистрированного элемента управления COM или загрузит его в CAB-файл, зарегистрирует его, а затем создаст экземпляр элемента управления COM. К сожалению, первое означает, что я не могу обновить dll элемента управления изменениями с сервера, а второе требует прав администратора.

Я хотел бы расширить плагин, чтобы он поддерживал загрузку dll и ее создание без прав администратора, но я не уверен, как это сделать. У кого-нибудь есть пример этого?

Я был бы рад полностью пропустить слой COM и вместо этого создать экземпляр базового элемента управления .NET, но это означало бы переписывание частей плагина, и примеры, которые я смог найти, предполагают, что лучший способ общения в любом случае через COM. Не могли бы вы указать мне пример C++ взаимодействия с компонентом .NET без COM? Лучшее, что я могу найти, это ExecuteInDefaultAppDomain, который кажется довольно ограниченным - я бы хотелось бы также иметь возможность прикреплять обработчики событий.


person Douglas    schedule 06.04.2011    source источник


Ответы (1)


К сожалению, точка входа COM DllRegisterServer обычно жестко запрограммирован для установки регистрации компонентов в HKEY_CLASSES_ROOT hive, в результате чего они будут созданы в HKEY_LOCAL_MACHINE\Software\Classes, что сделает невозможным установку без прав администратора.

Если вы заранее знаете, какие COM-регистрации будут созданы, вы можете сами создать ключи в HKEY_CURRENT_USER\Software\Classes вместо вызова DllRegisterServer; это позволит вам зарегистрировать элемент управления только для текущего пользователя без прав администратора.

Другой вариант, которого я настоятельно рекомендую вам избегать, если это возможно, — попытаться исправить API-интерфейсы реестра Windows в памяти, чтобы перенаправить DllRegisterServer записи в HKEY_CURRENT_USER\Software\Classes дерево. Хотя это сработает, исправление таких API — нетривиальная задача, особенно если вы делаете это внутри многопоточного приложения.

person bdonlan    schedule 06.04.2011