Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 导出COM注册信息_C++_Dll_Com_Registration_Ocx - Fatal编程技术网

C++ 导出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

是否有可能以任何语言(c/c++/c#,VB等,我不关心)导出所有COM注册信息(如clsid、progid、typelib、接口、appid等)?或者您知道一种可靠的工具,可以导出包括所有32位和64位信息在内的信息吗

基本上,我想做的是regsvr32所做的,但是“在文件中”,而不是将其写入注册表。解决方案可以是一个API调用或汇编类或任何支持我这样做的东西,也可以是一个可以将信息导出到文件的工具。请注意,如果是这样,该工具应该为COM以及互操作程序集执行此操作。 (我对wisecomcaputure或等同于adminstudio的软件不感兴趣)

为了澄清,我的观点如下: 我是一名安装工程师。我主要想知道一种方法,通过调用regsvr32来获取通常放置在注册表中的COM或互操作对象的所有注册信息

我很高兴得到任何帮助或提示


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
添加到我最喜欢的标签上,以避免丢失更多的宝石