Як програмно завершити процес

Привіт всім! Подскажіте..у мене після завершення роботи програми залишається висіти запущений під час роботи процес в диспетчері завдань, як його можна вбити.


The TerminateProcess function is used to unconditionally cause a process to exit. Use it only in extreme circumstances.

Процес твій? У сенсі, що запускається написано тобою? Це звичайний процес або внепроцессний OLE-сервер?

Ні! Це оле-сервер! я створив його

AppProgID: = "Outlook.Application";
App: = CreateOleObject (AppProgID)
.
а закрииваю: App.Quit # XA0; - # XA0; але він все одно залишається.

НЕ работает..ето якщо я приєднався до вже запущеного ..

»Не работает..ето якщо я приєднався до вже запущеного ..

AppProgID: = "Outlook.Application";
# XA0; ServerRun: = false;
# XA0; try
# XA0; Result: = GetActiveObject (ProgIDToClassID # XA0; # XA0; # XA0; # XA0; (AppProgID), nil, Unknown);
# XA0; if (Result = MK_E_UNAVAILABLE) then
# XA0; # XA0; App: = CreateOleObject (AppProgID)
# XA0; else begin
# XA0; # XA0; App: = GetActiveOleObject (AppProgID);
# XA0; # XA0; ServerRun: = true;
# XA0; end;

так я перевіряю відкритий outlook або нет..і в залежності від результат, або створюю новий оле-об'єкт, або приєднуються до вже запущеної

if not ServerRun then
# XA0; # XA0; # XA0; App.Quit;
# XA0; App: = Unassigned;
а так завершую роботу, тобто. або закриваю запущений мною аутлук..лібо від'єднується App: = Unassigned;
але процес все одно важить. ((

Якщо ти приєднуєшся до існуючого, то відбувається наступне:
1. Виклик GetActiveObject збільшує лічильник посилань на COM-об'єкт на одиницю.
2. Далі, ти ЩЕ раз збільшуєш лічильник посилань на цей же об'єкт, викликаючи GetActiveOleObject.
3. Звільняються ти тільки одне посилання. Тому процес висить, так як лічильник посилань не нульовий.

так якщо я не під'єднують а створюю. в основному так і відбувається, Аутлук не запущені спочатку !!

А до чого ж тут запущено або незапущен OUTLOOK.EXE?

Механізм роботи з внепроцесснимі COM-серверами виглядає так. Коли ти викликаєш CoCreateInstance (неявно він викликається, наприклад, функцією CreateOleObject), ОС визначає тип COM-сервера. Якщо це - внепроцессний сервер, то ОС перевіряє, запущений чи ні процес, в якому цей COM-сервер реалізований. Якщо процес не запущений, то виполянет його запуск. Далі створюється COM-об'єкт і збільшується лічильник посилань на нього. Якщо процес, в котрому реалізований даний COM-сервер уже запущений, то ОС просто збільшує лічильник посилань на об'єкт і повертає тобі покажчик на його інтефейс. Другий раз процес не запускається.

Навіщо в твоєму випадку викликати GetActiveObject?

ну так за допомогою GetActiveObject я перевіряю чи запущений Аутлук чи ні ..
навіть якщо я все приберу, залишу тільки # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; App: = CreateOleObject (AppProgID), то все одно те ж саме. ((

> За допомогою GetActiveObject я перевіряю чи запущений Аутлук чи ні

Та не потрібно перевіряти, запущений Outlook чи ні!
ОС сама це зробить, якщо ти спробуєш створити об'єкт типу "Outlook.Application".

> # XA0; App: = CreateOleObject (AppProgID), то все одно те ж саме.

Значить, десь ще створюються посилання на COM-сервери, реалізовані в процесі OUTLOOK.EXE. Для кожного CreateOleObject повинен симетрично викликатися App: = Unassigned:

uses
# XA0; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
# XA0; Dialogs, StdCtrls;

type
# XA0; TForm1 = class (TForm)
# XA0; # XA0; Button1: TButton;
# XA0; # XA0; Button2: TButton;
# XA0; # XA0; procedure Button1Click (Sender: TObject);
# XA0; # XA0; procedure Button2Click (Sender: TObject);
# XA0; private
# XA0; # XA0; FOutLook: Variant;
# XA0; end;

var
# XA0; Form1: TForm1;

procedure TForm1.Button1Click (Sender: TObject);
begin
# XA0; FOutLook: = CreateOleObject ( "Outlook.Application");
end;

procedure TForm1.Button2Click (Sender: TObject);
begin
# XA0; FOutLook: = Unassigned;
end;

хм..то є просто можна прибрати Quit, а залишити Unassigned?
і не перевіряти на створення?
ГО! запрацювало. Нічо себе..спасібо велике. Дуже вдячний!!

Яке питання - така відповідь:
> Як його можна вбити.