Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.02.22;
Скачать: CL | DM;

Вниз

поддержка плагинов в программе   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.013 c
15-1230072261
Мазут Береговой
2008-12-24 01:44
2009.02.22
Нелинейные функции


6-1198794565
asker
2007-12-28 01:29
2009.02.22
Ответ для браузера


2-1231875392
smartleds
2009-01-13 22:36
2009.02.22
Вопрос по созданию формы


3-1215423344
flaxe
2008-07-07 13:35
2009.02.22
DBF Сеть


15-1229929140
Slider007
2008-12-22 09:59
2009.02.22
С днем рождения ! 22 декабря 2008 понедельник