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

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

передача поинтеров в длл и обратно [D7, WinXP]


Страницы:   1 2

Кузя ©   (2009-03-03 13:42:00) 

Всем доброго дня!

Имеется у меня такое:
приложение использует дллки загруженные с помощью LoadLibrary

в этих дллках имеютя функции вида
TProcEditData = function(var ptr: pointer;var size: dword): boolean stdcall;

прога передаёт в длл ptr на некоторую память размера сайз .. ну это понятно

длл использует эту дату и возращает обратно уже новый ptr и size


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

потомучто


..
GetMem(ptr,size);
<копи нужное в ptr^>
OldPtr := ptr; OldSize := size;
EditProc(ptr,size) // это в длл
FreeMem(OldPtr,OldSize);
..

вот до сюда всё работает нормально
но когда пытаюсь сделать FreeMem(ptr, size) (ptr и size из длл получено) , что-то начинает сбоить. При том ДЛЛ вроде про этот поитер забывает сразу.. всмысле потом не использует нигде

Научите\обьясните))
--
и еще для выгрузки длл загруженной с помощью LoadLibrary достаночно вызова FreeLibrary? а то при попытке перезагрузить дллки тоже чото сбоит. Может еще какойнить фрихэндл нужен?

Спасибо.


KSergey   (2009-03-03 15:52:00) [1]

лучше сделать интерфейс дял DLL, который скажет сколько памяти распределить под буфер, прога его распределит - она же и почистит. Разумеется, dll обязана не гадить более размера буфера, который ей сообщили.
Так же есть смысле почитать про COM. Там таких проблем вообще не возникнет: все прозрачно передается/удалается в любой части, написание так же уже стандартизовано для любого языка.


Сергей М.   (2009-03-03 15:19:00) [2]


> всё правельно?


С т.з. обеспечения требования единства менеджера памяти - да, правильно.
А вот эффективностьтакого решения (например, с т.з. производительности) можно поставить под сомнение.


Кузя   (2009-03-03 15:10:00) [3]

всмысле GlobalAlloc(GMEM_FIXED,size); :D


Кузя   (2009-03-03 15:09:00) [4]

всё понял)

пусь теперь делают
ptr := pointer(GlobalAlloc(LMEM_FIXED,size));

у далять буду GlobalFree(ptr)

всё правельно?


Сергей М.   (2009-03-03 14:46:00) [5]


> имел ввиду.. "я не должен знать что у неё творится внутри"


Как это не должен ?!

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


Кузя   (2009-03-03 14:43:00) [6]

смысле ГетМем


Сергей М.   (2009-03-03 14:42:00) [7]


> там память выделалсь тем же фриМемом


"фриМем" не занимается выделением памяти.


> нуб я )) я нескрываю


Похоже что тебя просто переполняет гордость за это)


Кузя   (2009-03-03 14:38:00) [8]

>Ты только что сказал "а этого я незнаю", из чего следует что DLL не твоей разработки и ты не в курсе что у нее творится внутри

я имел ввиду.. "я не должен знать что у неё творится внутри"))


Кузя   (2009-03-03 14:37:00) [9]

Длл тож я писал) там память выделалсь тем же фриМемом..
> у них свои копии менеджера памяти
могли быть из-за этого косяки когда Длл перезагружал? там ведь память под ptr так и оставалась?

ну нуб я )) я нескрываю
--
как на ц выглядит описание
function(var ptr: pointer;var size: dword): boolean stdcall;

както так?
bool <имя>(DWORD* ptr, DWORD* size)

спасибо))
--
пойду я в Страсбург)


Сергей М.   (2009-03-03 14:23:00) [10]


> мне надо добится того чтобы длл можно было писать не только
> на дельфе


Разве кто-то запрещает и требует иное ?
Ну тогда тебе дорога одна - с жалобой в Страсбург)


Сергей М.   (2009-03-03 14:21:00) [11]


> может в ддлку добавить еще какую-нибудь ClearMem


Так-с, подожди ..

Ты только что сказал "а этого я незнаю", из чего следует что DLL не твоей разработки и ты не в курсе что у нее творится внутри

Ну и куда же ты собрался при этом "добавлять еще какую-нибудь ClearMem" ?


Кузя   (2009-03-03 14:20:00) [12]

мне надо добится того чтобы длл можно было писать не только на дельфе
--
сорри за нубство))
--
>Используй LocalAlloc / LocalFree
попробую


Кузя   (2009-03-03 14:17:00) [13]

а сделать я хочу вот что))

имеется у меня прожка загружающая некий файл
а в дллках находятся функции которые редактируют куски этого файла.
типа плагины.
дллка поредактировала этот кусок и вернула поинтер.
прожка из него взяла всё что надо.

а память, то надо както освободить))
может в ддлку добавить еще какую-нибудь ClearMem, чтобы длл сама эту память освобождала? Или как лучше?


Сергей М.   (2009-03-03 14:16:00) [14]


> clickmaker ©   (03.03.09 14:11) [8]


DLL к автору с луны свалилась, и он не знает как в ней проходили роды возвращенного указателя.

Да похоже что и авторский прототип TProcEditData - отсебячина ..


clickmaker   (2009-03-03 14:11:00) [15]

если экзе и dll собраны не с рантайм-пакетами и без uses ShareMem, то у них свои копии менеджера памяти. Отсюда и косяки.
Используй LocalAlloc / LocalFree


Сергей М.   (2009-03-03 14:07:00) [16]


> нам заранее известно что ДЛЛ вернет уже новый поинтер


Откудаизвестно ?


> используя .. апи


Чей "апи" ?


> этого я незнаю


Документацию к DLL почитать, прежде чем бросаться что-то "освобождать",  не судьба ?


Кузя   (2009-03-03 14:04:00) [17]

>>Я спрашиваю, каким образом она их "создала" ?

а этого я незнаю)) в том и проблема


Кузя   (2009-03-03 14:02:00) [18]

TProcEditData = function( VARptr: pointer; VARsize: dword): boolean stdcall;

типа нам заранее известно что ДЛЛ вернет уже новый поинтер
--
как выделить\освободить память под поинтер используя только апи?


Сергей М.   (2009-03-03 13:58:00) [19]


> ну их длл создала


Я спрашиваю, каким образомона их "создала" ?


Сергей М.   (2009-03-03 13:56:00) [20]


> для выгрузки длл загруженной с помощью LoadLibrary достаночно
> вызова FreeLibrary?


LoadLibrary загружает модуль в АП тек.процесса, если он еще не загружен к этому моменту, и следом инкрементирует сч-к ссылок на этот модуль.

FreeLibrary декрементирует сч-к ссылок на модуль, и если после декремента сч-к равен нулю, выгружает модуль из АП тек.процесса


Страницы:   1 2

Наверх

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