我通过WixShellExect运行可执行文件的CustomAction失败了

时间:2012-01-29 23:54:56

标签: wix custom-action

我已经构建了一个wix,但是我在最后一个部分失败了,我运行的应用程序允许用户与我刚安装的Windows服务进行通信。 安装回滚。

如果我不包含WixShellExec自定义操作,那么exe安装,我可以从安装文件夹运行应用程序没有问题。

我在Product.wxs文件中有这个:

<!--Used to start the Console when install complete-->
<Component Id="Cmp_ArduinoControllerConsole" Directory="dir_Console" Guid="83D1FD64-0DE5-461B-997D-641C394999F1">
<File Id="File_ArduinoControllerConsole" KeyPath="yes" Source="$(var.MyDir)\Console\RJB.ArduinoController.Console.exe" />
</Component>

<!--Set up the action to run the console at the end of the installation -->
<Property Id="WixShellExecTarget" Value="[#File_ArduinoControllerConsole]" />
<CustomAction Id="Run_File_ArduinoControllerConsole" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />

<!--Sets when in the install sequence the Custom Action runs-->
<InstallExecuteSequence>
    <Custom Action="Run_File_ArduinoControllerConsole" 
            Before="InstallFinalize" />
</InstallExecuteSequence>

我在安装日志中遇到错误:

MSI (s) (0C:34) [23:40:29:636]: Invoking remote custom action. DLL: C:\Windows\Installer\MSI6179.tmp, Entrypoint: WixShellExec

WixShellExec:  Error 0x80070002: ShellExec failed with return code 2
WixShellExec:  Error 0x80070002: failed to launch target

CustomAction Run_File_ArduinoControllerConsole returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox)
Action ended 23:40:29: Run_File_ArduinoControllerConsole. Return value 3.

有人能说出我做错了吗?

3 个答案:

答案 0 :(得分:4)

解。

我无法获得Property中的值:

生成一个值,所以我将自定义操作更改为:

<CustomAction Id='Launch_ArduinoControllerConsole' FileKey='File_ArduinoControllerConsole' ExeCommand='' Return='asyncNoWait' />

并将其替换为:

    <InstallExecuteSequence>
  <Custom Action='Launch_ArduinoControllerConsole' After='InstallFinalize'>NOT Installed</Custom>
</InstallExecuteSequence>

安装完成后运行可执行文件。 CustomAction设置Return ='asyncNoWait'是正确的。

如果有人发现为什么Property中的值错了,我很想知道但是现在我有一个修复。

答案 1 :(得分:3)

要在安装文件后访问文件,自定义操作必须在延迟上下文中运行。在CustomAction元素上设置@ Execute =“deferred”。或者,使用How To: Run the Installed Application After Setup中描述的技术。

答案 2 :(得分:0)

对于它的价值,我必须设置立即行动所使用的Property的值:

<Property Id="MyProperty"> 1234 </Property>