Как запустить любой файл из программы на Delphi

Система и файлы   9 Февраль 2011  Автор статьи: admin 

Приведенный в этой статье код поможет легко запустить любой исполняемый или обычный файл непосредственно из вашего приложения Delphi. В данном примере мы рассмотрим также способ запуска exe с передачей ему открываемого файла, т.е. научимся открывать другие файлы используя какую либо программу.

Для простого запуска исполняемого файла или любого другого файла можно использовать нажеприведенную функцию. Стоит отметить, что для ее работы необходимо подключить модуль shellapi.

1
2
3
4
5
function ExecuteFile(const FileName, Params, DefaultDir: string; ShowCmd: Integer): THandle;
begin
  Result := ShellExecute(Application.MainForm.Handle, nil, PChar(FileName), PChar(Params),
    PChar(DefaultDir), ShowCmd);
end;

Пример использования функции ExecuteFile:

1
2
3
ExecuteFile('myexe.exe','','',SW_SHOW);//запуск exe файла

ExecuteFile('text.txt','','',SW_SHOW);//запуск txt файла программой по умолчанию

Функция  ExecuteFile позволяет открывать не только исполняемые файлы, но и любые другие файлы, например текстовые. При этом файл откроется той программой, которая назначена данному типу файла в системе.

Но иногда требуется открыть файл конкретной программой. В этом нам поможет следующий код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
procedure openfile;
var
cmdLine, fName: {$ifdef WIDE}WideString{$else}string{$endif};
si: TStartupInfo;
pi: TProcessInformation;
begin
cmdLine := 'c:\program.exe'; //полный путь до программы, которой хотим открыть файл
fName   := 'с:\text.txt'; //полный путь до файла

FillChar(si, SizeOf(si), #0);
with si do begin
cb := SizeOf(si);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := SW_SHOW;
end;

if {$ifdef WIDE}CreateProcessW{$else}CreateProcessA{$endif}(
nil,                    // lpApplicationName,
{$ifdef WIDE}pWideChar{$else}pChar{$endif}(cmdLine + fName), // lpCommandLine,
nil,                    // lpProcessAttributes,
nil,                    // lpThreadAttributes,
True,                   // bInheritHandles,
0,                      // dwCreationFlags
nil,                    // lpEnvironment,
nil,                    // lpCurrentDirectory,
si,                     // lpStartupInfo,
pi) then begin                    // lpProcessInformation
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
end;
end;
  • Dva431

    Кроме запуска под админом (манифест, runos или в имени программы — Update), нужны еще и привилегии SeBackupPrivilege и SeRestorePrivilege. Для работы с реестром лучше использовать консольную Reg.exe.

  • Олег

    Почему взят массив именно от 0 и до 79? или это не имеет значения и можно брать любые цифры?

    • http://cybern.ru/ Cyberexpert

      В принципе, можно обойтись без этих массивов. Изменил код листинга.

  • цуйуцй

    а куда ее вставлять

  • Maxim Vechkilev

    Способ рабочий ,но не знаю как у остальных у меня Аваст блокирует программу перед как запуститься.

Научиться программировать

  • на Delphi

  • на Java

  • на C++