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

时间:2015-12-14 22:21:01

标签: c++ visual-studio-2012 wix windows-installer uninstaller

我有自定义操作" xxxx"通过命令提示符执行rmdir删除目录。 ExeCommand =" [SystemFolder] cmd.exe / C rmdir / Q / S" [DIR]""和执行="延期"

它被添加到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,因为我希望安装程序在卸载时删除整个目录。

1 个答案:

答案 0 :(得分:2)

最大的问题是为什么你需要删除该文件夹,因为通常你不需要。这意味着它必须落后,但这只是一个猜测,所以我会说这是要处理的问题 - 为什么它被抛在后面。您的问题是关于您的解决方案无效的原因。根本问题是,如果Windows决定需要一个,则InstallValidate将提示一个FilesInUse对话框,而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; }