Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 使用Wix在MSI中的自定义操作出错时显示最终用户消息_Windows_Wix_Windows Installer - Fatal编程技术网

Windows 使用Wix在MSI中的自定义操作出错时显示最终用户消息

Windows 使用Wix在MSI中的自定义操作出错时显示最终用户消息,windows,wix,windows-installer,Windows,Wix,Windows Installer,例如,我有以下WIX标记,指示MSI安装程序从包含的DLL调用自定义操作: <CustomAction Id="CA_SetProperties_Finalize" Property="CA_OnInstallFinalize" Value="[Installed],[REINSTALL],[UPGRADINGPRODUCTCODE],[REMOVE]" /> <CustomAction Id='CA_OnInstallFinaliz

例如,我有以下WIX标记,指示MSI安装程序从包含的DLL调用自定义操作:

<CustomAction Id="CA_SetProperties_Finalize" 
        Property="CA_OnInstallFinalize" 
           Value="[Installed],[REINSTALL],[UPGRADINGPRODUCTCODE],[REMOVE]" />

<CustomAction Id='CA_OnInstallFinalize' 
       BinaryKey='CADll' 
        DllEntry='msiOnInstallFinalize' 
         Execute='deferred' Impersonate='no' />

<InstallExecuteSequence>
  <Custom Action='CA_SetProperties_Finalize' 
          Before='InstallFinalize'></Custom>
  <Custom Action='CA_OnInstallFinalize' 
           After='CA_SetProperties_Finalize'></Custom>
</InstallExecuteSequence>

<Binary Id='CADll' SourceFile='Sources\ca-installer.dll' />
当我的
doWork
方法失败时,安装不应该继续,因此我返回
ERROR\u INSTALL\u FAILURE
。问题是,在这种情况下,安装程序只是退出,安装GUI窗口消失


所以我很好奇,是否有任何方法可以更改Wix标记,以便在自定义操作返回错误时显示用户消息?

我使用此方法创建消息框来处理dll中的错误:

PMSIHANDLE hRecord = MsiCreateRecord(0);
MsiRecordSetString(hRecord, 0, TEXT("Enter the text for the error!"));
MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR + MB_OK), hRecord);
return ERROR_INSTALL_USEREXIT;

我使用此选项创建消息框来处理dll中的错误:

PMSIHANDLE hRecord = MsiCreateRecord(0);
MsiRecordSetString(hRecord, 0, TEXT("Enter the text for the error!"));
MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_ERROR + MB_OK), hRecord);
return ERROR_INSTALL_USEREXIT;

我能够将该代码转换为VB.NET,并在自定义操作中使用它来显示错误弹出窗口

Net代码看起来大不相同

Private Shared Sub DisplayMSIError(session As Session, msg As String)
  Dim r As New WindowsInstaller.Record(0)
  r.SetString(0, msg)
  session.Message(InstallMessage.Error, r)
End Sub
我在MSDN上也发现了它,它使用vbscript

我能够将该代码转换为VB.NET,并在自定义操作中使用它来显示错误弹出窗口

Net代码看起来大不相同

Private Shared Sub DisplayMSIError(session As Session, msg As String)
  Dim r As New WindowsInstaller.Record(0)
  r.SetString(0, msg)
  session.Message(InstallMessage.Error, r)
End Sub
我在MSDN上也发现了它,它使用vbscript 对于C#用户

对于C#用户


谢谢不过有一个问题。我试图避免显示自定义操作本身的消息框,以避免静默安装时出现死锁(例如,如果有人通过组策略对象在Active Directory上安装此MSI),您建议的方法会考虑到这一点吗?是::MsiProcessMessage()将UIL级别考虑在内。@RobMensching:谢谢,Rob。我试过了,效果很好,只是有一点我想不出来,也许你能帮我?在我的实际Wix标记中,我从
.wxl
本地化文件中获取所有字符串,例如
特权
。那么,是否有任何方法可以访问上述自定义操作中的“.wxl”文件字符串?听起来像是一个新问题。谢谢。不过有一个问题。我试图避免显示自定义操作本身的消息框,以避免静默安装时出现死锁(例如,如果有人通过组策略对象在Active Directory上安装此MSI),您建议的方法会考虑到这一点吗?是::MsiProcessMessage()将UIL级别考虑在内。@RobMensching:谢谢,Rob。我试过了,效果很好,只是有一点我想不出来,也许你能帮我?在我的实际Wix标记中,我从
.wxl
本地化文件中获取所有字符串,例如
特权
。那么,是否有任何方法可以访问上述自定义操作中的“.wxl”文件字符串?听起来像是一个新问题。