|
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
|
Аналогично как со строками
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |