Показать сообщение отдельно
  #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 сервер, необходимо.
__________________
Не забывайте делать резервные копии
Ответить с цитированием