Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

поддержка плагинов в программе


Страницы:   1 2

Ruzzz ©   (2009-01-11 14:04:00) 

как предоставить возможность плагину изменять передаваемую ему строку? Все вроде просто но как быть с освобождением памяти?

Ну допустим толькл для чтения передать плагину PChar или пару (Pointer, Size) это не проблема, так как плагин ее не именяет то и освободидь строку сможет программа после того как плагин отработает.

А как быть с ситуацией когда плагин должен менять строку? Если плагин выделить некую память для измененной строки и передасть назад программе PChar, программа может сама освободить эту память? Не будет каких-либо утечек памяти?

И еще вопрос, если это будет не плагин а отдельный поток и таких много?

Заранее спасибо!


  (2009-01-11 22:21:00) [1]

Удалено модератором


Медвежонок Пятачок   (2009-01-11 20:53:00) [2]

либо вы мне мозги пудрите, скажите ведь не зря при создании DLL-проекта в delphi, в комментариях кое-какой текст написан? :)

Конечно не зря. А что? У меня где-то с этим коментарием есть противоречие?


Сергей М.   (2009-01-11 20:10:00) [3]


> Ruzzz ©   (11.01.09 18:48) [17]


Не лучший вариант, но можно и так.
Вот тем, кстати, и привлекательна OLE/COM, что при ее использовании единый менедлер подразумевается


Ruzzz   (2009-01-11 18:56:00) [4]

Медвежонок Пятачок, я прошу прошения, вы помогаете мне, отвечаете в этой ветке, но либо я плохо изяснился, либо вы мне мозги пудрите, скажите ведь не зря при создании DLL-проекта в delphi, в комментариях кое-какой текст написан? :)


Ruzzz   (2009-01-11 18:48:00) [5]

менеджера памяти, правильно ли я понимаю что это? :)

- Использует стандартные функции ОС для выделения и освобождения (ну эт ясно)
- Для всех типов данных которые по сути являются динамическими массивами все выполняется прозрачно (в delphi это например string, array of ...)
- код менеджера реализован в библиотеке среды (в Delphi в system.pas)

Медвежонок Пятачок,

я знаю что Убивать string - забота менеджера памяти. но у меня не обязательно это будет строка, и второе, плагин может быть написан в другой среде, языке, да и мне кажется что в плагине будет реализован другой менеджер памяти, даже если они компилируются в одной среде.

Сергей М. по поводу


> > врядли будет иметь место
> Это почему же ?


правильно ли я делаю вывод? предоставить для плагина экспортируемую хостом функцию для выделения памяти, чтобы обеспечить работу одного экземпляра менеджера?


Медвежонок Пятачок   (2009-01-11 18:16:00) [6]

после того как плагин создаст буфер и вернет результат он уже не получит управление

А зачем ему что-то получать, если буфер в нем представлен типом string?

Убивать его - забота не твоя а менеджера памяти.
О чем я уже раз надцать сказал.


Ruzzz   (2009-01-11 17:58:00) [7]

Медвежонок Пятачок,
создаст плагин, это не вызывающия сторона, после того как плагин создаст буфер и вернет результат он уже не получит управление, покрайней мере этого хотелось бы

ладно всем спасибо, будем думать и искать


Медвежонок Пятачок   (2009-01-11 17:17:00) [8]

я ж говорю, передавать PChar в обе стороны.
На принимающей создавать копию.
Все.
И вызывающая чистит все, что насоздавала.


Ruzzz   (2009-01-11 16:55:00) [9]

KSergey, ограничивать размером нельзя, COM мне кажется излишним :(,

Медвежонок Пятачок


> Получил PChar из хоста.
> Сделал локальную копию string, все.
> Остальное уже не твоя забота.


я в этом и не видел проблемы, меня интересует такой момент: отработала функция плагина и возратила допустим строку хосту, что далее, уже в хосте, будет с памятью, которую выделил плагин?


DFT   (2009-01-11 16:49:00) [10]


> KSergey ©   (11.01.09 15:46) [11]

полностью поддерживаю.
Решение более универсальное и изящное. В библиотеке создаем нужный нам класс реализующий определенный интерфейс. И при работе с интерфейсом имеем надежный контроль памяти благораря подсчету ссылок


KSergey   (2009-01-11 15:46:00) [11]

Если возможно - можно просто оговорить, что строка ограничена таким-то размером (выбрать разумное и достаточное число). Тоогда хост-приложение просто должно выделить соотв. буфер, в который плагин может накласть что угодно в пределах оговоренного буфера.
Плохо, что нельзя проконтроллировать это со стороны хост-приложения.

но есть же COM, там все это возможно, да и вообще проблемы с буферами и очисткой не возникнет, там все продумано.


Медвежонок Пятачок   (2009-01-11 15:31:00) [12]

А как быть с ситуацией когда плагин должен менять строку?

Ты еще скажи, что в плагине будешь это делать непосредственно с помощью функций для нултерминатейд строк.

/* если б то было правдой, то самого вопроса бы не было, так как квалификация не позволила бы задавать детские вопросы */


Сергей М.   (2009-01-11 15:26:00) [13]


> врядли будет иметь место


Это почему же ?

Если ты разработчик хост-приложения, то для разработчиков плагинов к нему ты вправе публиковать соотв.требования.. И разработчики, если они хотят чтобы их плагины правильно взаимодействовали с твоим хост-приложениям, обязаны придерживаться этих требований.


Медвежонок Пятачок   (2009-01-11 15:24:00) [14]

не совсем понятно :( как же плагин сможет очистит память если я уже не планирую его тревожить после того как он отработал

Получил PChar из хоста.
Сделал локальную копию string, все.
Остальное уже не твоя забота.


Ega23   (2009-01-11 15:21:00) [15]


> Ну вот в этом то и проблема, что ситуация "один и тот же
> экз-р одного и того же менеджера памяти" врядли будет иметь
> место!


procedure Foo(var Data; var DataSize : Integer);


Ruzzz   (2009-01-11 15:19:00) [16]

Сергей М.

Ну вот в этом то и проблема, что ситуация "один и тот же экз-р одного и того же менеджера памяти" врядли будет иметь место! :(

Как быть в таком случае?


Ega23   (2009-01-11 15:15:00) [17]

procedure ChangeString( varaStr : PANSIChar); ?


Сергей М.   (2009-01-11 15:13:00) [18]


> программа может сама освободить эту память? Не будет каких-
> либо утечек памяти?


Если хост-приложение и плагин используют один и тот же экз-р одного и того же менеджера памяти, то никаких проблем в этом нет.


Ruzzz   (2009-01-11 15:05:00) [19]

плагин это по сути ддл с функцией на экспорт, которую вызывает основная программа, по сути получается что эта функция должна возвращать измененную строку, как бы это сделать более изящно?


> копия строки в плагине и каждый сам чистит что насоздавал.

не совсем понятно :( как же плагин сможет очистит память если я уже не планирую его тревожить после того как он отработал


> экспортируй функцию из плагина, которая будет освобождать
> память

а может есть какое "красивое" решение?


Медвежонок Пятачок   (2009-01-11 14:21:00) [20]

копия строки в плагине и каждый сам чистит что насоздавал.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо