Экспорт информации о регистрации COM
Есть ли возможность на любом языке (c/ C++/ C#,VB и т. Д., Который я НЕ УХОДУ) экспортировать всю информацию о регистрации COM (такую как clsid, progid, typelib, interface, appid и т. Д.)? Или вы знаете надежный инструмент, который экспортирует эту информацию, включая всю 32-битную и 64-битную информацию?
По сути, я хочу сделать то, что делает regsvr32, но "в файле", а не записывать его в реестр. Решением может быть API-вызов или класс сборки или все, что поддерживает меня, или это может быть инструмент, с помощью которого вы можете экспортировать информацию в файл. Помните, что инструмент, если так, должен делать это как для COM, так и для сборок взаимодействия. (Я не заинтересован в wisecomcaputure или эквиваленте adminstudio)
Для пояснения моя точка зрения здесь: я инженер по настройке. Я в основном хочу узнать, как получить всю регистрационную информацию COM или Interop Object, который обычно помещается в реестр, путем вызова regsvr32.
Я очень рад любой помощи или подсказкам
Элиан
4 ответа
Существует малоизвестный, но очень удобный API: RegOverridePredefKey
, Это позволяет делать именно то, что вы ищете:
RegOverridePredefKey
Функция предназначена для программ установки программ. Это позволяет им переназначать предопределенный ключ, загружать компонент DLL, который будет установлен в системе, вызывать точку входа в DLL и проверять изменения в реестре, которые компонент попытался внести. Затем программа установки может записать эти изменения в места, предназначенные для DLL, или внести изменения в данные перед записью.
Следуйте документам для получения более подробной информации. После того, как вы повторно сопоставили HKEY_CLASSES_ROOT
ключ и называется сервер COM DllRegisterServer
использовать RegSaveKey
чтобы сохранить переназначенный ключ в файл, обработайте файл и измените отображение обратно на HKEY_CLASSES_ROOT
,
Мы используем 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, если хотите, и разработать собственное решение.
Да, это возможно. Тем не менее, единственный инструмент, который я знаю, является частным и используется внутри моей компании. Я не уверен точно, как это происходит, и я не могу выдать источник, к сожалению.
Поискивая в источнике, кажется, что он получает все ресурсы DLL-библиотек COM и что-то делает с ресурсами, а также извлекает некоторую информацию из библиотек типов (это программа командной строки, которой можно дать dll или TLB).
Код написан на C++ и C# и составляет около 1400 LOC.
Код использует интерфейсы COM ITypeLib
а также ITypeInfo
и TYPEATTR
структура. Я вижу звонки ITypeInfo::GetDocumentation
, ITypeInfo::GetTypeAttr
, LoadTypeLibEx
, EnumResourceNames
, Выходные данные программы - это файл.reg, который, кажется, отформатирован кодом инструмента, а не внешней библиотекой.
Мы нашли небольшую утилиту под названием RegCap, которую Microsoft включила в расширение Visual Studio под названием Visual Studio Installer Projects. Полный пакет можно загрузить из Visual Studio Marketplace (это файл vsix) здесь:
У меня была короткая игра, и, похоже, она извлекает регистрационную информацию COM. Другое дело, извлечет ли он всю информацию, которую regsvr32 поместил бы в реестр.