2015-12-14 82 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; }

相關問題