Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
grigory ©   (2004-11-29 13:09) [0]

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


 
VMcL ©   (2004-11-29 13:20) [1]

TerminateProcess()


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

> 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-сервер?


 
grigory ©   (2004-11-29 13:46) [3]

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

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


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

App := Unassigned;


 
grigory ©   (2004-11-29 13:50) [5]

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


 
simpson ©   (2004-11-29 13:55) [6]

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

Переведи?


 
grigory ©   (2004-11-29 14:02) [7]

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 14:10) [8]

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


 
grigory ©   (2004-11-29 14:27) [9]

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


 
simpson ©   (2004-11-29 14:50) [10]

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

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

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

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


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

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


 
simpson ©   (2004-11-29 15:26) [12]

> при помощи 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:58) [13]

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


 
VMcL ©   (2004-11-29 18:40) [14]

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

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



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.037 c
14-1103831111
Grinders
2004-12-23 22:45
2005.01.16
Yahoo


14-1103890757
asafr
2004-12-24 15:19
2005.01.16
Сколько брать, чтоб потом не бегать...


1-1104408393
AndreyK_5
2004-12-30 15:06
2005.01.16
ShowMessage и мышь


3-1102603978
Rule
2004-12-09 17:52
2005.01.16
Как добраться до TDataLink


14-1104223573
Юзер
2004-12-28 11:46
2005.01.16
AutoCad





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский