我正在启动一个可以返回0或-1的自定义操作控制台应用程序。
在Windows 8上返回0时,安装继续。
在Windows 7上返回0时,安装过早结束。
<Property Id="QtExecCmdLine" Value=""$(var.SourceFiles)\MyProgram.exe""/>
<CustomAction Id="CheckForOld" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="immediate" Return="check"/>
<InstallExecuteSequence>
<Custom Action="CheckForOld" After="AppSearch" />
</InstallExecuteSequence>
有谁知道如何解决这个问题?
答案 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逐步执行它 - 您将看到在您逐步执行代码时会发生什么:
如何创建基本的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)上运行它时,它无法找到该文件并失败,因为该文件可能不在那里......你还没有安装任何东西。