c++ - WiX Heat.exe 在 VS2008 -> VS2015 升级后生成不同的输出

标签 c++ visual-studio-2015 visual-studio-2008 wix heat

我们用 heat (3.0.5210.0) 执行以下命令行:

heat.exe -srd -suid file OurLib.dll -out bin_OurLib.tmp

OurLib.dll是一个VC++ 2008 dll文件,它是一个COM组件。

输出(bin_OurLib.tmp)

    <?xml version="1.0" encoding="utf-8"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
        <Fragment>
            <DirectoryRef Id="TARGETDIR">
                <Component Id="OurLib.dll" Guid="PUT-GUID-HERE">
                    <File Id="OurLib.dll" KeyPath="yes" Source="SourceDir\OurLib.dll">
                        <Class Id="{B1AB297C-1BC6-65E1-A7C1-A1833DFAED6A}" Context="InprocServer32" Description="OurProduct.OurLib">
                            <ProgId Id="OurProduct.OurLib" Description="OurProduct.OurLib" />
                        </Class>
                    </File>
                </Component>
            </DirectoryRef>
        </Fragment>
    </Wix>

这很好用。 现在我们将 VS 更新到 2015,并用它编译 OurLib。 现在运行相同的加热命令会导致不同的输出:

    <?xml version="1.0" encoding="utf-8"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
        <Fragment>
            <DirectoryRef Id="TARGETDIR">
                <Component Id="OurLib.dll" Guid="PUT-GUID-HERE">
                    <Class Id="{B1AB297C-1BC6-65E1-A7C1-A1833DFAED6A}" Context="InprocServer32" Description="OurProduct.OurLib">
                        <ProgId Id="OurProduct.OurLib" Description="OurProduct.OurLib" />
                    </Class>
                    <File Id="OurLib.dll" KeyPath="yes" Source="SourceDir\OurLib.dll" />
                    <RegistryValue Root="HKCR" Key="CLSID\{B1AB297C-1BC6-65E1-A7C1-A1833DFAED6A}\InProcServer32" Value="&quot;[#OurLib.dll]&quot;" Type="string" Action="write" />
                </Component>
            </DirectoryRef>
        </Fragment>
    </Wix>

当wix链接时,它给出了错误:

错误 LGHT0130:主键“reg51A1FC16367511AF81E9B18CA009A1C6”在表“注册表”中重复。请删除其中一个条目或重命名主键的一部分以避免冲突。

查看wixobj文件,reg51A1FC16367511AF81E9B18CA009A1C6与行相关 <Class Id="{B1AB297C-1BC6-65E1-A7C1-A1833DFAED6A}...."<RegistryValue Root="HKCR" Key="CLSID\{B1AB.... - 显然。

Anwyay,这显然是由于生成的 wix 输出文件不同所致。 为什么如果使用较新的 C++ 编译器编译 dll 会导致 WIX HEAT 生成不同的输出,同时运行相同的选项等。

我怎样才能得到我们需要的相同“旧”输出。

尝试使用 -scom 和 -sreg,它们都没有返回“旧”输出。

最佳答案

好吧,主键重复意味着您在 Wix 源代码的两个不同位置以某种方式获得了相同的 RegistryValue。

或者较新的 DLL 的自注册方式不同?它将 InProcServer32 值放在引号中。我认为这不正常。

或者您检查过您的 2008 和 2015 DLL 源文件和项目文件是否相同? VS 项目升级过程改变了一些事情...

关于c++ - WiX Heat.exe 在 VS2008 -> VS2015 升级后生成不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45240538/

相关文章:

c++ - 错误 C2678 : binary '+' : no operator found which takes a left-hand operand of type 'volatile A' (or there is no acceptable conversion)

visual-studio-2015 - 如何在 Visual Studio 2015 中更改大括号/括号颜色

visual-studio-2015 - ASP.Net 5 : Solution architecture

.net - 如何让 TFS 自动删除旧版本的文件?

c++ - 查看在 Visual C++ 2008 调试器中分配为 char 的内存位置上的整数

c++ - 在 VS2012 静态库、控制台应用程序和 clr 程序上使用 cryptopp 出现链接错误

c++ - 尝试将观察者注册到模板主题类时出现编译错误

c++ - 奇怪的赋值——匿名函数调用?

c++ - Xcode shell脚本调用错误

c# - 如何在C++项目中使用DLL库文件?