dll не уходит из памяти, висит в процессах #282160


#0 by il
Написал ВК которая открывает делфевскую форму, в которой статически подключается другая dll. все работает, но при закрытии 1С, вторая dll похоже остается висеть в памяти, в процесс эксплорере висит как бы 1С сеанс, его приходится убивать вручную иначе комп не выключается. Еще при выключении компа надо убивать DDE сервер. Кто значет подскажите как при закрытии 1С убивать из памяти вторую длл
#1 by ТелепатБот
#2 by ШтушаКутуша
не все ссылки на компоненту или ее элементы ты корректно уничтожаешь, а по технологии СОМ, пока существует ссылка на интерфейс-объект живет
#3 by il
Имеешь ввиду переменные?
#4 by 774816
попробуй переменную объекта обнули таким образом после использования а=""; и в самой dll при выгрзуке обнули переменные объектов
#5 by sapphire
читай сабж внимательно
#6 by Зарбазан
Внимательно прочитай "Технологию создания ВК" нет не переменные, создавая объекты в ВК нужно корректно счетчиком ссылок управлять, ну и самими ссылками соответственно
#7 by Зарбазан
+ ну и на чем пишешь ВК тоже неплохо было бы сказать...С С++ я бы помог, а если Delphi, то тут много народу...
#8 by kazam
"Написал ВК которая" видимо фигово написал
#9 by kazam
#10 by Зарбазан
насколько я помню, там писать ничего не надо. В шаблоне с ИТС для VС++ уже лажа, процесс остается в памяти :)
#11 by kazam
так он вторую длл открывает из первой и вторая "зависает"
#12 by Зарбазан
да он сам не знает, что у него там... По симптомам похоже, что как раз в своей ВК Release где то не делает....
#13 by kazam
ну вообщем я о том же. " В шаблоне с ИТС для VС++ уже лажа" - эту фигню вообще не видел
#14 by il
На делфи dll прописывается статично
#15 by il
Что такое Release?
#16 by kazam
получаеться что у тебя 1ая ДЛЛ висит
#17 by il
Если брать шаблон предложенный Ромиксом, то ниче такого не возникает. Если брать отдельно форму которая вызывается в ВК и вызывает вторую компоненту то тоже все нормально ниче в процессах не остается. Форму вызываю следующим образом: //Собственно основной метод компоненты  end; Может ее как-то удалять надо специально?
#18 by il
Вторая ДЛЛ статично вызывается как раз из этой формы.
#19 by kazam
это код с проблемой или без? Сдесь вроде все ок
#20 by kazam
ScForm ??
#21 by il
с проблемой ScForm - имя формы
#22 by kazam
не понял? имя формы вроде TheScForm? покаж определение и присовение ScForm
#23 by il
+21 Вру имя модуля формы
#24 by il
Uses ... ...
#25 by kazam
Попробуй в OnClose добавить Application.Terminate
#26 by kazam
Форма.OnClose
#27 by il
В принципе был вариант без формы, вторая длл статично вызывалась в модуле, где описаны Свойства и методы ВК, эффект тот же самый
#28 by il
Спасибо попробую
#29 by kazam
Так пробуй - интересно ж!
#30 by il
... ... Application.Terminate Наверно так лучше будет а то мне после закрытия формы надо окошки из нее выдергивать
#31 by kazam
по моему Application.Terminate произойдет сразу после открытия формы
#32 by il
Сейчас не могу я на работе а это все дома. Завтра отпишусь че получилось
#33 by romix
Форму надо не только закрыть, но и удалить ее объект (.Free кажется).
#34 by il
Вобщем схема этого проекта такая: Есть приложение делфи, которое состоит из 2 файлов, форма и модуль в котором подключается dll и определяются функции из этой длл. При запуске в режиме приложения все работает нормально, форму закрываю, память освобождается. Процедура procedure TScForm.FormDestroy(Sender: TObject); Затем я включил данную форму в ВК для 1С. Там тоже все работает, но при закрытии память не освобождается. Метод который вызывает данную форму:       ..       ..    end;//case  end; То что сама форма освобождает память при таком подходе я уже убедился на многочисленных опытах. То что содержалось в деструкторе формы я закомментил и перенес в OnClose, что эффекта не дало, че теперь дальше делать у меня даже нет мыслей. В самой ВК никакие переменные, указатели и т. д. на функции и переменные второй ДЛЛ не определены
#35 by il
Кто знает подскажите какими средствами можно узнать какие именно ссылки остаютя висеть? или все руками по очереди комментить?
#37 by il
ап
#38 by il
Неужели никто форму из ВК не вызывал?
#39 by ШтушаКутуша
а почему бы TheScForm не поместить в в T_vk_object.meth4 ? var  TheScForm :TScForm;
#40 by il
А как тогда ее запускать? Также Аппликашион.Run?
#41 by MMF
выкладывай сырцы, если хочешь, чтобы помогли
#42 by il
Код формы: uses    procedure FormClose(Sender: TObject; var Action: TCloseAction);    function OpenFileReader(var hScScanDev : ScScanDeviceHandle) : boolean;    function OpenTwainSource(var hScScanDev : ScScanDeviceHandle) : boolean;    function ScanToPackage(hScScanDev : ScScanDeviceHandle; out hScImage: ScImageHandle) : boolean;    procedure ExportImageToArchive(hScImage: ScImageHandle; ImageName: string; out ImagePath: string); *******************************************************************************}      if not OpenFileReader(hScScanDev) then break;    end else begin    Log('Сканирование по конфигурации "ScanPassportAndDriveLic"'); function TScForm.CreatePack(var hScPackage: ScPackageHandle): boolean; begin  Log('Создание нового пакета...'); function TScForm.OpenFileReader(var hScScanDev: ScScanDeviceHandle): boolean;  Log('Инициализация устройства сканирования (FileReader)...');  Log('  пользователь должен указать файл с изображением:');  if dlgLoadImage.Execute then function TScForm.OpenTwainSource(var hScScanDev: ScScanDeviceHandle): boolean; var    if not ScScannerSelectTWAINSource(hScInstance, Handle) then begin        LogWarn('  TWAIN-источник не был указан, либо TWAIN-подсистема не установлена!'); procedure SetupEditField(var Tag: TEditField; Edit: PEdit; Id: string);      end;  for iField:=0 to cFields-1 do with EditFields[iField] do      if pedtSender^.Name=Edit^.Name then with ScFieldValueAttr.rcValue do begin procedure TScForm.FormClose(Sender: TObject; var Action: TCloseAction); begin end.
#43 by MMF
1) учимся пользоваться файлообменниками 2) убираем все из FormClose в FormDestroy 3) TheScForm делаем локальной переменной метода компоненты   Application.Run;  --- три строки маразма выкидываем 4) Application.Handle := hMainWND (который получили IExtWindowsSupport)
#44 by il
Можно 1 строчку разжевать?
#45 by il
что есть hMainWND?
#46 by il
ап
#47 by MMF
hMainWND - хендл окна 1С, локальная переменная модуля объекта переменной. в init ее инициализируешь
#48 by il
Спасибо сегодня попробую
#49 by il
PExtWindows я так понял имеет тип Pointer, а pConnection какой тип должен быть? Это пример для какой версии, у меня 7, а мануала по ней нет только по 5. И в хелпе GetAppMainFrame( че то вообще не находит. Пробовал подобрать тип pConnection методом научо тыка, получилось TInterfacedObject, но у нее функция GetInterface(, а константа IID_IExtWndsSupport не определена ругается. Как ее определять?
#50 by il
Еще тупой вопрос какой init имеется ввиду?
#51 by romix
там где InitDone
#52 by il
у меня в коде нигде не встречается InitDone, где он должен быть в файле dpr, или в файле vk_object.pas?
#54 by romix
А ты какой шаблон компоненты пользуешь?
#55 by il
В смысле шаблон? Файл *.pas, В vk_object подключен как модуль
#56 by il
А это актуально для какой версии Delpi? У меня 7. Функцию GetAppMainFrame в нелпе даже не находит и через точку она не вылазиет. iExtWindows какого типа должен быть - Pointer? короче на этой строке компиляция не проходит:  iExtWindows.GetAppMainFrame(wnd);
#57 by MMF
клиника :-(
#58 by il
Ну чо клиника то? не компилирует, нет там такой функции GetAppMainFrame
#59 by il
Ну помогите кто нибудь... что это за объект iExtWindows?
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С