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

Wix自定义操作在Windows 8下工作,在Windows 7下失败,wix,windows-installer,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="CAQuietExe

我正在启动一个自定义操作控制台应用程序,它可以返回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>


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

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

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

  • 插入代码以显示要调试的函数中的消息框
  • 编译一个调试dll文件,并插入到MSI文件中,使用必要的管道连接东西。这并不完全是小事,但也不是那么复杂。请参阅下面的链接
  • 运行MSI并等待消息框显示
  • 将调试器附加到正确的msiexec.exe-用户上下文或系统上下文,具体取决于自定义操作的顺序
  • 设置断点并单步执行代码以确定发生了什么
如何创建基本MSI dll:
这个EXE应该做什么?有几种代码气味。首先,它只安排在UI序列中。它不会在静默安装期间运行。第二个是它是一个被安排为立即的EXE。EXE无法访问MSI句柄并设置属性或执行任何有用的操作,因此我假设EXE正在更改计算机的配置。这在执行序列事务之外是不合适的。最后,qtexecmdline需要目标计算机上EXE的绝对路径。我不知道$(var.SourceFiles)如何提供这一点。这是一个预处理器变量,它只会告诉您文件在构建服务器上的位置

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

Windows 8和Windows 7计算机上的安装程序是什么?如果在您的开发机器上禁用了UAC,但在test Win 7上启用了(默认设置),则可能会导致EXE无法作为自定义操作运行

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

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


我会创建一个详细的日志来查看发生了什么。甚至有可能代码崩溃,只是默认退出代码为零,正是崩溃导致安装完成。只是猜测,但我不知道你怎么确定退出代码是什么。我写的代码。它在windows 7和windows 8中作为独立程序运行良好。exe文件在批处理文件中的行为如何
filename.exe>log.txt 2>&1
(STDOUT,STDERR)它在批处理文件中完美地工作。这就是我最初测试返回代码是否正确运行的方式。Steve,您不是以用户身份运行它-这是一个msiexec进程的调用,该进程运行时,一个不相关或意外的工作目录已从MSI文件流式输出到某个临时位置。换句话说,当您以交互用户的身份运行它时,它工作的事实只是第一次检查。代码在其他环境中的行为非常不同。您的代码是否依赖于未安装的软件?它正在注册表中查找以前安装的软件。我已经知道可执行文件在做什么。它在Windows7和Windows8上都运行良好。但是,当Msiexe在windows 7下调用时,它会忽略返回值。即使您知道exe代码,作为安装程序的一部分运行也是非常不同的。您是以延迟模式还是立即模式运行?这具有重大的安全影响。是QT exe文件吗?我试着在两种模式下运行。两者都失败了。我不知道什么是“QT exe文件”。这是一个.NET控制台应用程序。EXE在注册表中查找注册表项。它根据是否找到键返回0或-1。我在我的开发机器上进行测试,然后在Windows7机器上进行测试$(var.SourceFiles)是安装文件所在的位置。我不想安装该文件,只需运行它,看看继续安装是否安全。它在我的机器上找到了它。根据日志,它也在测试Windows7机器上找到了它。好建议。我将在另一台Windows 8计算机上进行测试,以检查其是否正常。您不应该在自己的计算机上进行测试。安装工101:我不同意那种笼统的说法。您应该在自己的机器上测试以验证功能是否存在……因为这样可以节省时间。“当这起作用时,然后在另一台目标机器上测试。”史蒂夫韦伦斯认真地说?祝你好运。我将继续在快照虚拟机上进行测试。别指望我再帮你了,很明显你是误会了。编译完一个程序后,你会运行它吗?你会按几个按钮看看它是否有效吗?祝贺您,您正在自己的机器上进行测试。在没有你精明的帮助下,我会尽力忍住的。我很感激你的建议。如果我没有为此浪费很多时间,我可能会尝试一下。但是没有瓜