Cum să finalizați programabil procesul

Buna ziua tuturor! Spuneți-mi ... după ce termin programul, rămâne să închideți procesul de rulare în managerul de activități, cum poate fi ucis.








Funcția TerminateProcess este utilizată pentru a declanșa necondiționat procesul de ieșire. Folosiți-o numai în situații extreme.

Este procesul dvs.? Vreau să spun, este cererea scrisă de tine? Este un proces normal sau un server OLE în afara procesului?

Nu! Acesta este un server ole! Am creat-o

AppProgID: = "Outlook.Applicație";
App: = CreateOleObject (AppProgID)
.
și închideți: App.Quit # xA0; - # xA0; dar rămâne încă.

nu funcționează .. este dacă m-am conectat la deja pornit ..

> nu funcționează .. este dacă am conectat la deja pornit ..

AppProgID: = "Outlook.Applicație";
# xA0; ServerRun: = false;
# xA0; încercați
# xA0; Rezultat: = GetActiveObject (ProgIDToClassID # xA0; # xA0; # xA0; # xA0; (AppProgID), zero, Necunoscut);
# xA0; dacă (Rezultat = MK_E_UNAVAILABLE) atunci
# xA0; # xA0; App: = CreateOleObject (AppProgID)
# xA0; altceva începe
# xA0; # xA0; App: = GetActiveOleObject (AppProgID);
# xA0; # xA0; ServerRun: = adevărat;
# xA0; sfârșitul;

așa că am verifica perspectivele deschise sau nu .. și în funcție de rezultat, fie creez un nou obiect ole, fie mă conectez la deja lansat

dacă nu ServerRun atunci
# xA0; # xA0; # xA0; App.Quit;
# xA0; App: = Neasignat;
Și așa că termin munca, adică fie închideți perspectiva pe care am pornit-o sau deconectați aplicația: = Neasignată;
dar procesul încă cântărește. ((

Dacă vă alăturați celei existente, se întâmplă următoarele:
1. Apelul la GetActiveObject mărește numărul referințelor la obiectul COM cu unul.
2. În plus, creșteți în mod repetat contorul referințelor la același obiect, cauzând GetActiveOleObject.






3. Eliberați doar un singur link. Prin urmare, procesul se blochează deoarece numărul de referință nu este zero.

așa că dacă nu mă conectez și nu creez. practic se întâmplă, perspectivele nu au început încă de la început!

Și unde este lansat OUTLOOK.EXE sau nu este lansat?

Mecanismul de lucru cu servere COM out-of-proces arata astfel. Când apelați CoCreateInstance (implicit se numește, de exemplu, prin funcția CreateOleObject), OS determină tipul serverului COM. Dacă acesta este un server în afara procesului, atunci sistemul de operare verifică dacă procesul în care este implementat acest server COM se execută sau nu. Dacă procesul nu se execută, porniți-l. Apoi, se creează un obiect COM și numărul de referință este incrementat. Dacă procesul în care este implementat acest server COM este deja în desfășurare, OS crește pur și simplu numărul de referință al obiectului și returnează un pointer la interfața sa. A doua oară când procesul nu începe.

De ce, în cazul tău, sună GetActiveObject?

Ei bine, cu ajutorul GetActiveObject, verific dacă perspectiva rulează sau nu.
Chiar dacă voi elimina totul, o voi lăsa numai # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; App: = CreateOleObject (AppProgID), este încă la fel. ((

> folosind GetActiveObject, verifică dacă Outlook-ul se execută sau nu

Da, nu este necesar să verificați dacă Outlook se execută sau nu!
Sistemul de operare în sine o va face dacă încercați să creați un obiect al tipului "Outlook.Application".

> # xA0; App: = CreateOleObject (AppProgID), este încă aceeași.

Prin urmare, în altă parte există linkuri către serverele COM implementate în procesul OUTLOOK.EXE. Pentru fiecare CreateOleObject ar trebui să fie denumită simetric App: = Neasignat:

utilizări
# xA0; Windows, Mesaje, SysUtils, Variante, Clase, Grafică, Controale, Formulare,
# xA0; Dialoguri, StdCtrls;

tip
# xA0; TForm1 = clasa (TForm)
# xA0; # xA0; Buton1: TButton;
# xA0; # xA0; Buton2: TButton;
# xA0; # xA0; procedura Button1Click (Expeditor: TObject);
# xA0; # xA0; procedura Button2Click (Expeditor: TObject);
# xA0; privat
# xA0; # xA0; FOutLook: Varianta;
# xA0; sfârșitul;

var
# xA0; Form1: TForm1;

procedura TForm1.Button1Click (expeditor: TObject);
începe
# xA0; FOutLook: = CreateOleObject ("Outlook.Applicație");
se încheie;

procedura TForm1.Button2Click (expeditor: TObject);
începe
# xA0; FOutLook: = Neasignat;
se încheie;

hmm .. că este, puteți pur și simplu eliminați Quit, și lăsați neasignat?
și nu verificați crearea?
OO! Acesta a câștigat. Nitsche însuși ... mulțumesc foarte mult. Foarte recunoscător!

Ce întrebare este acest răspuns:
> cum poate fi ucis.







Trimiteți-le prietenilor: