2015-12-14 88 views
2

我有一个自定义操作“xxxx”,它通过命令提示符执行rmdir来删除目录。 ExeCommand = “[SystemFolder]的cmd.exe/C命令rmdir/Q/S " [DIR] "” 和执行= “延期”提示用户关闭卸载应用程序 - WIX

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

回答

2

最大的问题是为什么你需要删除该文件夹,因为通常你不需要。这意味着它必须落后,但这只是一个猜测,所以我会说这是需要解决的问题 - 为什么它落后了。你的问题是关于你的解决方案不起作用的原因。根本的问题是,如果Windows决定需要它,InstallValidate会提示一个FilesInUse对话框,而Windows不需要它 - 因为您的自定义操作 - 这就是为什么FilesInUse UI参考不起作用。

如果你想删除的文件或文件夹时,维克斯RemoveFile元素是通常的方式,和它发生在卸载权地步一切已经beeen删除:

Wix RemoveFile and RemoveFolder for removing leftovers

如果您想告诉应用程序关闭,有WiX Util UtilApplication。

如果你真的想用你的代码和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; }

相关问题