Использование COM объектов без регистрации в реестре¶
Механизм работы COM объектов без регистрации в реестре позволяет легко развертывать компоненты в системе без их регистярации в реестре.
На одной из стадий процесса инициализации приложения и зависимых модулей, в структуру памяти - называемую Activation Context, загружаются ассоциированные с ними manifest файлы. В случае отсутствия в реестре соответствующих записей для работы приложения, информация берется из Activation Context на стадии запуска приложения.
Активация процесса использования COM объекта без регистрации в реестре¶
1. Для приложения, зависимого от COM объекта, необходимо создать файл - манифес (manifest). Манифест должен называться так же, как и исполняемый модуль, и иметь расширение* .manifest*, например, для приложения app.exe, манифест должен называться - app.exe.manifest.
Пример манифеста:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type = "win32" name = "DJin" version = "1.0.0.0" />
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Isolator.X" version="1.0.0.0" />
</dependentAssembly>
</dependency>
</assembly>
Данный манифест встраивается в приложение DJin, и говорит о том, что приложение зависит от модуля Isolator.X.
2. Для COM объекта так же нужно создать манифест. В примере, динамическая библиотека Isolator.dll является COM объектом, поэтому для него нужно создать манифест - Isolator.X.manifest. Пример манифеста:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32" name="isolator.X" version="1.0.0.0" />
<file name = "isolator.dll">
<comClass clsid="{449F91D3-641F-4af3-831E-0784CF998538}" threadingModel = "Free" />
</file>
</assembly>
Данный манифест содержит информацию о компоненте (assembly) которая умеет создавать компонент с идентификатором
{449F91D3-641F-4af3-831E-0784CF998538}
> Юра.
Я тут подумал - а это не является ли comClass идентификатором этой компоненты.
Если да, то он может быть только ОДИН!
И мы не сможем использовать эту компоненту для создания других объектов…
> Или надо вставить несколько тегов file> с одинаковым значением атрибута name?
С этим надо разобраться.
Работа с COM объектом в приложении¶
Работа осуществляется так же, как и с любым другим COM объектом, за исключением того, что в заголовочном файле нужно директивой #import включить информацию из библиотеки COM объекта. При этом содержимое библиотеки - описанные COM интерфейсы, сконвертируются в С классы.
Пример:
#import "isolator.dll" no_namespace