Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Технологии
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.03.2009, 16:31
WinnyThePooh WinnyThePooh вне форума
Прохожий
 
Регистрация: 16.02.2009
Сообщения: 31
Репутация: 10
Вопрос Как "отключиться" от Excel, запущеного как OLE?

Формирую отчет в Excel (в частности, 2000) через OLE-объект. По завершении формирования есть желание отключится от него и от сформированного файла (типа, пусть дальше сам(и) живе(у)т).
Пытаюсь так:
Код:
//Переменная
var
  XLApp: OLEVariant;
//Запускаем Excel
  XLApp:=CreateOleObject('Excel.Application');
//далее - работа
...
//в конце
  XLApp:=UnAssigned;
Ан нет! Пока не закрыта "порождающая" программа, Excel закрывается с ошибками, в памяти остаются болтаться процессы и т.п.
Попытка использовать XLApp.Free выдает ошибку, типа "этот метод низ-з-зя использовать с переменной типа Variant".
Имеется ли принципиальная возможность отцепится от порождающего процесса или проще описать как фичу в документации или посоветуйте - как быть?
Ответить с цитированием
  #2  
Старый 25.03.2009, 16:39
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Попробуй сделать:
Код:
XLApp:=Disconnect;
//а потом уже
XLApp:=UnAssigned;
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 25.03.2009, 16:55
WinnyThePooh WinnyThePooh вне форума
Прохожий
 
Регистрация: 16.02.2009
Сообщения: 31
Репутация: 10
Печаль Увы, немного не то...

Насколько я понимаю, Disconnect - метод при работе с COM-серверами, здесь же - OLE-объект.
По крайней мере предложенную Вами форму система не воспринимает.
Ответить с цитированием
  #4  
Старый 25.03.2009, 17:25
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Это потому что я фигню написал, нужно:
Код:
XLApp.Disconnect;
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #5  
Старый 25.03.2009, 18:42
WinnyThePooh WinnyThePooh вне форума
Прохожий
 
Регистрация: 16.02.2009
Сообщения: 31
Репутация: 10
По умолчанию увы... не то

Не беспокойтесь, я и так сообразил
Но увы, как я Вам и писал в прежнем ответе: disconnect - метод COM-серверов.
При попытке слепить его к ссылке на объект OLE Automation (а именно его я пытаюсь применить) система выдает:
"Project ... raised exception class EOLEError with message 'Method 'disconnect' not supported by automation obect'". Т.е. метод явно не тот.
Увы, но и COM-серверами мне пока не удалось достичь успеха: пока не загасишь вызывающее приложение, Excel вываливается с ошибкой: "Инструкция по адресу 0х... обратилась к памяти по адресу 0х... Память не может быть 'read'". Причем адреса одинаковы - явно что-то слетает в указателях.
В общем, ж...
Кстати, в доступной литературе как-то тоже описываются случаи принудительного гашения OLE-объектов при закрытии приложений и нигде особо не описывается "отпускание в свободное плавание". Может это таки фича OLE'й и я зря пытаюсь её "исправить"?
Ответить с цитированием
  #6  
Старый 25.03.2009, 21:44
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Цитата:
Ан нет! Пока не закрыта "порождающая" программа, Excel закрывается с ошибками, в памяти остаются болтаться процессы и т.п.
Утверждение, не соответствующее действительности. "Порождающая" программа при использовании позднего связывания (как здесь: CreateOleObject) не "держит" COM сервер и никакого влияния после окончания работы на него не оказывает. Поэтому "отключения" от сервера не требуется. Если работа завершилась корректно, то "породившая" процесс программа может спокойно завершаться - Excel (если та же программа его не пристрелила) остается загруженным как отдельное приложение никак не связанное с вызвавшем приложением.

Процессы (Excel) остаются в памяти тогда (и только тогда), если во время вызова методов COM сервера Excel ПРОИСХОДИТ ошибка (неверные типы параметров, не в том месте вызван метод и т.д.; видов ошибок может быть тьма), а на момент ошибки интерфейс Excel скрыт и нет возможности корректно закрыть окно Excel'я.
Специально для таких случаев завершение работы с Excel в блоке except надо применять метод сервера Quit (к примеру, XLApp.Quit)

Если после экспорта из "порождающей" программы при "ручном" закрытии Excel происходит ошибка, то это глюки системы, поскольку (как было выше отмечено) клиентское приложение после окончания работы с COM сервером (корректно или с ошибкой) никак не может на него влиять. Правда, такое может произойти и тогда, когда приложение сделало какое-то количество ошибок при обращении к неверному диапазону ячеек в параметрах методов при экспорте данных.
Присвоение в конце работы вариантной переменной Unаssigned, которая ссылается на COM сервер, необходимо.
__________________
Не забывайте делать резервные копии
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:07.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter