Windows 使用Wix在MSI中的自定义操作出错时显示最终用户消息
例如,我有以下WIX标记,指示MSI安装程序从包含的DLL调用自定义操作: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
<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”文件字符串?听起来像是一个新问题。