Экспорт информации о регистрации 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) здесь:

https://marketplace.visualstudio.com/items?itemName=VisualStudioClient.MicrosoftVisualStudio2017InstallerProjects

У меня была короткая игра, и, похоже, она извлекает регистрационную информацию COM. Другое дело, извлечет ли он всю информацию, которую regsvr32 поместил бы в реестр.

Другие вопросы по тегам