![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
передача поинтеров в длл и обратно [D7, WinXP]
Кузя © (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 декрементирует сч-к ссылок на модуль, и если после декремента сч-к равен нулю, выгружает модуль из АП тек.процесса