Экспорт информации о регистрации COM

Есть ли возможность на любом языке (c / c ++ / c #, VB и т. Д.) Я не забочусь) экспортировать всю информацию о регистрации COM (такую ​​как clsid, progid, typelib, interface, appid и т. д.)? Или ты знаешь надежный инструмент, который экспортирует эту информацию, включая всю 32-разрядную и 64-разрядную информацию?

По сути, я хочу сделать то, что делает regsvr32, но «в файле», а не записывать его в реестр. Решением может быть API-вызов или класс сборки или все, что поддерживает меня, или это может быть инструмент, с помощью которого вы можете экспортировать информацию в файл. Помните, что инструмент, если так, должен делать это как для COM, так и для сборок взаимодействия.
(Я не заинтересован в wisecomcaputure или эквиваленте adminstudio)

Для пояснения моя точка зрения здесь:
Я инженер по настройке. Я в основном хочу знать способ получения всей регистрационной информации COM или Interop Object, который обычно помещается в реестр, путем вызова regsvr32.

Я очень рад любой помощи или подсказкам

Элиан

1

Решение

Существует малоизвестный, но очень удобный API: RegOverridePredefKey. Это позволяет делать именно то, что вы ищете:

RegOverridePredefKey функция предназначена для программного обеспечения
Установочные программы. Это позволяет им переназначить предопределенный ключ, загрузить
компонент DLL, который будет установлен в системе, вызвать запись
указать в DLL, и изучить изменения в реестре, что
Компонент попытался сделать. Программа установки может тогда написать
эти изменения в местах, предназначенных для DLL, или внести изменения в
данные перед записью.

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

1

Другие решения

Мы используем WiX в нашей компании для создания установщиков, и сбор этой информации реестра для сборок COM часто имеет важное значение в процессе установки. В комплекте WiX есть инструмент под названием Heat, который в основном собирает эту информацию и помещает ее в XML-файл. Этот xml относится только к WiX, но все же может вам помочь.

Пример команды Heat для этого:

C:\Program Files (x86)\WiX Toolset v3.8\bin\Heat.exe dir ..\ExactaRFBinaries\ -cg ExactaRF -dr RFINSTALLFOLDER -srd -var var.RFBasePath -gg -sfrag -suid -out ExactaRF.wxs

Вывод будет выглядеть примерно так:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="RFINSTALLFOLDER">
<Component Id="ContainerObj.dll" Guid="{A23592C5-E88D-4F56-A853-AE62085F9A91}">
<File Id="ContainerObj.dll" KeyPath="yes" Source="$(var.RFBasePath)\ContainerObj.dll">
<TypeLib Id="{8EB27E71-FA87-11D3-A3B3-00104B082353}" Description="ContainerObj 1.0 Type Library" HelpDirectory="RFINSTALLFOLDER" Language="0" MajorVersion="1" MinorVersion="0">
<Class Id="{2F467C72-FE8A-11D3-A3B7-00104B082353}" Context="InprocServer32" Description="Containers Class" ThreadingModel="apartment" Programmable="yes">
<ProgId Id="ContainerObj.Containers.1" Description="Containers Class">
<ProgId Id="ContainerObj.Containers" Description="Containers Class" />
</ProgId>
</Class>
<Class Id="{8EB27E80-FA87-11D3-A3B3-00104B082353}" Context="InprocServer32" Description="Container Class" ThreadingModel="apartment" Programmable="yes">
<ProgId Id="ContainerObj.Container.1" Description="Container Class">
<ProgId Id="ContainerObj.Container" Description="Container Class" />
</ProgId>
</Class>
<Interface Id="{2F467C71-FE8A-11D3-A3B7-00104B082353}" Name="IContainers" ProxyStubClassId32="{00020424-0000-0000-C000-000000000046}" />
<Interface Id="{8EB27E7F-FA87-11D3-A3B3-00104B082353}" Name="IContainer" ProxyStubClassId32="{00020424-0000-0000-C000-000000000046}" />
</TypeLib>
</File>
</Component>
<Component Id="ContainerUseMod.dll" Guid="{48616A97-02AA-4C02-AC5D-F41313B3C0F2}">
<File Id="ContainerUseMod.dll" KeyPath="yes" Source="$(var.RFBasePath)\ContainerUseMod.dll">
<TypeLib Id="{7590DB15-C326-11D3-99A9-0080C84E7C62}" Description="ContainerUseMod 1.0 Type Library" HelpDirectory="RFINSTALLFOLDER" Language="0" MajorVersion="1" MinorVersion="0">
<Class Id="{7590DB22-C326-11D3-99A9-0080C84E7C62}" Context="InprocServer32" Description="ContainerUse Class" ThreadingModel="apartment" Programmable="yes">
<ProgId Id="ContainerUseMod.ContainerUse.1" Description="ContainerUse Class">
<ProgId Id="ContainerUseMod.ContainerUse" Description="ContainerUse Class" />
</ProgId>
</Class>
<Interface Id="{7590DB21-C326-11D3-99A9-0080C84E7C62}" Name="IContainerUse" ProxyStubClassId32="{00020424-0000-0000-C000-000000000046}" />
</TypeLib>
</File>
</Component>
</DirectoryRef>
</Fragment>
<Fragment>
<ComponentGroup Id="ExactaRF">
<ComponentRef Id="ContainerObj.dll" />
<ComponentRef Id="ContainerUseMod.dll" />
</ComponentGroup>
</Fragment>
</Wix>

WiX является открытым исходным кодом, так что вы можете, возможно, взглянуть на исходный код Heat и разработать собственное решение.

1

Да, это возможно. Тем не менее, единственный инструмент, который я знаю, является частным и используется внутри моей компании. Я не уверен точно, как это происходит, и я не могу выдать источник, к сожалению.

Поискивая в источнике, кажется, что он получает все ресурсы DLL-библиотек COM и что-то делает с ресурсами, а также извлекает некоторую информацию из библиотек типов (это программа командной строки, которой можно дать dll или TLB).

Код написан на C ++ и C # и составляет около 1400 LOC.

Код использует интерфейсы COM ITypeLib а также ITypeInfo и TYPEATTR состав. Я вижу звонки ITypeInfo::GetDocumentation, ITypeInfo::GetTypeAttr, LoadTypeLibEx, EnumResourceNames. Выводом программы является файл .reg, который, по-видимому, отформатирован кодом инструмента, а не внешней библиотекой.

0
По вопросам рекламы [email protected]