2013-05-20 30 views
5

CodeProject有很大的Windows shell extension tutorialWiX相当于“Regasm.exe my.dll/codebase”?

编译,运行Regasm.exe CSShellExtContextMenuHandler.dll /codebase,并且shell扩展可用,它的工作原理很好。

但要求用户运行Regasm不方便用户,所以我写了下面的小型WiX脚本。 (刚刚复制了heat的输出,再加上我想要使用的依赖关系DLL)。

问题:当我安装所产生的MSI,外壳扩展没有出现(在Windows资源管理器中,在文件上右键单击不显示我的项目,尽管它与Regasm工作)

<?xml version='1.0' encoding='windows-1252'?> 
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'> 

    <Product Name='HelloWorld Shell Extension' Id='2afd44ab-16d7-40f4-8741-69ad546cb7cf' UpgradeCode='c5139d19-21ba-43c6-a17d-68760331f332' 
    Language='1033' Codepage='1252' Version='0.4.4' Manufacturer='Me'> 

    <Package Id='*' Keywords='Installer' Description="HelloWorld Shell Extension Setup" Manufacturer='Me' 
     InstallerVersion='100' Languages='1033' Compressed='yes' SummaryCodepage='1252' /> 

    <Media Id='1' Cabinet='HelloWorldShellExtension.cab' EmbedCab='yes' DiskPrompt='HelloWorld CAB' /> 
    <Property Id='DiskPrompt' Value="HelloWorldShellExtension Bundle CAB Installation" /> 

    <Directory Id='TARGETDIR' Name='SourceDir'> 
     <Directory Id='ProgramFilesFolder' Name='PFiles'> 
      <Directory Id='INSTALLDIR' Name='HelloWorldShellExtension'> 
      <Component Id="cmpB0970E4FB9610FC20E1C6B6B2D45C606" Guid="7044db96-17d3-4d4f-93b0-135b89b042c8"> 
       <Class Id="{CE43A2AB-B457-49BF-C83F-4306208D438B}" Context="InprocServer32" Description="CSShellExtContextMenuHandler.FileContextMenuExt" ThreadingModel="both" ForeignServer="mscoree.dll"> 
        <ProgId Id="CSShellExtContextMenuHandler.FileContextMenuExt" Description="CSShellExtContextMenuHandler.FileContextMenuExt" /> 
       </Class> 
       <File Id="fil5B7C752C5541C807852A6781921F95AB" KeyPath="yes" Source="bin\CSShellExtContextMenuHandler.dll" /> 
       <RegistryValue Root="HKCR" Key="*\shellex\ContextMenuHandlers\{ce43a2ab-b457-49bf-c83f-4306208d438b}" Value="CSShellExtContextMenuHandler.FileContextMenuExt Class" Type="string" Action="write" /> 
       <RegistryValue Root="HKCR" Key="CLSID\{CE43A2AB-B457-49BF-C83F-4306208D438B}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" Value="" Type="string" Action="write" /> 
       <RegistryValue Root="HKCR" Key="CLSID\{CE43A2AB-B457-49BF-C83F-4306208D438B}\InprocServer32\1.0.0.0" Name="Class" Value="CSShellExtContextMenuHandler.FileContextMenuExt" Type="string" Action="write" /> 
       <RegistryValue Root="HKCR" Key="CLSID\{CE43A2AB-B457-49BF-C83F-4306208D438B}\InprocServer32\1.0.0.0" Name="Assembly" Value="CSShellExtContextMenuHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=73df467e0a99a326" Type="string" Action="write" /> 
       <RegistryValue Root="HKCR" Key="CLSID\{CE43A2AB-B457-49BF-C83F-4306208D438B}\InprocServer32\1.0.0.0" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" /> 
       <RegistryValue Root="HKCR" Key="CLSID\{CE43A2AB-B457-49BF-C83F-4306208D438B}\InprocServer32\1.0.0.0" Name="CodeBase" Value="file:///[#fil5B7C752C5541C807852A6781921F95AB]" Type="string" Action="write" /> 
       <RegistryValue Root="HKCR" Key="CLSID\{CE43A2AB-B457-49BF-C83F-4306208D438B}\InprocServer32" Name="Class" Value="CSShellExtContextMenuHandler.FileContextMenuExt" Type="string" Action="write" /> 
       <RegistryValue Root="HKCR" Key="CLSID\{CE43A2AB-B457-49BF-C83F-4306208D438B}\InprocServer32" Name="Assembly" Value="CSShellExtContextMenuHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=73df467e0a99a326" Type="string" Action="write" /> 
       <RegistryValue Root="HKCR" Key="CLSID\{CE43A2AB-B457-49BF-C83F-4306208D438B}\InprocServer32" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" /> 
       <RegistryValue Root="HKCR" Key="CLSID\{CE43A2AB-B457-49BF-C83F-4306208D438B}\InprocServer32" Name="CodeBase" Value="file:///[#fil5B7C752C5541C807852A6781921F95AB]" Type="string" Action="write" /> 
      </Component> 
      <Component Id='Libraries' Guid='f982a0bb-824d-4835-921d-e51b47b8598b'> 
       <File Id='dependency.dll' Name='dependency.dll' Source='bin\dependency.dll' DiskId='1' /> 
      </Component> 
     </Directory> 
     </Directory> 
    </Directory> 

    <Feature Id='HelloWorldShellExtensionFeature' Title='HelloWorld' Description='HelloWorld' Level='1' AllowAdvertise='no'> 
     <ComponentRef Id="cmpB0970E4FB9610FC20E1C6B6B2D45C606" /> 
     <ComponentRef Id="Libraries" /> 
    </Feature> 

    <UI> 
     <UIRef Id="WixUI_InstallDir" /> 
    </UI> 

    <Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR" /> 
    </Product> 
</Wix> 

我试图将Root="HKCR" Key="[...]"更改为Root="HKLM" Key="SOFTWARE\Classes\[...]",以模仿Regasm实际安装的密钥,但这也不起作用。

回答

4

首先,您使用的CLSID与原始示例源不同。也许你编辑它是为了让它成为你自己的。确保您使用的值与FileContextMenuExt类中的属性值相同。

WiX的heat.exe似乎不支持代码库元素。也许假设是,既然你是在整个机器上注册COM组件,那么你也可以把它放在机器范围内的组装位置(即GAC)。如果你这样做,代码库将不是必需的。

heat file ...将生成除Codebase元素之外的所有内容,但您已经手动输入了该内容,我明白了。您还有其他所需的注册条目,*\shellex\ContextMenuHandlers。它是特定于应用程序的元素,因此无法生成。但是,你也是手动输入的。

最后,安装程序和explorer.exe必须具有相同的“比特级”。否则,安装程序可能会为64位explorer.exe无法看到的32位explorer.exe创建注册表项。要部署产品,您必须安装x86和X64版本的安装程序。您可以在Wix/Product/Package元素中明确设置包的平台。

除此之外,您的Product.wxs“适用于我的机器。”