2017-07-21 23 views
0

我们执行与热下面的命令行(3.0.5210.0):维克斯Heat.exe VS2008后,产生不同的输出 - > VS2015升级

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,他们都没有给出“旧”输出。

回答

1

那么主键重复意味着你已经在你的wix源代码中的两个不同的地方得到了相同的RegistryValue。

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

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

+0

'1)'是的,_duplicated keys_来自第6行+10(第二个xml)..........'2)'_DLL自注册_可能与新的VC++编译器不同,应该检查,但这看起来不是一件容易的事情........'3)'是的,源代码是一样的,项目文件没有使用,我们从命令行(cl.exe/link.exe) – Zotyi

+1

2)我至少会比较HKCR \ CLSID \ {B1AB297C-1BC6-65E1-A7C1-A1833DFAED6A} \ InProcServer32的值。是一个引用,另一个不是? – tjleigh

+0

我检查了,2008年和2015年编译DLL自注册存储在注册表中相同的键+值。除了一个值的差别:正是你说的关键字:vs2008存储为短路径格式(不含引号),vs2015以长路径格式存储,**用引号**。但是我不认为这可能是生成的.wxs文件有显着差异的原因。但我可能是错的。 – Zotyi