2015-12-14 5 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

Большой вопрос, почему вам нужно удалить эту папку, потому что обычно вам не нужно. Это означает, что он должен быть оставлен позади, но это просто догадка, поэтому я бы сказал, что это проблема, с которой приходится иметь дело - почему она осталась позади. Ваш вопрос в том, почему ваше решение не работает. Основная проблема заключается в том, что InstallValidate предложит диалог FilesInUse, если Windows решит, что он нужен, и Windows не нуждается в нем - вы делаете это из-за своего пользовательского действия - поэтому FilesInUse UI refs не помогает.

Если вы хотите удалить файлы или папки, элемент WiX RemoveFile является обычным способом, и это происходит в нужный момент деинсталлировать, где все остальное beeen удалено:

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; }