Добрый день.
Давно уже пользуюсь функцией запуска и завершения приложения, которая была много раз написана на форумах, и вроде до сего момента нормально работала:
function RunAppWait(appName: string): cardinal;
var
SI: TStartupInfo;
PI: TProcessInformation;
cpResult : boolean;
begin
FillChar(SI, SizeOf(SI), 0);
with SI do begin
cb := SizeOf(SI);
dwFlags:=STARTF_USESHOWWINDOW;
wShowWindow:=SW_SHOWNORMAL;
end;
cpResult := CreateProcess(nil,
PWideChar(appName),
nil,
nil,
False,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
nil,
nil,
SI,
PI);
if cpResult then begin
WaitforSingleObject(pi.hProcess,INFINITE);
GetExitCodeProcess(pi.hProcess,Result);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
end
else Result:=GetLastError;
end;
Так вот пытаюсь с помощью этого кода запустить удаление программы, деинсталлятор нормально запускается, но WaitForSingleObject сразу завершается с результатом WAIT_OBJECT_0, то бишь программа завершилась, а на самом деле я еще ничего делать не начинал, деинсталлятор не отработал, программа не удалена.
Дайте идеи, где тут собака порылась?
Сам же и отвечу.
Код работает правильно.
Деинсталлятор создает "временное" приложение, передает ему управление, а сам закрывается. Окно удаления программы — это уже не то приложение, которое я запускаю.
Соответственно вопрос меняется: КАК ОТСЛЕДИТЬ ЗАВЕРШЕНИЕ УДАЛЕНИЯ ПРОГРАММЫ?