我想開始我與提升權限的程序另一個應用程序,並等待它繼續之前終止。德爾福:如何開始升高地位的申請,並等待它終止?
我已經在網上嘗試了幾種不同的解決方案,但是我找不到完全正確的工作。
下面的代碼是最接近我必須工作的權利。它使用提升的權限運行應用程序並等待它終止,但一旦外部應用程序終止,它就會凍結。換句話說,一旦推出的應用程序關閉,它不會繼續處理。
我怎麼能做到什麼,我這裏後我?
procedure TfMain.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_DDEWAIT or SEE_MASK_FLAG_NO_UI;
sei.lpVerb := 'runas';
sei.lpFile := PChar(aFile);
sei.lpParameters := PChar(aParameters);
sei.nShow := SW_SHOWNORMAL;
if not ShellExecuteEx(@sei) then
RaiseLastOSError
else
while WaitForSingleObject(sei.hProcess, 50) <> WAIT_OBJECT_0 do
Application.ProcessMessages;
CloseHandle(sei.hProcess);
end;
更新:
我想出用下面的函數,但如果我調用它之後有一個ShowMessage聲明它纔會起作用。所以,我必須有:
RunFileAsAdminWait(Handle, ExtractFilePath(Application.Exename) + 'AutoUpdate.exe', '/auto');
ShowMessage('test');
爲了使功能工作。 我怎樣才能使它不ShowMessage呼叫工作?
下面是更新的功能:
procedure TfMain.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_DDEWAIT or SEE_MASK_FLAG_NO_UI;
sei.lpVerb := 'runas';
sei.lpFile := PChar(aFile);
sei.lpParameters := PChar(aParameters);
sei.nShow := SW_SHOWNORMAL;
if not ShellExecuteEx(@sei) then
RaiseLastOSError
else
if sei.hProcess <> 0 then
WaitForSingleObject(sei.hProcess, 50)
else
Exit;
CloseHandle(sei.hProcess);
end;
工作完美!謝謝! – croceldon 2009-11-11 20:43:15
這將是更有效地使用'MsgWaitForMultipleObjects()',而不是'WaitForSingleObject的()',這樣你就可以調用'Application.ProcessMessages()'只有當它告訴你,消息等待處理。唐」牛逼一味叫'ProcessMessages()'不必要。 – 2014-12-21 20:59:48