Форум: "Начинающим";
Текущий архив: 2009.04.19;
Скачать: [xml.tar.bz2];
Внизпередача поинтеров в длл и обратно Найти похожие ветки
← →
Кузя (2009-03-03 13:42) [0]Всем доброго дня!
Имеется у меня такое:
приложение использует дллки загруженные с помощью 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? а то при попытке перезагрузить дллки тоже чото сбоит. Может еще какойнить фрихэндл нужен?
Спасибо.
← →
Сергей М. © (2009-03-03 13:49) [1]
> длл .. возращает обратно уже новый ptr и size
Они откуда, "новые", там взялись ? С луны свалились ?
А ведь именно в этом ключевой момент !
← →
Кузя (2009-03-03 13:56) [2]ну их длл создала
правельнее было написать
GetMem(ptr,size);
<копи нужное в ptr^>
OldPtr := ptr; OldSize := size;
EditProc(ptr,size) // это в длл
FreeMem(OldPtr,OldSize);
<использование того что прислала дллка> //тут все нормально
FreeMem(ptr, size) - а тут сбой
при том ДЛЛ еще не выгружена
← →
Сергей М. © (2009-03-03 13:56) [3]
> для выгрузки длл загруженной с помощью LoadLibrary достаночно
> вызова FreeLibrary?
LoadLibrary загружает модуль в АП тек.процесса, если он еще не загружен к этому моменту, и следом инкрементирует сч-к ссылок на этот модуль.
FreeLibrary декрементирует сч-к ссылок на модуль, и если после декремента сч-к равен нулю, выгружает модуль из АП тек.процесса
← →
Сергей М. © (2009-03-03 13:58) [4]
> ну их длл создала
Я спрашиваю, каким образом она их "создала" ?
← →
Кузя (2009-03-03 14:02) [5]TProcEditData = function(VAR ptr: pointer;VAR size: dword): boolean stdcall;
типа нам заранее известно что ДЛЛ вернет уже новый поинтер
--
как выделить\освободить память под поинтер используя только апи?
← →
Кузя (2009-03-03 14:04) [6]>>Я спрашиваю, каким образом она их "создала" ?
а этого я незнаю)) в том и проблема
← →
Сергей М. © (2009-03-03 14:07) [7]
> нам заранее известно что ДЛЛ вернет уже новый поинтер
Откуда известно ?
> используя .. апи
Чей "апи" ?
> этого я незнаю
Документацию к DLL почитать, прежде чем бросаться что-то "освобождать", не судьба ?
← →
clickmaker © (2009-03-03 14:11) [8]если экзе и dll собраны не с рантайм-пакетами и без uses ShareMem, то у них свои копии менеджера памяти. Отсюда и косяки.
Используй LocalAlloc / LocalFree
← →
Сергей М. © (2009-03-03 14:16) [9]
> clickmaker © (03.03.09 14:11) [8]
DLL к автору с луны свалилась, и он не знает как в ней проходили роды возвращенного указателя.
Да похоже что и авторский прототип TProcEditData - отсебячина ..
← →
Кузя (2009-03-03 14:17) [10]а сделать я хочу вот что))
имеется у меня прожка загружающая некий файл
а в дллках находятся функции которые редактируют куски этого файла.
типа плагины.
дллка поредактировала этот кусок и вернула поинтер.
прожка из него взяла всё что надо.
а память, то надо както освободить))
может в ддлку добавить еще какую-нибудь ClearMem, чтобы длл сама эту память освобождала? Или как лучше?
← →
Кузя (2009-03-03 14:20) [11]мне надо добится того чтобы длл можно было писать не только на дельфе
--
сорри за нубство))
--
>Используй LocalAlloc / LocalFree
попробую
← →
Сергей М. © (2009-03-03 14:21) [12]
> может в ддлку добавить еще какую-нибудь ClearMem
Так-с, подожди ..
Ты только что сказал "а этого я незнаю", из чего следует что DLL не твоей разработки и ты не в курсе что у нее творится внутри
Ну и куда же ты собрался при этом "добавлять еще какую-нибудь ClearMem" ?
← →
Сергей М. © (2009-03-03 14:23) [13]
> мне надо добится того чтобы длл можно было писать не только
> на дельфе
Разве кто-то запрещает и требует иное ?
Ну тогда тебе дорога одна - с жалобой в Страсбург)
← →
Кузя (2009-03-03 14:37) [14]Длл тож я писал) там память выделалсь тем же фриМемом..
> у них свои копии менеджера памяти
могли быть из-за этого косяки когда Длл перезагружал? там ведь память под ptr так и оставалась?
ну нуб я )) я нескрываю
--
как на ц выглядит описание
function(var ptr: pointer;var size: dword): boolean stdcall;
както так?
bool <имя>(DWORD* ptr, DWORD* size)
спасибо))
--
пойду я в Страсбург)
← →
Кузя (2009-03-03 14:38) [15]>Ты только что сказал "а этого я незнаю", из чего следует что DLL не твоей разработки и ты не в курсе что у нее творится внутри
я имел ввиду.. "я не должен знать что у неё творится внутри"))
← →
Сергей М. © (2009-03-03 14:42) [16]
> там память выделалсь тем же фриМемом
"фриМем" не занимается выделением памяти.
> нуб я )) я нескрываю
Похоже что тебя просто переполняет гордость за это)
← →
Кузя (2009-03-03 14:43) [17]смысле ГетМем
← →
Сергей М. © (2009-03-03 14:46) [18]
> имел ввиду.. "я не должен знать что у неё творится внутри"
Как это не должен ?!
Ты разработчик плагин-интерфейса и поэтому именно ты обязан документировать для будущих разработчиков будущих плагинов требования по использованию ими в ходе разработки тех или иных конкретных менеджеров памяти !
← →
Кузя (2009-03-03 15:09) [19]всё понял)
пусь теперь делают
ptr := pointer(GlobalAlloc(LMEM_FIXED,size));
у далять буду GlobalFree(ptr)
всё правельно?
← →
Кузя (2009-03-03 15:10) [20]всмысле GlobalAlloc(GMEM_FIXED,size); :D
← →
Сергей М. © (2009-03-03 15:19) [21]
> всё правельно?
С т.з. обеспечения требования единства менеджера памяти - да, правильно.
А вот эффективность такого решения (например, с т.з. производительности) можно поставить под сомнение.
← →
KSergey © (2009-03-03 15:52) [22]лучше сделать интерфейс дял DLL, который скажет сколько памяти распределить под буфер, прога его распределит - она же и почистит. Разумеется, dll обязана не гадить более размера буфера, который ей сообщили.
Так же есть смысле почитать про COM. Там таких проблем вообще не возникнет: все прозрачно передается/удалается в любой части, написание так же уже стандартизовано для любого языка.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.04.19;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.05 c