Под use strict
, скажите:
(my $new = $original) =~ s/foo/bar/;
вместо этого.
У меня работает следующий код:
procedure RunFileAsAdminWait(hWnd: HWND; aFile, aParameters: string);
var
sei: TShellExecuteInfo;
begin
FillChar(sei, SizeOf(sei), 0);
sei.cbSize := SizeOf(sei);
sei.Wnd := hWnd;
sei.fMask := SEE_MASK_FLAG_NO_UI or SEE_MASK_NOCLOSEPROCESS;
sei.lpVerb := 'runas';
sei.lpFile := PChar(aFile);
sei.lpParameters := PChar(aParameters);
sei.nShow := SW_SHOWNORMAL;
if not ShellExecuteEx(@sei) then
RaiseLastOSError;
if sei.hProcess <> 0 then begin
while WaitForSingleObject(sei.hProcess, 50) = WAIT_TIMEOUT do
Application.ProcessMessages;
CloseHandle(sei.hProcess);
end;
end;
Вы должны передать флаг SEE_MASK_NOCLOSEPROCESS
, чтобы обработчик процесса ждал. Я также изменил код на цикл, пока WaitForSingleObject ()
возвращается с таймаутом.
Для получения дополнительной информации о флагах см. Страницу MSDN для структуры SHELLEXECUTEINFO
.
Ваше ожидание (50 мсек слишком мало), попробуйте
WaitForSingleObject(sei.hProcess, INFINITE)
Проверку действительного дескриптора процесса (sei.hProcess <> 0) можно не учитывать.
Исправленный ответ:
while MsgWaitForMultipleObjects(1, sei.hProcess, False, INFINITE, QS_ALLINPUT)
<> WAIT_OBJECT_0 do
begin
while PeekMessage(msg, 0, 0, 0, PM_REMOVE) do
begin
DispatchMessage(Msg);
end;
end;