Executing external programs

Тільки відкриває документ. Документ буде відкритий стандартною програмою

Якщо ви використовували ShellExecute і / або WinExec в Delphi, то ви можете почати використовувати TProcess як альтернативу в FPC / Lazarus (це вірно і в разі використання Lazarus на Linux, тому що TProcess є кросплатформним компонентом).

Примітка: FPC / Lazarus підтримує ShellExecute і WinExec. але тільки в середовищі Win32. Якщо ви пишете крос-платформену програму, то найкращим шляхом буде використання TProcess!

(Process.) RunCommand

У FPC 2.6.2, деякі допоміжні функції для TProcess були додані в модуль process заснований на обгортці використаної в fpcup. Ці функції можуть бути для базового та середнього рівня використання та моготу захопити висновок як одного рядка, так і величезної кількості виведеної інформації.

Перевантажений варіант функції може повертати код виходу програми. RunCommandInDir запускає програму в заданій папці.

SysUtils.ExecuteProcess

Найпростіший шлях, якщо вам не потрібно спілкування з процесом - це просто використовувати виклик

При використанні цього методу, додаток "повисає" до тих пір, поки викликана програма не завершиться. Це може бути корисно якщо користувач повинен зробити щось перед використанням вашого застосування. Якщо ви хочете обійти це обмеження, то біліше корисний багатоплатформовий спосіб це TProcess. або якщо ваша цільова платформа тільки Windows, то використовуйте ShellExecute.

MS Windows: CreateProcess, ShellExecute і WinExec

Примітка: FPC / Lazarus підтримують CreateProcess. ShellExecute і / або WinExec. тільки на Win32 / 64. Якщо ваша програма кроссплатформенная, використовуйте RunCommand або TProcess.

Примітка: WinExec використовує 16-бітові виклики і давно застарів. Нові версії FPC при його використанні генеріруюn попередження.

ShellExecute - стандартна функція MS Windows (ShellApi.h) з хорошою документацією на MSDN (читайте документацію, якщо вам здається, що функція ненадійна).

Також є WideChar функції - ShellExecuteExW. ShellExecuteExA в режимі AnsiChar.

Як fMask можна ипользовать SEE_MASK_DOENVSUBST, SEE_MASK_FLAG_NO_UI або SEE_MASK_NOCLOSEPROCESS і тд Якщо в Delphi ви використовуєте ShellExecute для відкриття документів, наприклад документ Word або посилання, то придивіться до open * (openurl і тд) модулі lclintf.

Використання ShellExecuteEx з підвищеними (правами адміністратора) правами

Якщо ви хочете використовувати програму з підвищеними (правами адміністратора) правами, використовуйте runas як альтернативу ShellExecuteEx:

Ви можете використовувати TProcess для запуску зовнішніх програм. Найбільш корисними речами при цьому будуть:

Примітка: TProcess НЕ оболонка! І не термінал! Ви не можете безпосередньо виконувати скрипти або перенаправляти висновок використовуючи такі оператори, як "|", ">", "<", "&" и т.д. Но возможно получить те же самые результаты используя TProcess, далее будут приведены некоторые примеры.

Важливо: Ви повинні визначати повний шлях до виконуваного файлу. Наприклад '/ bin / cp' замість 'cp'. Якщо програма знаходиться де-небудь в змінної PATH, то ви можете використовувати функцію FindDefaultExecutablePath з модуля LCL FileUtil.

простий приклад

Ось воно! Тепер ви навчилися запускати зовнішню програму зсередини вашої власної.

вдосконалений приклад

Це все чудово, але як я можу отримати висновок програми, яку я запустив?

Добре, нехай наш приклад трохи збільшиться і тепер буде виглядати так:

Читання великих обсягів виведення

У попередньому прикладі ми чекали завершення запущеної програми. Після цього ми зчитували все, що програма записала в вихідний потік. Але ж може виявитися і так, що програма виведе багато даних, канал заповниться і висновок зупиниться, при цьому запустивши програма чекає завершення запущеної програми, яка в свою чергу не може завершити роботу, поки не виведе всі дані. Виникає колізія, dead-lock.

Використання введення і виведення TProcess

Деякі підказки при використанні TProcess

Якщо ви створюєте кроссплатформенную програму, ви можете змінювати командний рядок стосовно кожної ОС використовую директиви "" і "".

Приклад "спілкування" з процесом aspell

Усередині вихідного коду pasdoc розташовані два модулі, які виконують перевірку орфографії, "спілкуючись" між собою за допомогою передачі управління процесу в якому вони виконуються:

  • PasDoc_ProcessLineTalk.pas - Даний модуль реалізує клас TProcessLineTalk є нащадком TProcess. Він може бути використаний для обміну даними з будь-яким процесом на його основі.
  • PasDoc_Aspell.pas - Реалізує клас TAspellProcess, який виконує перевірку орфографії і успадковується від TProcessLineTalk, для виконання aspell і звернення до запустившему його процесу.

Обидва модуля є незалежними від інших вихідних кодів (модулів) pasdoc, тому вони можуть служити в якості реальних прикладів використання TProcess, для роботи і спілкування за допомогою обміну даними з іншою програмою.