Executarea programelor externe

Deschide numai documentul. Documentul va fi deschis prin programul standard

Dacă ați utilizat ShellExecute și / sau WinExec în Delphi, puteți începe să utilizați TproCes ca alternativă în FPC / Lazarus (acest lucru este valabil și în cazul lui Lazăr pe Linux, pentru că TproCes este o componentă cross-platform).







Notă: FPC / Lazarus suportă ShellExecute și WinExec. dar numai în mediul Win32. Dacă scrieți un program cross-platform, cel mai bun mod este să utilizați TProcess!

(Proces.) RunCommand

În FPC 2.6.2, unele funcții de ajutor pentru TProcess au fost adăugate la modulul proces bazat pe pachetul utilizat în fpcup. Aceste funcții pot fi pentru nivelul de bază și intermediar de utilizare și pot capta atât o singură linie, cât și o cantitate imensă de informații despre ieșire.

O versiune supraîncărcată a funcției poate returna codul de ieșire al programului. RunCommandInDir rulează programul în dosarul specificat.

SysUtils.ExecuteProcess

Cea mai simplă cale, dacă nu trebuie să comunicați cu procesul - este pur și simplu să utilizați apelul

Când se utilizează această metodă, aplicația "se blochează" până când programul programat este finalizat. Acest lucru poate fi util dacă utilizatorul trebuie să facă ceva înainte de a utiliza aplicația. Dacă doriți să ocoliți această restricție, atunci metoda mai mult-utilă platformă este TProcess. sau dacă platforma dvs. țintă este numai Windows, utilizați ShellExecute.

MS Windows: CreateProcess, ShellExecute și WinExec

Notă: suportul FPC / Lazarus CreateProcess. ShellExecute și / sau WinExec. numai pe Win32 / 64. Dacă programul dvs. este cross-platform, utilizați RunCommand sau TProcess.

Notă: WinExec utilizează apeluri pe 16 biți și este depășită. Noile versiuni ale FPC când îl folosiți generează un avertisment.

ShellExecute este o caracteristică standard MS Windows (ShellApi.h) cu o bună documentație pe MSDN (citiți documentația dacă credeți că funcția este nesigură).

De asemenea, există o funcție WideChar - ShellExecuteExW. ShellExecuteExA în modul AnsiChar.







După cum se poate fMask ipolzovat SEE_MASK_DOENVSUBST, SEE_MASK_FLAG_NO_UI sau SEE_MASK_NOCLOSEPROCESS etc. Dacă utilizați Delphi ShellExecute pentru a deschide un document, cum ar fi un document Word sau un link, apoi uita-te la * deschis (openURL etc.), modulul lclintf.

Folosind ShellExecuteEx cu drepturi ridicate (drepturi de administrator)

Dacă doriți să utilizați un program cu drepturi ridicate (drepturi de administrator), utilizați runas ca alternativă la ShellExecuteEx:

Puteți utiliza TProcess pentru a rula programe externe. Cele mai utile lucruri în acest caz sunt:

Notă: TProcess nu este o coajă! Și nu un terminal! Nu puteți executa direct scripturi sau redirecționați ieșirea utilizând operatori precum "|", ">", "<", "&" и т.д. Но возможно получить те же самые результаты используя TProcess, далее будут приведены некоторые примеры.

Important: Trebuie să specificați calea completă la fișierul executabil. De exemplu, "/ bin / cp" în loc de "cp". Dacă programul este undeva în variabila PATH, puteți utiliza funcția FindDefaultExecutablePath din modulul FileUtil LCL.

Un exemplu simplu

Aici este! Acum ați învățat cum să rulați un program extern din propria dvs.

Exemplul îmbunătățit

Totul e minunat, dar cum pot obține rezultatul programului pe care îl conduc?

Ei bine, exemplul nostru să crească ușor și acum va arăta astfel:

Citirea unor cantități mari de producție

În exemplul anterior, am așteptat ca programul să se termine. După aceea, citim tot ce scrie programul în fluxul de ieșire. Dar, la urma urmei, s-ar putea dovedi că programul va scoate o mulțime de date, canalul va fi umplut și ieșirea se va opri, în timp ce programul care rulează așteaptă ca programul să se termine, ceea ce la rândul său nu poate finaliza lucrarea până nu afișează toate datele. Există o coliziune, blocare.

Utilizând TProcess de intrare și ieșire

Câteva sfaturi când utilizați TProcess

Dacă creați un program cross-platform, puteți schimba linia de comandă pentru fiecare sistem de operare folosind directivele "" și "".

Un exemplu de "comunicare" cu procesul aspell

În interiorul codului sursă pasdoc, există două module care efectuează verificarea ortografiei, comunicând între ele prin trecerea controlului asupra procesului în care sunt executate:

  • PasDoc_ProcessLineTalk.pas - Acest modul implementează clasa TProcessLineTalk, care este un copil al TProcess. Acesta poate fi folosit pentru a face schimb de date cu orice proces bazat pe acesta.
  • PasDoc_Aspell.pas - Implementează clasa TAspellProcess, care verifică ortografia și moștenit de la TProcessLineTalk, pentru a executa aspell si tratament la procesul de a rula.

Ambele module sunt independente de celelalte module de surse pasdoc (module), astfel încât acestea pot servi ca exemple reale de utilizare a TProcess, pentru a lucra și a comunica prin schimbul de date cu un alt program.







Trimiteți-le prietenilor: