Как сделать COM без регистрации в подключаемой архитектуре
-
21-09-2019 - |
Вопрос
Мы используем файлы манифеста для создания COM без регистрации, как я также подробно описал в этот другой вопрос.
Теперь мы пытаемся использовать бесплатный от регистрации COM с приложением, поддерживающим подключаемые модули.Подключаемые модули представляют собой файлы OCX, которые могут быть добавлены в папку основного приложения после того, как основное приложение уже установлено.
Однако это означает, что файл манифеста основного приложения должен быть исправлен программой установки подключаемого модуля.Это кажется опасным и подверженным ошибкам занятием, особенно если может быть установлено несколько подключаемых модулей.
Есть ли способ каким-то образом разделить файл манифеста основного приложения, чтобы каждый подключаемый модуль мог безопасно добавлять свою собственную часть в виде отдельного файла?Или другой безопасный способ исправить файл манифеста?
В случае, если это уместно:мы создаем наши установщики с викс.
Решение
Я бы не рекомендовал изменять файл манифеста приложения;это кажется довольно хрупким и будет работать только в том случае, если оно находится в месте, доступном для записи.
При запуске процесса манифест приложения используется для создания "контекста активации", который передается в качестве контекста активации всего процесса.Но каждый поток также имеет стек контекста активации, которым можно напрямую манипулировать.Операции в данном потоке просматривают как самый верхний контекст в стеке, так и контекст активации в масштабах всего процесса при поиске регистрационных данных COM.
Рекомендация заключается в том, что каждый раз, когда коду плагина необходимо вызвать COM, в потоке должен быть активирован специфичный для плагина манифест.Проще всего это сделать одним из двух способов:
Вставьте специфичный для плагина манифест в виде ID2-манифеста в плагин и скомпилируйте с помощью макроса ISOLATION_AWARE_ENABLED ВКЛЮЧЕНО определенный.Это в основном обертывает обычные API Windows, которым требуется контекст из манифеста для автоматической активации и деактивации соответствующего контекста активации вокруг вызова.
Активируйте / деактивируйте соответствующий контекст активации в потоке вокруг всех точек входа в плагин.Это делается с помощью API контекста активации.Это проще всего сделать с помощью активации объект управления контекстом.
Другие советы
Если вы используете .Net, вы можете использовать код показано в этом ответе, чтобы позаботиться о контекстах активации.