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

Вниз

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

 
Кузя   (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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.017 c
2-1235726156
Dennis I. Komarov
2009-02-27 12:15
2009.04.19
TField.Value to string


15-1234946651
Дмитрий Белькевич
2009-02-18 11:44
2009.04.19
Почему закрыли тему?


15-1235076565
Sergey Masloff
2009-02-19 23:49
2009.04.19
SOAP в Delphi. Что делать с зависонами


1-1210915024
LightRipple
2008-05-16 09:17
2009.04.19
Алгоритм создания "многоступенчатого" ключа.


3-1219535721
aaaaa
2008-08-24 03:55
2009.04.19
вывести записи строкой