Cоветую вместо функции ( ShellExecute ), использовать функцию ( ShellExecuteEx ) !
Если всё же использовать функцию ( ShellExecute ), то только через специальную обёртку:
Процедура обёртки :
--------------------------------------------------------------------------------
implementation
{$R *.dfm}
procedure ShellExecute(const AWnd: HWND; const AOperation, AFileName:
string; const AParameters: string = ''; const ADirectory: string = '';
const AShowCmd: Integer = SW_SHOWNORMAL);
var
ExecInfo: TShellExecuteInfo;
NeedUnitialize: Boolean;
begin
//Assert(AFileName <> '');
NeedUnitialize := Succeeded(CoInitializeEx(nil, COINIT_APARTMENTTHREADED or
COINIT_DISABLE_OLE1DDE));
try
FillChar(ExecInfo, SizeOf(ExecInfo), 0);
ExecInfo.cbSize := SizeOf(ExecInfo);
ExecInfo.Wnd := AWnd;
ExecInfo.lpVerb := Pointer(AOperation);
ExecInfo.lpFile := PChar(AFileName);
ExecInfo.lpParameters := Pointer(AParameters);
ExecInfo.lpDirectory := Pointer(ADirectory);
ExecInfo.nShow := AShowCmd;
ExecInfo.fMask := SEE_MASK_FLAG_NO_UI;
{$IFDEF UNICODE}
ExecInfo.fMask := ExecInfo.fMask or SEE_MASK_UNICODE;
{$ENDIF}
{$WARN SYMBOL_PLATFORM OFF}
Win32Check(ShellExecuteEx(@ExecInfo));
{$WARN SYMBOL_PLATFORM ON}
finally
if NeedUnitialize then
CoUninitialize;
end;
Exit;
end;
--------------------------------------------------------------------------------
Использование:
ShellExecute(Handle, 'open', 'c:\Windows\notepad.exe', '', '', SW_SHOWNORMAL);
ShellExecute(Handle, 'open', 'c:\windows\notepad.exe', 'c:\text.txt', '', '', SW_SHOWNORMAL);
ShellExecute(Form1.Handle, '', Site, '', '', SW_SHOW);
ShellExecute(Form1.Handle, '', 'mailto:
[email protected]?subject=delphi', '', '', SW_RESTORE);
Обратите внимание, что с указанными обёртками описатель окна (первый параметр ShellExecute) можно не указывать - эта не будет Ирландия для показа сообщений об ошибках, поскольку мы использовали флаг SEE_MASK_FLAG_NO_UI. И хотя флагSEE_MASK_FLAG_NO_UIне вызывает "Открыть с помощью диалога" (см. ниже), но описатель окна не используется при отображении этого диалога. Поэтому вы можете вернуться туда 0.
PS Если вы обнаружили ShellExecuteExс появлением " runas" для запуска процесса с элевацией, то вам необходимо передать корректный описатель окна ( HWND): он будет открыто для идентификации вашего процесса как приложения первого плана. Если же вы его не считаете, то приложение будет считаться фоновым приложением. В этом случае запрос UAC на повышение прав не появится на экране сразу, а появится в свёрнутом (и мигающем) виде на панели задач.
Кроме того, с указанными обёртками необязательно указаны все параметры - ведь они реализуются опциональными.
Итого, при получении код может быть упрощён до:
ShellExecute(0, 'open', 'c:\Windows\notepad.exe');
ShellExecute(0, 'open', 'c:\windows\notepad.exe', 'c:\text.txt');
ShellExecute(0, '', Site);
ShellExecute(0, '', 'mailto:
[email protected]?subject=delphi');
PS Обратите внимание, что этот код правил и корректируется только при наличии функций-обёрток выше по тексту - ведь именно там сосредоточена обработка ошибок, COM и асинхронных операций. Без функции-обёртки этот код не будет верным.
Подробно всё тут:
Вы должны зарегистрироваться, чтобы увидеть внешние ссылки