Имя: Пароль:
1C
1С v8
DELPHI + COM +1c 8.3. Не завершается COM. Помогите.
,
0 Bittin
 
28.05.16
18:43
Добрый день.
Я на delphi сделал вот такое:
-получаю данные из Firebird
-подключаюсь по COM к 1с 8.3
-на основании полученных данных из из Firebird в 1с-ке создаю документы
Проблема заключается в том что
-по окончании формирования документов соединение COM в 1с не завершается,даже после закрытия программы на delphi
-после закрытия программы на delphi его процесс остается висеть в памяти, причем сжирая 300 Мб
Я так понимаю одно зависит напрямую от другого. Подскажите, как решить проблему.
Заранее спасибо!

Вот код подключения и отключения
....
uses
...., ComObj, ActiveX,V83_TLB
var
  Com_Object: IV8COMConnector;
  BaseConnect: oleVariant;
....

procedure Connect1c();
var

  ClassID: TGUID;
begin
  CoInitialize(nil);
  ClassID := ProgIDToClassID('V83.ComConnector');
  Com_Object := CreateComObject(ClassID) as IV8COMConnector;
  BaseConnect := Com_Object.Connect ('File="xxx";usr=xxx;pwd=xxx');

end;


procedure Disconnect1c();
begin
  Com_Object := NIL;
  BaseConnect:=Unassigned;
end;
2 H A D G E H O G s
 
28.05.16
18:54
Когда делается Disconnect1c() в event log Дельфей видишь upload dll-ок 1Совских ?
3 Bittin
 
28.05.16
18:56
(2) Как это посмотреть???)))
4 Bittin
 
28.05.16
18:57
Сильно не пинайте)))
5 H A D G E H O G s
 
28.05.16
19:04
перед

BaseConnect:=Unassigned;
выполни

refcount:=idispatch(BaseConnect)._AddRef-1;

refcount должно быть равно 2.
6 Bittin
 
28.05.16
19:05
нашел насколько я вижу то нет вот:
Thread Start: Thread ID: 1776. Process sk_sync_project.exe (1112)
Module Load: basic.dll. No Debug Info. Base Address: $17B00000. Process sk_sync_project.exe (1112)
Module Load: edb.dll. No Debug Info. Base Address: $20000000. Process sk_sync_project.exe (1112)
Module Load: accnt.dll. No Debug Info. Base Address: $1D200000. Process sk_sync_project.exe (1112)
Module Load: calc.dll. No Debug Info. Base Address: $1C800000. Process sk_sync_project.exe (1112)
Module Load: bp.dll. No Debug Info. Base Address: $1DF00000. Process sk_sync_project.exe (1112)
Module Load: scheme.dll. No Debug Info. Base Address: $14F00000. Process sk_sync_project.exe (1112)
Module Load: dcs.dll. No Debug Info. Base Address: $1E900000. Process sk_sync_project.exe (1112)
Module Load: mngbase.dll. No Debug Info. Base Address: $21600000. Process sk_sync_project.exe (1112)
Module Load: mngsrv.dll. No Debug Info. Base Address: $22700000. Process sk_sync_project.exe (1112)
Module Load: addin.dll. No Debug Info. Base Address: $15F00000. Process sk_sync_project.exe (1112)
Module Load: odata.dll. No Debug Info. Base Address: $20A00000. Process sk_sync_project.exe (1112)
Module Load: addncom.dll. No Debug Info. Base Address: $16000000. Process sk_sync_project.exe (1112)
Module Load: addncpp.dll. No Debug Info. Base Address: $16100000. Process sk_sync_project.exe (1112)
Module Load: drprov.dll. No Debug Info. Base Address: $6F990000. Process sk_sync_project.exe (1112)
Module Load: WINSTA.dll. No Debug Info. Base Address: $74480000. Process sk_sync_project.exe (1112)
Module Load: NTLANMAN.dll. No Debug Info. Base Address: $6F890000. Process sk_sync_project.exe (1112)
Module Load: davclnt.dll. No Debug Info. Base Address: $6BF20000. Process sk_sync_project.exe (1112)
Module Load: DAVHLPR.dll. No Debug Info. Base Address: $6BF10000. Process sk_sync_project.exe (1112)
Module Load: netutils.dll. No Debug Info. Base Address: $72A10000. Process sk_sync_project.exe (1112)
Thread Start: Thread ID: 2064. Process sk_sync_project.exe (1112)
Thread Start: Thread ID: 8692. Process sk_sync_project.exe (1112)
Source Breakpoint at $0047D7AF: D:\app\sk_sync_u.pas line 121. Process sk_sync_project.exe (1112)
7 Bittin
 
28.05.16
19:08
да, refcount= 2.
8 H A D G E H O G s
 
28.05.16
19:08
(6) Это лог подключения.
Нужен лог, который Дельфи пишет при отключении от 1С, типа:

http://s018.radikal.ru/i502/1605/86/ba67fb8cf296.png
9 H A D G E H O G s
 
28.05.16
19:12
(7) Скинь проект на [email protected], посмотрю.
10 Bittin
 
28.05.16
19:19
я поставил точку останова на Com_Object := NIL;
и потом пошел по шагам вот что выдал

Source Breakpoint at $00481CD5:
D:\app\sk_sync_u.pas line 123. Process sk_sync_project.exe (8784)
Thread Start: Thread ID: 8768. Process sk_sync_project.exe (8784)
Thread Start: Thread ID: 8692. Process sk_sync_project.exe (8784)
Module Unload: MSVCR80.dll. Process sk_sync_project.exe (8784)
Module Unload: fbclient.dll. Process sk_sync_project.exe (8784)
Thread Exit: Thread ID: 7244. Process sk_sync_project.exe (8784)
Thread Exit: Thread ID: 6068. Process sk_sync_project.exe (8784)
Thread Exit: Thread ID: 8768. Process sk_sync_project.exe (8784)
Thread Exit: Thread ID: 2892. Process sk_sync_project.exe (8784)
Thread Exit: Thread ID: 2984. Process sk_sync_project.exe (8784)
Thread Exit: Thread ID: 4340. Process sk_sync_project.exe (8784)
Thread Exit: Thread ID: 8692. Process sk_sync_project.exe (8784)
11 Bittin
 
28.05.16
19:22
а теперь еще почему-то еще ошибку выдает после выхода: access violation at 0x1035e8d3: read of adress 0x000000000
12 Bittin
 
28.05.16
19:22
щас скину
13 H A D G E H O G s
 
28.05.16
19:26
(11) Потому что добавил
refcount:=idispatch(BaseConnect)._AddRef-1;

Это для проверки, надо убрать.
14 Bittin
 
28.05.16
19:28
отправил.
ок. А что это вообще значит?
15 Bittin
 
28.05.16
19:34
а нашел-количество ссылок на мой объект
16 Torquader
 
28.05.16
23:03
Объясните, а зачем что-то делать в 1С на Delphi, когда к тому же FireBird прекрасно можно подключаться из 1С ?
17 Bittin
 
29.05.16
00:11
препод подкинул как вариант на курсовую, что я теперь и делаю
18 Serginio1
 
29.05.16
00:21
(17) Я очень люблю Delphi но уже 6 лет на нем не программирую. По моему лучше изучать C# или Java
19 Bittin
 
29.05.16
00:26
времени нет))) что раньше изучал, на том и делаю, вспоминая   былое)))
20 b_ru
 
29.05.16
01:13
Для курсовой для препода, который поощряет некрофилию, такие мелочи, как висящий процесс, не существенны обычно :)

И уточни, это процесс твоей программы остается висеть с 300 метрами?
21 Bittin
 
29.05.16
01:27
(20) не хотелось бы проверять)) да,процесс моей программы остается висеть
22 Стальная Крыса
 
29.05.16
06:02
Проблема с ооочень длинной бородой.
Сам несколько лет назад натыкался на такую хрень.
Вещь системная, непобеждаемая ...
уборщик мусора отрабатывает не моментально, а с каким-то интервалом.
Т.е. если подождать - процесс отвалится.
23 Стальная Крыса
 
29.05.16
06:07
Эээ...
Надеюсь, автору понятно про "уборку мусора" в контексте COM
24 Serginio1
 
29.05.16
08:28
У тебя
Com_Object: IV8COMConnector;
  BaseConnect: oleVariant;

Это переменные объекта или модуля?
25 Bittin
 
29.05.16
11:50
(24) модуля
(22) да вы правы отрубается через мин 5-7, но как это ускорить? я пробовал освобождения переменной-типа freеmem не помогает....
26 EvgeniuXP
 
29.05.16
15:50
А из 1c сразу к файрбёрду подключиться - религия не позволяет
27 Bittin
 
29.05.16
16:28
(26) писал выше! (16) (17)
28 Serginio1
 
29.05.16
16:30
CoInitialize(nil);
У тебя в потоке вызыается или из формы?
29 Bittin
 
29.05.16
16:42
сейчас на форме, по нажатию на кнопку происходит вызов процедуры Connect1c()
30 Serginio1
 
29.05.16
17:12
Тогда CoInitialize(nil)  не нужен
31 Bittin
 
29.05.16
17:15
(30) ок, из за него висит чтоль?
32 Serginio1
 
29.05.16
17:35
Если тв вызываешь CoInitialize
то при завершении потока должен вызвать CoUninitialize

При использовании форм связка CoInitialize CoUninitialize вызывается автоматически
33 Кирпич
 
29.05.16
17:37
(31) если делаешь CoInitialize, то надо делать и CoUninitialize

Delphi автоматом делает CoInitialize и CoUninitialize, если у тебя не консольное приложение.

а вообще, для очистки совести, нужно всем переменным, которые из 1с получал, присвоить Unassigned.

Com_Object тоже сделать OleVariant

Com_Object := CreateOleObject('V83.ComConnector');
...
Com_Object := Unassigned;
34 Bittin
 
29.05.16
17:52
(33) Ок, спасибо, добавлю CoUninitialize.
BaseConnect := Unassigned - норм, а вот  Com_Object := Unassigned;
вызывает ошибку: incompatible types: Variant and IV8ComConnector
35 Bittin
 
29.05.16
17:53
я не могу его сделать OleVariant, тогда вообще не подключается к 1с
36 Кирпич
 
29.05.16
17:55
(35) читай (33)
37 Bittin
 
29.05.16
17:59
пропустил...
Если я сделаю так, то я уже в делфе буду использовать не COM а Ole, так? Мне нужно использовать в делфе com, так требуется...
38 Кирпич
 
29.05.16
17:59
(35) просто родключаешься к базе и больше ничего не делаешь? Или ещё там чота колбасишь?
39 Bittin
 
29.05.16
18:00
(38) делаю, документы создаю справочники заполняю
40 Кирпич
 
29.05.16
18:04
(39) а ну тогда фиг знает чо ты там понаписал. Попробуй сначала чисто подключиться и отключиться.
41 Serginio1
 
29.05.16
18:49
(34) Если у тебя не консольное приложение то и CoInitialize тебе не нужны.
42 Serginio1
 
29.05.16
18:51
Если Com_Object OleVariant;
то

Com_Object := CreateComObject(ClassID);
43 Bittin
 
29.05.16
19:06
(33) если все переменные сделать Unassigned то процедура Disconnect1c  выполняется 4 минуты, зато после закрытия программы не висит в памяти. Но если оставить как было то процедура Disconnect1c выполняется быстро, зато после закрытия программа висит в процессах теже 4 минуты.
Короче равнозначно...что делать что не делать....
44 Bittin
 
29.05.16
19:08
(42) если сделать так, то при коннекте вылазиет ошибка
"variant does not reference an aitomation object"
45 Serginio1
 
29.05.16
19:10
Ты CoInitialize  убрал?
А если

Com_Object := CreateComObject(ClassID) as IDispatch;
46 Bittin
 
29.05.16
19:29
(45) убрал. IDispatch-Так заработало. А что это значит и в чем разница?
47 Serginio1
 
29.05.16
19:40
(46) Да разницы особо быть не должно.
48 Bittin
 
29.05.16
19:46
(47) я так понимаю это интерфейсы так? в чем между ними разница тогда?
49 Serginio1
 
29.05.16
20:26
IV8COMConnector это интерфейс с заранее известными методами и свойствами.

Idispatch это двойная диспетчеризация. Применяется для позднего связывания.
http://compress.ru/article.aspx?id=10600&part=index21ext1
50 Bittin
 
29.05.16
22:00
(49) спасибо за инфу...
А если ли способ как нить всем переменным присвоить Unassigned?
51 Serginio1
 
29.05.16
22:46
Если они являются переменными метода, то при завершении метода им всем автоматически присваивается Unassigned
52 Serginio1
 
29.05.16
22:47
Аналогично как со строками
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший