![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Caduser |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 2.10.2006 Где: г. Хабаровск Репутация: 1 Всего: 1 |
На первый взгляд, задача простая:
В EXE есть процедура которая вызывается из DLL, результат работы процедуры передается как указатель на структуру: В EXE:
В DLL:
немогу понять почему только первое обращение к полям записи дает верный результат, а все последующие возвращают мусор??? Причем если в EXE в процедуре GetParam не использовать переменную FPar то эта аномалия пропадет и все будет ОК:
Это сообщение отредактировал(а) Caduser - 31.1.2007, 07:25 |
||||||
|
|||||||
| bazzzman |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 24.7.2006 Репутация: 0 Всего: 2 |
Чистое совпадение. Возможно на твоем компьютере это так на другом будет иначе. Вот это не верно в принципе:
Т.к. FPar - локальная переменная и будет уничтожена после выхода из функции. Отсюда имеем разрушение сторок (они все PChar) и мусор. В справке Delphi 7 этот пример описывается как "самая распространенная ошибка с использованием PChar". Я сам недавно напоролся на этот глюк Можно сделать var FPar: PParam; и GetMem. Но придется после каждого вызова следить за освобождением памяти. |
||||
|
|||||
| Caduser |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 2.10.2006 Где: г. Хабаровск Репутация: 1 Всего: 1 |
Теперь вопрос как это корректно решить?
Это сообщение отредактировал(а) Caduser - 31.1.2007, 09:25 |
||||
|
|||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
это не глюк, это вполне логичное поведение, имхо. в вызывающей программе. вообще считается корректным выделять и освобождать память в одном месте. т.е. перед вызовом функции из длл выделяешь память под буфер, передаешь сам буфер и его размер в функцию из длл, в ней происходит его заполнение и в случае, если буфера хватило - возвращаешь 0, иначе - остаточный размер, необходимый для получения отстатка информации... с одной стороны - посложнее реализовать, зато все красиво и корректно работать будет) -------------------- There are always someone smarter than you... |
|||
|
||||
| Caduser |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 2.10.2006 Где: г. Хабаровск Репутация: 1 Всего: 1 |
1. В "академических" примерах (см. вложение), в вызывающей программе память специально не выделяется, т.е. она уже выделяется при объявлении переменной:
2. зачем передавать размер если он известен - это размер TParam? Это сообщение отредактировал(а) Caduser - 31.1.2007, 10:22 Присоединённый файл ( Кол-во скачиваний: 4 )
PENNIES.rar 30,45 Kb |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
1. да, в том случае этого достаточно, там не передаются указатели на память.
2. тебе заранее неизвестно, какой объем памяти нужен под возвращаемые из длл строки. у тебя там PChar. под указатель(PChar) память выделилась (4 байта), а под саму строку - нет. вот тебе и AV. вариант: объяви строки в записи, как shortstring. минусы: длина строки не более 255 символов. память будет кушать всегда 255 байт, даже если строка короче. плюсы: не надо дополнительно выделть/освобождать память. -------------------- There are always someone smarter than you... |
|||
|
||||
| Caduser |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 2.10.2006 Где: г. Хабаровск Репутация: 1 Всего: 1 |
Сделал примерно так:
теперь все работает отлично. Большое спасибо, всем, за помощь! Это сообщение отредактировал(а) Caduser - 1.2.2007, 04:33 |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |