C++ 导出COM注册信息
是否有可能以任何语言(c/c++/c#,VB等,我不关心)导出所有COM注册信息(如clsid、progid、typelib、接口、appid等)?或者您知道一种可靠的工具,可以导出包括所有32位和64位信息在内的信息吗 基本上,我想做的是regsvr32所做的,但是“在文件中”,而不是将其写入注册表。解决方案可以是一个API调用或汇编类或任何支持我这样做的东西,也可以是一个可以将信息导出到文件的工具。请注意,如果是这样,该工具应该为COM以及互操作程序集执行此操作。 (我对wisecomcaputure或等同于adminstudio的软件不感兴趣) 为了澄清,我的观点如下: 我是一名安装工程师。我主要想知道一种方法,通过调用regsvr32来获取通常放置在注册表中的COM或互操作对象的所有注册信息 我很高兴得到任何帮助或提示C++ 导出COM注册信息,c++,dll,com,registration,ocx,C++,Dll,Com,Registration,Ocx,是否有可能以任何语言(c/c++/c#,VB等,我不关心)导出所有COM注册信息(如clsid、progid、typelib、接口、appid等)?或者您知道一种可靠的工具,可以导出包括所有32位和64位信息在内的信息吗 基本上,我想做的是regsvr32所做的,但是“在文件中”,而不是将其写入注册表。解决方案可以是一个API调用或汇编类或任何支持我这样做的东西,也可以是一个可以将信息导出到文件的工具。请注意,如果是这样,该工具应该为COM以及互操作程序集执行此操作。 (我对wisecomcap
Eliane是的,这是可能的。然而,我知道的唯一工具是专有的,并在公司内部使用。不幸的是,我不确定它到底是如何做到的,我也不能给出它的来源 在源代码中,它似乎获得了COM dll的所有资源,并利用这些资源做了一些事情,它从类型库中提取了一些信息(这是一个可以提供dll或tlb的命令行程序) <代码>用C++和C语言编写,代码约为1400 LOC。
该代码使用COM接口和。我看到了对
ITypeInfo::GetDocumentation
,ITypeInfo::GetTypeAttr
的调用。程序的输出是一个.reg文件,它似乎是由工具代码而不是外部库格式化的。我们公司使用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是开源的,因此如果您愿意,您可以查看热源代码并设计自己的解决方案。有一个鲜为人知但非常方便的API:。它允许您准确地执行您想要的操作:
RegOverridePredefKey
功能适用于软件
安装程序。它允许他们重新映射预定义的键,即load
将安装在系统上的DLL组件调用一个条目
指向DLL,并检查
组件试图创建一个。然后,安装程序可以编写
对DLL所需位置的更改,或对
在写入数据之前先删除数据
请按照下面的说明了解更多详细信息。重新映射
HKEY_CLASSES_ROOT
键并调用COM服务器的DllRegisterServer
后,使用将重新映射的键保存到文件中,处理该文件并将映射更改回HKEY_CLASSES_ROOT,即使它不合适……您是否可以看到调用的函数?我很确定这些函数可能是API调用。你能看到包裹或类似的东西吗D谢谢,我正在烧录信息(也许你可以上传整个工具?;)看,我真的烧录了信息!!!:)@elime我编辑了答案以包含一些关于API调用的信息。我不会上传该工具的源代码或二进制文件。我知道你可能面临着迅速完成任务的压力,但我不会为了帮助你而牺牲我的道德。祝你好运。你可以运行一个监控注册表更改的实用程序,然后执行regsvr32
,然后检查该实用程序的输出。似乎可以使用它来创建一个小的可执行文件,在命令行上获取一个COM DLL,并输出一个带有注册更改的.reg
文件。@MattMcNabb,确实,不仅如此,例如:天哪,从长远来看,这个线程将为我节省大量时间:)我需要将com
添加到我最喜欢的标签上,以避免丢失更多的宝石