У меня есть настраиваемое действие «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, потому что я хочу, чтобы установщик удалил весь каталог при удалении.
Большой вопрос — зачем вам удалять эту папку, потому что обычно это не нужно. Это означает, что он должен остаться позади, но это всего лишь предположение, поэтому я бы сказал, что с этой проблемой нужно разобраться — почему это осталось позади. Ваш вопрос о том, почему ваше решение не работает. Основная проблема заключается в том, что InstallValidate выведет диалоговое окно FilesInUse, если Windows решит, что он ему нужен, а Windows не нужен — вы делаете это из-за своих пользовательских действий — вот почему ссылки на интерфейс FilesInUse не помогают.
Если вы хотите удалить файлы или папки, элемент WiX RemoveFile является обычным способом, и это происходит в нужной точке удаления, где все остальное было удалено:
Wix RemoveFile и RemoveFolder для удаления остатков
Если вы хотите сказать, чтобы приложение закрылось, есть приложение 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;
}
Других решений пока нет …