Форум: "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