Форум: "Начинающим";
Текущий архив: 2009.02.22;
Скачать: [xml.tar.bz2];
Внизподдержка плагинов в программе Найти похожие ветки
← →
Ruzzz © (2009-01-11 14:04) [0]как предоставить возможность плагину изменять передаваемую ему строку? Все вроде просто но как быть с освобождением памяти?
Ну допустим толькл для чтения передать плагину PChar или пару (Pointer, Size) это не проблема, так как плагин ее не именяет то и освободидь строку сможет программа после того как плагин отработает.
А как быть с ситуацией когда плагин должен менять строку? Если плагин выделить некую память для измененной строки и передасть назад программе PChar, программа может сама освободить эту память? Не будет каких-либо утечек памяти?
И еще вопрос, если это будет не плагин а отдельный поток и таких много?
Заранее спасибо!
← →
clickmaker © (2009-01-11 14:11) [1]экспортируй функцию из плагина, которая будет освобождать память
← →
Медвежонок Пятачок © (2009-01-11 14:21) [2]копия строки в плагине и каждый сам чистит что насоздавал.
← →
Ruzzz © (2009-01-11 15:05) [3]плагин это по сути ддл с функцией на экспорт, которую вызывает основная программа, по сути получается что эта функция должна возвращать измененную строку, как бы это сделать более изящно?
> копия строки в плагине и каждый сам чистит что насоздавал.
не совсем понятно :( как же плагин сможет очистит память если я уже не планирую его тревожить после того как он отработал
> экспортируй функцию из плагина, которая будет освобождать
> память
а может есть какое "красивое" решение?
← →
Сергей М. © (2009-01-11 15:13) [4]
> программа может сама освободить эту память? Не будет каких-
> либо утечек памяти?
Если хост-приложение и плагин используют один и тот же экз-р одного и того же менеджера памяти, то никаких проблем в этом нет.
← →
Ega23 © (2009-01-11 15:15) [5]
procedure ChangeString(var aStr : PANSIChar);
?
← →
Ruzzz © (2009-01-11 15:19) [6]Сергей М.
Ну вот в этом то и проблема, что ситуация "один и тот же экз-р одного и того же менеджера памяти" врядли будет иметь место! :(
Как быть в таком случае?
← →
Ega23 © (2009-01-11 15:21) [7]
> Ну вот в этом то и проблема, что ситуация "один и тот же
> экз-р одного и того же менеджера памяти" врядли будет иметь
> место!procedure Foo(var Data; var DataSize : Integer);
← →
Медвежонок Пятачок © (2009-01-11 15:24) [8]не совсем понятно :( как же плагин сможет очистит память если я уже не планирую его тревожить после того как он отработал
Получил PChar из хоста.
Сделал локальную копию string, все.
Остальное уже не твоя забота.
← →
Сергей М. © (2009-01-11 15:26) [9]
> врядли будет иметь место
Это почему же ?
Если ты разработчик хост-приложения, то для разработчиков плагинов к нему ты вправе публиковать соотв.требования.. И разработчики, если они хотят чтобы их плагины правильно взаимодействовали с твоим хост-приложениям, обязаны придерживаться этих требований.
← →
Медвежонок Пятачок © (2009-01-11 15:31) [10]А как быть с ситуацией когда плагин должен менять строку?
Ты еще скажи, что в плагине будешь это делать непосредственно с помощью функций для нултерминатейд строк.
/* если б то было правдой, то самого вопроса бы не было, так как квалификация не позволила бы задавать детские вопросы */
← →
KSergey © (2009-01-11 15:46) [11]Если возможно - можно просто оговорить, что строка ограничена таким-то размером (выбрать разумное и достаточное число). Тоогда хост-приложение просто должно выделить соотв. буфер, в который плагин может накласть что угодно в пределах оговоренного буфера.
Плохо, что нельзя проконтроллировать это со стороны хост-приложения.
но есть же COM, там все это возможно, да и вообще проблемы с буферами и очисткой не возникнет, там все продумано.
← →
DFT (2009-01-11 16:49) [12]
> KSergey © (11.01.09 15:46) [11]
полностью поддерживаю.
Решение более универсальное и изящное. В библиотеке создаем нужный нам класс реализующий определенный интерфейс. И при работе с интерфейсом имеем надежный контроль памяти благораря подсчету ссылок
← →
Ruzzz © (2009-01-11 16:55) [13]KSergey, ограничивать размером нельзя, COM мне кажется излишним :(,
Медвежонок Пятачок
> Получил PChar из хоста.
> Сделал локальную копию string, все.
> Остальное уже не твоя забота.
я в этом и не видел проблемы, меня интересует такой момент: отработала функция плагина и возратила допустим строку хосту, что далее, уже в хосте, будет с памятью, которую выделил плагин?
← →
Медвежонок Пятачок © (2009-01-11 17:17) [14]я ж говорю, передавать PChar в обе стороны.
На принимающей создавать копию.
Все.
И вызывающая чистит все, что насоздавала.
← →
Ruzzz © (2009-01-11 17:58) [15]Медвежонок Пятачок,
создаст плагин, это не вызывающия сторона, после того как плагин создаст буфер и вернет результат он уже не получит управление, покрайней мере этого хотелось бы
ладно всем спасибо, будем думать и искать
← →
Медвежонок Пятачок © (2009-01-11 18:16) [16]после того как плагин создаст буфер и вернет результат он уже не получит управление
А зачем ему что-то получать, если буфер в нем представлен типом string?
Убивать его - забота не твоя а менеджера памяти.
О чем я уже раз надцать сказал.
← →
Ruzzz © (2009-01-11 18:48) [17]менеджера памяти, правильно ли я понимаю что это? :)
- Использует стандартные функции ОС для выделения и освобождения (ну эт ясно)
- Для всех типов данных которые по сути являются динамическими массивами все выполняется прозрачно (в delphi это например string, array of ...)
- код менеджера реализован в библиотеке среды (в Delphi в system.pas)
Медвежонок Пятачок,
я знаю что Убивать string - забота менеджера памяти. но у меня не обязательно это будет строка, и второе, плагин может быть написан в другой среде, языке, да и мне кажется что в плагине будет реализован другой менеджер памяти, даже если они компилируются в одной среде.
Сергей М. по поводу
> > врядли будет иметь место
> Это почему же ?
правильно ли я делаю вывод? предоставить для плагина экспортируемую хостом функцию для выделения памяти, чтобы обеспечить работу одного экземпляра менеджера?
← →
Ruzzz © (2009-01-11 18:56) [18]Медвежонок Пятачок, я прошу прошения, вы помогаете мне, отвечаете в этой ветке, но либо я плохо изяснился, либо вы мне мозги пудрите, скажите ведь не зря при создании DLL-проекта в delphi, в комментариях кое-какой текст написан? :)
← →
Сергей М. © (2009-01-11 20:10) [19]
> Ruzzz © (11.01.09 18:48) [17]
Не лучший вариант, но можно и так.
Вот тем, кстати, и привлекательна OLE/COM, что при ее использовании единый менедлер подразумевается
← →
Медвежонок Пятачок © (2009-01-11 20:53) [20]либо вы мне мозги пудрите, скажите ведь не зря при создании DLL-проекта в delphi, в комментариях кое-какой текст написан? :)
Конечно не зря. А что? У меня где-то с этим коментарием есть противоречие?
← →
имя (2009-01-11 22:21) [21]Удалено модератором
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.02.22;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.063 c