Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


grigory ©   (2004-11-29 13:09:00) 

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


VMcL   (2004-11-29 18:40:00) [1]

>> simpson ©  (29.11.04 13:33) [2]

Какой вопрос - такой ответ:
> как его можно убить???


grigory   (2004-11-29 15:58:00) [2]

хм..то есть просто можно убрать Quit, а оставить Unassigned?
и не проверять на создание?
ОО! заработало!!! Ниче себе..спасибо большое!!!! Очень благодарен!!


simpson   (2004-11-29 15:26:00) [3]

> при помощи GetActiveObject я проверяю запущен ли аутлук или нет

Да не нужно проверять, запущен Outlook или нет!
ОС сама это сделает, если ты попытаешься создать объект типа 'Outlook.Application'.

>  App := CreateOleObject(AppProgID), то все равно то же самое..:

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


unit Unit1;

interface

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

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

var
 Form1: TForm1;

implementation

{$R *.dfm}

uses
 ComObj;

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

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

end.


grigory   (2004-11-29 15:17:00) [4]

ну так при помощи GetActiveObject я проверяю запущен ли аутлук или нет..
даже если я все уберу, оставлю только                       App := CreateOleObject(AppProgID), то все равно то же самое..:((


simpson   (2004-11-29 14:50:00) [5]

> grigory ©   (29.11.04 14:27) [9]

А причем же здесь запущен или незапущен OUTLOOK.EXE?

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

Зачем в твоем случае вызывать GetActiveObject?


grigory   (2004-11-29 14:27:00) [6]

так если я не подсоединяюсь а создаю??? в основном так и происходит, аутлук не запущен изначально!!


simpson   (2004-11-29 14:10:00) [7]

Если ты присоединяешься к существующему, то происходит следующее:
1. Вызов GetActiveObject увеличивает счетчик ссылок на COM-объект на единицу.
2. Дальше, ты ЕЩЕ раз увеличиваешь счетчик ссылок на этот же объект, вызывая GetActiveOleObject.
3. Освобождаешь ты только одну ссылку. Поэтому процесс висит, так как счетчик ссылок не нулевой.


grigory   (2004-11-29 14:02:00) [8]

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

так я проверяю открыт outlook или нет..и в зависимости от результат,либо создаю новый оле-объект,либо подсоединяюсь к уже запущенной

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


simpson   (2004-11-29 13:55:00) [9]

> не работает..это если я подсоединился к уже запущенному..

Переведи?


grigory   (2004-11-29 13:50:00) [10]

не работает..это если я подсоединился к уже запущенному..


simpson   (2004-11-29 13:48:00) [11]

App := Unassigned;


grigory   (2004-11-29 13:46:00) [12]

Нет! Это оле-сервер! я создал его

AppProgID := 'Outlook.Application';
App := CreateOleObject(AppProgID)
.....
а закрыываю:App.Quit  -  но он все равно остается!!!!


simpson   (2004-11-29 13:33:00) [13]

> VMcL ©   (29.11.04 13:20) [1]


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


Ну, и так далее.

> grigory ©   (29.11.04 13:09)

Процесс твой? В смысле, запускаемое приложение написано тобой? Это обычный процесс или внепроцессный OLE-сервер?


VMcL   (2004-11-29 13:20:00) [14]

TerminateProcess()


Наверх

Титульная страница Поиск, карта сайта Написать письмо