Если плагины используются твоей программой, то их нужно выгрузить из памяти! больше, на сколько я знаю, никак их не удалить. Тут должно быть два способа (минимум): 1) Функция выгрузки из памяти внутри плагина 2) Посторонними утилитами .................................................
Ембедед плагин сам удаляется при нормальном закрытии проги, удалить то что занято другой прогой не даст система, так же и убить плагин если его запустила твоя прога. Так что надо знать что и от куда ты удаляеш, если свое из той проги что выложила в ембедед, то при закрытии она сама уберет из эмбедед все что туда ложила, то что туда же положил ты можно удалить. В ембеде могут оставаться файлы при некорректном завершении проги, плагин то же может остатся,если его работа не правильно завершена. И если речь идет просто о том что бы при нормальном завершении проги в ембеде ничего не оставалось, то надо просто обеспечить корректное ее завершение в обработчике завершения проги - CBK_EXIT, прервать работу выполняемой плагином.
Вот-вот, именно это я и имел ввиду – выгрузить плагин из памяти перед убийством процесса. Мое стремление: максимально удалить вложенные (<Embedded>) файлы именно после убийства exe. 30 файлов в CBK_EXIT удаляю одним циклом:
Code
If (taskkill=1) Then For d=1 To 30 D$='WAIT,HIDE /c del "<Embedded>\\'+CHAR(d)+'.dym" /Q' Run("cmd","D$") Next d Run("taskkill.exe","HIDE,WAIT /F /IM dym.exe") End Exit()
Quote (Alex3A)
то при закрытии она сама уберет из эмбедед все что туда ложила
В самом деле?
Значит, останутся всего два плагина и файлы с сохраненными настройками. Сенк за отзывы!
Значит, останутся всего два плагина и файлы с сохраненными настройками. Сенк за отзывы!
Все что в ембедед убирается, в том числе и плагины, если плагин остался, значит система не дала его убить при закрытии проги. Плагины бывают разные, есть такие что в процессе своей работы открывают паралельные потоки (нити), если приложение убить в момент работы такого потока, плагин остается по той причине что он в этот момент не управляем. Что бы все было нормально, плагину следует завершить свою работу. Тут просто тебе надо конкретно объяснить ситуацию, какие плагины у тебя остаются, и при каких условиях. Удаляются ли плагины в ручную, если нет, посмотри не висит ли чего в процессах. Обычно в плагине есть событие активирующееся при закрытии приложения которое его использует, по этому событию плагин должен подготовить себя к закрытию. Если такое в плагине не предусмотрено и он пользует паралельные потоки, или как раз находится в недоступном режиме, то он остается.
Из нормальных, не-извращенческих вариантов могу предложить аналог, описанный здесь. Тут показано, как программе удалить саму себя при помощи запуска пакетного сценария, который ждёт завершения запустившей его проги, после чего удаляет. Попробуй, понравится )) Жизнь оказалась не такой уж и забавной, как поначалу...
Ты не поверишь! Но у меня получилось! Не знаю, ко всем ли плагинам подойдет? Проверяем у себя…
Действительно работает! Хорошая работа, сам бы не додумался, если честно Только в CBK_Exit надобыло после RunScript(...) написать exit, а то прога не закрывается приходиться в диспетчер лезть.
Из нормальных, не-извращенческих вариантов могу предложить аналог, описанный здесь. Тут показано, как программе удалить саму себя при помощи запуска пакетного сценария, который ждёт завершения запустившей его проги, после чего удаляет. Попробуй, понравится ))
Здесь нужно удалить именно плагин во вермя работы приложения
Из нормальных, не-извращенческих вариантов могу предложить аналог, описанный здесь.
Применение эксклюзивных решений, в первую очередь, говорит о том что что то в функционировании проги, недодумано програмером, вот он и пытаеся свои недоработки компенсировать такими решениями. Dym, как я понял из вышеописанного, ты применил функцию DeleteObject(""). И определил что она способна удалять все объекты, а не только созданные динамически. На месте чансов, я бы сделал более универсальную функцию - CreateObject(""), заменив ею все Create*** функции, тогда бы можно было бы сделать загрузку плагинов динамически. И все же, повторюсь, если при закрытии проги остаются заембеденные файлы, Это не есть здраво, и прежде всего надо боротся с причиной, а не следствием. А извращенные примеры типа сценариев по расписанию, должны использоватся как исключения, а не как правила.
Постараюсь объяснить для чего все это… В программе используется несколько вложенных mbd-файлов, вызываемых командой
Code
RunMBD("<Embedded>\10.dym","NEW_WINDOW,Page 2")
Каждый из которых использует тот же SmallPlugin, что и главное окно (а оно использует еще один плагин). И есть на выбор: 1) закрывать все окна разом; 2) каждое отдельно. Если второе – тогда нет проблем. После закрытия каждого окна вложенные в него файлы исчезают одновременно с закрытием. А вот если первое – тогда выполняется команда:
Тут есть один выход, ембедь в каждый вложенный проект SmallPlugin с разным именем, просто переименуй дллку, тогда каждая будет определяться как отдельная, и каждый проект будет удалять свою копию.
Quote (Dym)
Угадайте, сколько времени
Я так думаю, что часа три-четыре, но все же написал
Призабыл я одну из заповедей «Не убий!». Прости меня, Господи… Все покушался на ЕХЕ.
Благодаря совету авторитетного магистра ММВ (и не только) мой вопрос решен наилучшим для меня способом. Для всех заинтересованных специально сделаю пример и скоро представлю.
Говорила мне мама: «Учи, сынок, работу smallplugin с реестром, а я откладывал…»
Quote (Alex3A)
Я так думаю, что часа три-четыре,
Не-а, почти два...
Вот, стольник у меня в кармане… 100 сообщений, а не мани!