Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.054 c
2-1236076969
Кузя
2009-03-03 13:42
2009.04.19
передача поинтеров в длл и обратно


2-1235994425
Neket
2009-03-02 14:47
2009.04.19
Проблема с задание Range в Диаграмах Excel


15-1235102906
freeee
2009-02-20 07:08
2009.04.19
посоветуйте литературу


1-1210074441
9899100
2008-05-06 15:47
2009.04.19
richedit


2-1236018375
DanilPo
2009-03-02 21:26
2009.04.19
Проблема с RadioButton





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский