Имя: Пароль:
1C
 
Как завершить соединение ОЛЕ?
0 Alter72
 
28.08.08
09:17
Цепляюсь из v8 к v7:
БазаОЛЕ = COMObject("V77.Application", "servername")
Соответственно семерка запускается и работает на компе servername
Все подключается и работает прекрасно.
Внимание вопрос: как завершить соединение чтобы семерка закрылась?
На локальном соединении прокатывает присвоение БазаОЛЕ = "", но при запуске на серваке процесс семерки остается висеть после этого.
1 kosts
 
28.08.08
10:08
БазаОЛЕ . завершениеработысистемы()

вроде.
2 Alter72
 
28.08.08
10:44
(1) БазаОЛЕ . завершениеработысистемы()
на такое говорит "неизвестный метод".

а если вызывать через БазаОЛЕ.EvalExpr("завершениеработысистемы()")
Говорит "исключение, попытка вызвать процедуру как функцию"
3 kosts
 
28.08.08
10:54
А если в 7 сделать функцию которая вызовет завершениеработысистемы()?
4 НЕА123
 
28.08.08
10:59
(2) не помню, и семерки нет... но вроде типа так:
БазаОЛЕ.Выполнить("завершениеработысистемы()")
5 НЕА123
 
28.08.08
11:02
(4)+ в смысле EvalExpr(то бишь  Вычислить()) должно что-то возвращать, а Выполнить() не обязательно.
6 НЕА123
 
28.08.08
11:03
(3)
функция Завершить()
 ЗавершитьРаботуСистемы();
 возврат 1;
КонецФункции;
7 Alter72
 
28.08.08
14:16
(4)(5)  ну "Выполнить()" это вы сами придумали. 7ка такого не знает ;)
(6) Чтобы не править конфу сделали внешнюю обработку для 7ки с завершением работы при открытии. Если запускать эту обработку руками, все прекрасно закрывается.
При запуске через ОЛЕ удивительным образом продолжает работать дальше! Причем в отладчике 7ки видно что в обработку заходит и ЗавершитьРаботуСистемы() выполняет!

Полтергейст... Причем не могу даже обоснования такому поведению придумать.
8 Irbis
 
28.08.08
14:21
(7) Диалогового окна при завершении работы системы не возникает?
9 Alter72
 
29.08.08
06:48
(8) если руками запускать обработку закрытия, то ниче не спрашивает. А че там происходит когда запущена через ОЛЮ  неизвестно - окошко-то не появляется.
10 smaharbA
 
29.08.08
07:07

БазаОле.СохранитьЗначение("НеЗапрашиватьПодтверждениеПриВыходе", ПустоеЗначение(0));
БазаОле.ЗавершитьРаботуСистемы(0);
//БазаОле.ExecuteBatch("ЗавершитьРаботуСистемы(0)"); Выбирай сам
11 Alter72
 
04.09.08
10:43
[code]БазаОле.ЗавершитьРаботуСистемы(0);[/code]
Выполняет без ошибки, но Оле база кладет на такие завершения - как был сеанс пользователя запущен, так и остается висеть, блокируя повторные подключения под ним.
12 Irbis
 
04.09.08
10:56
(9) Бывает диалог подтверждения выхода вызывается.
Не знаю почему, но бывает процесс висит пока форму, из которой запустили ОЛЕ, не закроешь. Как с этим бороться хз.
13 Roin
 
04.09.08
11:20
БазаОле = "" и усё
14 Alter72
 
04.09.08
11:26
(13) см (0): не работает!!
15 Torquader
 
04.09.08
12:04
Вообще-то, завершением OLE-серверов ведает определённый сервис в системе, и он должен удалять объекты из памяти после того, как на них не осталось ни одной ссылки. Поэтому надо и БазаОле=0 и сбросить все дочерние переменные, так как некоторые из них просто подвешивают процесс.
Вариант №2 - создавать на сервере не семёрку, а другое приложение, которое может вызвать семёрку через OLE, тогда семёрку можно будеть успешно завершить присвоением Семёрка=0, а это "несчастное" приложение может ожидать следующего запроса или его можно тупо "прибить" через WMI.
16 Alter72
 
04.09.08
12:38
(15) А по подробнее: че за сервис? где он выполняется (на клиенте откуда инициирую OLE-соединение, или на сервере где запускается OLE-приложение)?
Первый раз такое слышу: это собственные предположения или документированно (ссылку)?

по Варианту 2: ...и реализовать в этом приложении обертки для вызовов всех методов 7ки??
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан