Wix自定义操作在Windows 8下工作,在Windows 7下失败

时间:2014-03-31 17:42:16

标签: wix windows-installer

我正在启动一个可以返回0或-1的自定义操作控制台应用程序。

在Windows 8上返回0时,安装继续。

在Windows 7上返回0时,安装过早结束。

<Property Id="QtExecCmdLine" Value="&quot;$(var.SourceFiles)\MyProgram.exe&quot;"/>
<CustomAction Id="CheckForOld" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="immediate" Return="check"/>
<InstallExecuteSequence>
     <Custom Action="CheckForOld" After="AppSearch" />
</InstallExecuteSequence>

有谁知道如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

Windows 8和Window 7计算机上的UAC levels/settings是什么?如果您在开发计算机上禁用了UAC但在测试Win 7上启用了(默认设置),则可能导致EXE无法作为自定义操作运行。

在这种情况下,我还建议将代码迁移到DLL,您可以编写C#DLL using WixToolset and DTF。 然后,DLL可以使用此搜索的结果设置属性,如果需要,您可以使用该属性定义新的launch condition以停止安装。

来自Tao of the Windows Installer, Part 5

  

规则53:彻底测试在部署之前彻底测试软件包至关重要。一个经典的错误是   开发人员和包作者只能在他们自己的系统上进行测试   他们拥有完全的管理员权限,然后发现正常   用户无法使用他们的应用程序。

答案 1 :(得分:0)

这是QT exe文件吗?什么是EXE文件正在进行/检查?如果关闭错误检查会发生什么 - 它是否运行并执行其任务?

如果您自己编写代码,我建议您不要使用exe文件运行自定义操作。将它写为dll并将调试器连接到代码以使用调试构建dll逐步执行它 - 您将看到在您逐步执行代码时会发生什么:

  • 插入代码以显示要调试的函数中的消息框
  • 编译一个调试dll文件并插入到MSI文件中,并使用必要的管道进行连接。这并非完全无足轻重,但并不复杂。见下面的链接。
  • 运行MSI并等待消息框显示
  • 将调试器附加到正确的msiexec.exe - 用户上下文一个或系统上下文一个,具体取决于自定义操作的排序方式
  • 设置断点并逐步执行代码以确定发生了什么

如何创建基本的MSI dll: http://www.codeproject.com/Articles/1747/MSI-Custom-Action-DLL

答案 2 :(得分:0)

这个EXE应该做什么?有几个代码味道。首先是它仅在UI序列中安排。它在静默安装期间不会运行。第二个是立即安排的EXE。 EXE无法访问MSI句柄并设置属性或执行任何有用的操作,因此我假设EXE正在更改机器的配置。这在执行序列事务之外是不合适的。最后,QtExecCmdLine需要到目标计算机上EXE的绝对路径。我没有看到$(var.SourceFiles)如何提供。这是一个预处理器变量,它只会告诉您构建服务器上文件的位置。

您没有在自己的开发机器上进行测试?我猜你是在Win 8盒子上构建它,然后在同一个盒子上测试。它碰巧工作,因为它可以找到该文件。当你在另一台机器(Win 7)上运行它时,它无法找到该文件并失败,因为该文件可能不在那里......你还没有安装任何东西。