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