Lucrul cu procesele

Lucrați cu procesele. Funcții CreateProcess și TerminateProcess

Lucrați cu procesele. Funcții CreateProcess și TerminateProcess.

Pentru a crea un proces din orice aplicație obișnuită, avem nevoie de funcția CreateProcess.







BOOL CreateProcess (
LPCTSTR lpApplicationName, // indică numele fișierului executabil
LPTSTR lpCommandLine, // indică linia de comandă
LPSECURITY_ATTRIBUTES lpProcessAttributes, // pointer pentru procesarea atributelor de securitate
LPSECURITY_ATTRIBUTES lpThreadAttributes, // un pointer la atributele de securitate a firului
BOOL bInheritHandles, // indică pavilionul mostenirii
DWORD dwCreationFlags, // crearea de steaguri
LPVOID lpEnvironment, // indicatorul pentru noul bloc de mediu
LPCTSTR lpCurrentDirectory, // indică numele directorului curent
LPSTARTUPINFO lpStartupInfo, // indicatorul pentru structura STARTUPINFO
LPPROCESS_INFORMATION lpProcessInformation // indicatorul pentru structura PROCESS_INFORMATION
);

Funcția CreateProcess creează un nou proces și firul său principal. Noul proces execută fișierul executabil specificat. Funcția CreateProcess este creată pentru a lansa un nou program. Funcțiile WinExec și LoadModule funcționează, de asemenea, dar nu oferă funcții precum CreateProcess.

În plus față de crearea unui proces, CreateProcess creează și un obiect de flux. Firul este creat cu o stivă de inițializare, a cărei dimensiune este descrisă în antetul imaginii fișierului executabil. Firul începe executarea acestei imagini la punctul de intrare.

Descriptorii pentru noul proces și noul fir sunt creați cu drepturi de acces complete. Pentru ambii descriptori, dacă descriptorul de securitate nu este furnizat, atunci descriptorul poate fi utilizat de orice funcție care solicită un descriptor de obiect de acest tip. Când este furnizat un descriptor de securitate, se efectuează un control de acces pentru orice solicitare de utilizare a mânerului. Dacă verificarea nu garantează accesul, atunci procesul solicitant nu poate utiliza descriptorul acestui thread.







Procesului i se atribuie un ID de proces pe 32 de biți. Identificatorul este valabil până la terminarea procesului. Acesta poate fi folosit pentru a recunoaște procesul sau pentru a specifica funcția OpenProcess pentru a deschide mânerul procesului. Fișierul de inițiere în cadrul procesului este atribuit, de asemenea, unui ID de thread pe 32 de biți. Acest identificator este disponibil până când fila este finalizată și poate fi utilizată pentru a identifica în mod unic fluxul din sistem. Aceste ID-uri sunt returnate în structura PROCESS_INFORMATION.

Atunci când indică numele aplicației în liniile sau lpApplicationName lpCommandLine, nu contează dacă numele extensia cererii, cu o singură excepție: cererea pentru platformele MS-DOS sau Windows ale căror fișiere cu extensia .COM trebuie să includă .COM.

Fișierul apelant poate folosi funcția WaitForInputIdle să aștepte inițializarea procesului nou pentru a finaliza și suspenda utilizatorul să introducă date fără a le procesa corespunzător. Aceasta poate fi utilizată la sincronizarea proceselor părinte și copil, deoarece CreProcess este returnat fără a aștepta inițializarea procesului nou. De exemplu, procesul de apelare ar trebui să apeleze WaitForInputIdle înainte de a încerca să găsească fereastra asociată cu noul proces.

Calea preferată pentru finalizarea procesului este utilizarea funcției ExitProcess, deoarece această funcție avertizează toate bibliotecile dinamice (DLL) utilizate de proces despre finalizarea acesteia. Alte instrumente de terminare a procesului nu notifică bibliotecile atașate la acesta. Rețineți că, în ExitProcess fluxul de apel, alte fluxuri de proces sunt finalizate, fără posibilitatea de a efectua orice cod adițional (codul de flux final inclusiv adjuncte biblioteci).
În exemplul de mai jos, vom rula și ucide imediat procesul notepad.exe

#include "stdafx.h"
#include "windows.h"
#include "iostream.h"

în cazul în care (CreateProcess ( "c: \\ ferestre \\ notepad.exe", NULL, NULL, NULL, FALSE, NULL, NULL, NULL, CIF, pi) == TRUE)
cout <<"process" < cout <<"handle " < Somn (10000); // așteptați
TerminateProcess (pi.hProces, NO_ERROR); // eliminați procesul
>
>

Funcția TerminateProcess termină procesul specificat și toate firele acestuia.

BOOL TerminateProces (
HANDLE hProcess, // procesează mânerul
UINT uExitCode // ieșire cod de ieșire
);







Articole similare

Trimiteți-le prietenilor: