提示用户在卸载时关闭应用程序 - WIX

Prompt user to close applications on uninstall - WIX

我有一个自定义操作 "xxxx",它通过命令提示符执行 rmdir 来删除目录。 ExeCommand="[SystemFolder]cmd.exe /C rmdir /Q /S "[DIR]"" and Execute="deferred"

在InstallExecuteSequence中添加如下

Custom Action="xxxx" After="InstallInitialize"
  (NOT UPGRADINGPRODUCTCODE) AND REMOVE
Custom

如果该目录被命令行等其他应用程序打开,则会抛出错误。

我看了很多类似的问题。但无法弄清楚

1) 提示用户关闭应用程序 - 我阅读了添加

UI
  DialogRef Id="FilesInUse" 
  DialogRef Id="MsiRMFilesInUse" 
/UI

并使用自定义操作 Before="InstallValidate" 显示关闭应用程序的提示。

2) 如何运行自定义服务停止后的动作提示用户关闭应用程序? 它应该 运行 在延迟模式下。

3) 如果我想在Execute = deferred中运行,那么我就不能使用InstallValidate。因此我不能使用 FilesInUse。

4) 还有其他好的方法吗?我不想引用 dll,因为我希望安装程序在卸载时删除整个目录。

最大的问题是为什么您需要删除该文件夹,因为通常您不需要这样做。这意味着它一定是落后了,但这只是一个猜测,所以我想说这就是要处理的问题——为什么它落后了。您的问题是关于为什么您的解决方案不起作用。潜在的问题是 InstallValidate 将提示一个 FilesInUse 对话框,如果 Windows 决定它需要一个,而 Windows 不需要一个 - 你这样做是因为你的自定义操作 - 这就是为什么 FilesInUse UI裁判没有帮助。

如果你想删除文件或文件夹,WiX RemoveFile 元素是常用的方法,它发生在卸载的正确位置,其他所有内容都已被删除:

Wix RemoveFile and RemoveFolder for removing leftovers

如果您想告诉应用程序关闭,可以使用 WiX Util CloseApplication。

如果您真的想用您的代码和 FilesInUse 提示解决文件夹问题(而不是解决该文件夹的根本问题),那么像这样的 C++ 自定义操作将显示一个 FilesInUse 对话框,紧接在 InstallValidate 应该起作用之前,您需要包含 msi.h、msiquery.h:

UINT __stdcall ShowFilesInUse (MSIHANDLE hInstall) 
{
PMSIHANDLE hRec = MsiCreateRecord(4);
MsiRecordSetString(hRec, 1, TEXT(" "));
MsiRecordSetString(hRec, 2, TEXT("Please use Task Manager to Terminate these programs:"));
MsiRecordSetString(hRec, 3, TEXT("something else"));
UINT res = 0;
do 
{
res = MsiProcessMessage(hInstall, INSTALLMESSAGE_FILESINUSE, hRec);
}
while (res == IDRETRY);
if (IDOK==res) // 1 is the Continue button in VS
   return 0; 
if (IDCANCEL ==res) // The Exit button in VS 
   return ERROR_INSTALL_USEREXIT;
return 0;
}