从我的WiX安装程序安装设备驱动程序(打包在.exe中)时遇到困难
我一直在努力构建一个新的WiX安装程序,我真的很满意,只是我还需要安装一个设备驱动程序 理想情况下,我希望能够通过使用从我的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=
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中)有大量的信息。我建议你也在那里搜索,如果不是先搜索的话
- 我已经说过了,“耐心点,不要放弃!”
节点:(在.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中)有大量的信息。我建议你也在那里搜索,如果不是先搜索的话
- 我已经说过了,“耐心点,不要放弃!”
节点:(在.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>