Как сделать COM без регистрации в подключаемой архитектуре

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

  •  21-09-2019
  •  | 
  •  

Вопрос

Мы используем файлы манифеста для создания COM без регистрации, как я также подробно описал в этот другой вопрос.

Теперь мы пытаемся использовать бесплатный от регистрации COM с приложением, поддерживающим подключаемые модули.Подключаемые модули представляют собой файлы OCX, которые могут быть добавлены в папку основного приложения после того, как основное приложение уже установлено.

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

Есть ли способ каким-то образом разделить файл манифеста основного приложения, чтобы каждый подключаемый модуль мог безопасно добавлять свою собственную часть в виде отдельного файла?Или другой безопасный способ исправить файл манифеста?

В случае, если это уместно:мы создаем наши установщики с викс.

Это было полезно?

Решение

Я бы не рекомендовал изменять файл манифеста приложения;это кажется довольно хрупким и будет работать только в том случае, если оно находится в месте, доступном для записи.

При запуске процесса манифест приложения используется для создания "контекста активации", который передается в качестве контекста активации всего процесса.Но каждый поток также имеет стек контекста активации, которым можно напрямую манипулировать.Операции в данном потоке просматривают как самый верхний контекст в стеке, так и контекст активации в масштабах всего процесса при поиске регистрационных данных COM.

Рекомендация заключается в том, что каждый раз, когда коду плагина необходимо вызвать COM, в потоке должен быть активирован специфичный для плагина манифест.Проще всего это сделать одним из двух способов:

  1. Вставьте специфичный для плагина манифест в виде ID2-манифеста в плагин и скомпилируйте с помощью макроса ISOLATION_AWARE_ENABLED ВКЛЮЧЕНО определенный.Это в основном обертывает обычные API Windows, которым требуется контекст из манифеста для автоматической активации и деактивации соответствующего контекста активации вокруг вызова.

  2. Активируйте / деактивируйте соответствующий контекст активации в потоке вокруг всех точек входа в плагин.Это делается с помощью API контекста активации.Это проще всего сделать с помощью активации объект управления контекстом.

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

Если вы используете .Net, вы можете использовать код показано в этом ответе, чтобы позаботиться о контекстах активации.

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