Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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
从我的WiX安装程序安装设备驱动程序(打包在.exe中)时遇到困难_Wix_Windows Installer_Wix3.5_Custom Action - Fatal编程技术网

从我的WiX安装程序安装设备驱动程序(打包在.exe中)时遇到困难

从我的WiX安装程序安装设备驱动程序(打包在.exe中)时遇到困难,wix,windows-installer,wix3.5,custom-action,Wix,Windows Installer,Wix3.5,Custom Action,我一直在努力构建一个新的WiX安装程序,我真的很满意,只是我还需要安装一个设备驱动程序 理想情况下,我希望能够通过使用RegistrySearch来检测此驱动程序的存在,例如 <Property Id="DRIVERINSTALLED"> <RegistrySearch Id="DriverInstalledSearch" Root="HKLM" Key="SOFTWARE\DriverCompany\Settings" Name="InstallPath" Type=

我一直在努力构建一个新的WiX安装程序,我真的很满意,只是我还需要安装一个设备驱动程序

理想情况下,我希望能够通过使用
RegistrySearch
来检测此驱动程序的存在,例如

<Property Id="DRIVERINSTALLED">
    <RegistrySearch Id="DriverInstalledSearch" Root="HKLM" Key="SOFTWARE\DriverCompany\Settings" Name="InstallPath" Type="raw" />
</Property>
根据一些搜索,听起来我只是需要以管理员的身份运行,但我的安装程序已经触发了UAC。。。果然,在提升的命令提示符下运行安装程序没有帮助

有人能为我推荐下一步的调试方法吗?如果您还有关于如何基于注册表项的存在进行有条件安装的信息,那也非常好。谢谢大家!

编辑——我已经在WindowsXP32位和Windows7 32位上运行了我的安装程序,但在这两个版本上都失败了。还有一个理由相信这与权限无关


编辑#2——我不知道为什么我以前没有尝试这个,但我从setup.exe改为notepad.exe,然后启动了notepad。所以很明显,CustomAction是有效的。我将使用Process Monitor重试,以查看它在哪里查找setup.exe。。。或者我只是无法在另一个安装程序中运行安装程序?

我想修改我的答案,以涵盖我学到的与我认为的典型场景相关的内容:

  • 您要自定义对话框中的位图
  • 您可能还想跳过许可协议
  • 您希望检测某些先决条件的存在,如.NET Framework 4.0
  • 您希望编写一个安装程序,以便在安装过程结束时安装其他一些软件,如设备驱动程序
  • 您希望使用注册表项的存在使前面提到的复选框不可见
  • 您可能需要包含一个合并模块,比如VC++2010可再发行版本
第一件事:

  • 所有的信息都在互联网上。我只是花了几个小时费力地浏览信息和尝试一些东西
  • 要有耐心,不要放弃
  • 不要仅仅依赖谷歌。WiX文档(在.chm中)有大量的信息。我建议你也在那里搜索,如果不是先搜索的话
  • 我已经说过了,“耐心点,不要放弃!”
骨架WXS 以下各节仅包含与其直接相关的信息。在答案的最后,我将发布一个骨架(部分完成).wxs

检测.NET Framework 4.0

首先,您需要向WixNetFxExtension添加一个项目引用。然后将此XML添加到您的
节点:(在.chm中搜索“.NET”)

您的
节点现在将如下所示:

<UI>
    <UIRef Id="WixUI_InstallDir" />
    <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="2">1</Publish>
    <Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2">1</Publish>
    <Publish Dialog="ExitDialog" Control="Finish" Order="1" Event="DoAction" Value="InstallDeviceDrivers">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>
    <Property Id="WIXUI_INSTALLDIR" Value="INSTALLLOCATION" />
</UI>
然后使用
而不是
,如前所示:


合并模块 最后,如果您需要添加VC++2010可再发行软件包,该怎么办?我不确定这样做的最佳方式,虽然我的应用程序在我这样做时工作正常(以前没有),但我发现很奇怪,添加/删除程序没有提到它实际安装的任何内容。所以对于这部分,YMMV

因为我运行的(CI)服务器不一定安装了VisualStudio2010,所以我将合并模块文件放入我的WiX安装程序项目中。我制作了一个名为MergeModules的文件夹并将其放在那里。该文件位于程序文件\公共文件\合并模块中,称为Microsoft_VC100_CRT_x86.msm。现在在
节点中放置以下行:

<Feature Id="VCRedist" Title="Visual C++ 10.0 Runtime" AllowAdvertise="no" Display="hidden" Level="1">
    <MergeRef Id="VCRedist"/>
</Feature>
(SourceForge上的WiX)


以及
节点中的以下行:

<Feature Id="VCRedist" Title="Visual C++ 10.0 Runtime" AllowAdvertise="no" Display="hidden" Level="1">
    <MergeRef Id="VCRedist"/>
</Feature>

骨架WXS
我提供了一个不完整的骨架。wxs如下。这是不完整的,因为我只提供了与本文没有直接关联的内容的元素名。缺少的信息很容易找到。

我想修改我的答案,以涵盖我所学到的与我认为的典型场景相关的内容:

  • 您要自定义对话框中的位图
  • 您可能还想跳过许可协议
  • 您希望检测某些先决条件的存在,如.NET Framework 4.0
  • 您希望编写一个安装程序,以便在安装过程结束时安装其他一些软件,如设备驱动程序
  • 您希望使用注册表项的存在使前面提到的复选框不可见
  • 您可能需要包含一个合并模块,比如VC++2010可再发行版本
第一件事:

  • 所有的信息都在互联网上。我只是花了几个小时费力地浏览信息和尝试一些东西
  • 要有耐心,不要放弃
  • 不要仅仅依赖谷歌。WiX文档(在.chm中)有大量的信息。我建议你也在那里搜索,如果不是先搜索的话
  • 我已经说过了,“耐心点,不要放弃!”
骨架WXS 以下各节仅包含与其直接相关的信息。在答案的最后,我将发布一个骨架(部分完成).wxs

检测.NET Framework 4.0

首先,您需要向WixNetFxExtension添加一个项目引用。然后将此XML添加到您的
节点:(在.chm中搜索“.NET”)

您的
节点现在将如下所示:

<UI>
    <UIRef Id="WixUI_InstallDir" />
    <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="2">1</Publish>
    <Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2">1</Publish>
    <Publish Dialog="ExitDialog" Control="Finish" Order="1" Event="DoAction" Value="InstallDeviceDrivers">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>
    <Property Id="WIXUI_INSTALLDIR" Value="INSTALLLOCATION" />
</UI>
然后使用
而不是
,如前所示:


合并模块 最后,如果您需要添加VC++2010可再发行软件包,该怎么办?我不确定这样做的最佳方式,虽然我的应用程序在我这样做时工作正常(以前没有),但我发现很奇怪,添加/删除程序没有提到它实际安装的任何内容。所以对于这部分,YMMV

因为我运行的(CI)服务器不一定有VisualStudio
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Install device drivers when the installer exits." />
<UI>
    <UIRef Id="WixUI_InstallDir" />
    <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="2">1</Publish>
    <Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2">1</Publish>
    <Publish Dialog="ExitDialog" Control="Finish" Order="1" Event="DoAction" Value="InstallDeviceDrivers">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>
    <Property Id="WIXUI_INSTALLDIR" Value="INSTALLLOCATION" />
</UI>
<Property Id="DRIVERINSTALLED">
    <RegistrySearch Id="DriverInstalledSearch" Root="HKLM" Key="SOFTWARE\DriverCompany\Settings" Name="SomeRegistryKeyThatMustBePresentIfInstalled" Type="raw" />
</Property>
<SetProperty Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Install device drivers when the installer exits." After="CostFinalize">
    <![CDATA[NOT DRIVERINSTALLED]]>
</SetProperty>
<Merge Id="VCRedist" SourceFile="$(var.ProjectDir)\MergeModules\Microsoft_VC100_CRT_x86.msm" DiskId="1" Language="0"/>
<Feature Id="VCRedist" Title="Visual C++ 10.0 Runtime" AllowAdvertise="no" Display="hidden" Level="1">
    <MergeRef Id="VCRedist"/>
</Feature>
<Fragment>
    <util:RegistrySearch 
        Variable="DriverInstalled"
        Root="HKLM,SOFTWARE\Microsoft\MyProduct\[UniqueId]\Setup"
        Key="InstallPath"
        Result="Exists" />

    <PackageGroup Id="DriverPackage">
      <ExePackage 
        SourceFile="Path_To_Driver\Setup.exe"
        InstallCondition="InstallPath" />
    </PackageGroup>
    <PackageGroup Id="MainMsi">
      <MsiPackage 
        SourceFile="Path_To_Msi\Installer.msi"
        After="DriverPackage" />
    </PackageGroup>
</Fragment>