Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.005 c
15-1230272529
{RASkov}
2008-12-26 09:22
2009.02.22
Разрешение принтера


3-1215427949
REA
2008-07-07 14:52
2009.02.22
Вложенный запрос с 2мя параметрами


2-1231421470
SAVA
2009-01-08 16:31
2009.02.22
tdatetime


2-1231746104
alex_3
2009-01-12 10:41
2009.02.22
прокрутка в richedit


15-1230106923
igan
2008-12-24 11:22
2009.02.22
Формат хранения времени в файле





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский