Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сбой при вызове методов ZLib из DLL [D7, WinXP]


Alik ©   (2011-02-05 01:28:00) 

Добрый вечер всем!

Использую сжатие одномерного байтового массива методами ZLib.

При использовании данных процедур внутри основной программы все нормально, а при помещении их в ДЛЛ файл происходит сбой в памяти типа "Access violation".

В чем разница, может я что то делаю не так с указателями????

сжатие данных

 MemoryStream: TMemoryStream;
 RawDataLen, CompressedDataLen: Integer;
 RawData, CompressedData: array of Byte;
 P1, P2: Pointer;

try
        P1 := @RawData[0];
        CompressBuf(P1, RawDataLen, P2, CompressedDataLen);
        SetLength(CompressedData, CompressedDataLen);
        Move(P2^, CompressedData[0], CompressedDataLen);
        WriteBuffer(CompressedData[0], CompressedDataLen);

        WriteBuffer(RawDataLen, SizeOf(RawDataLen));
        WriteBuffer(CompressedDataLen, SizeOf(CompressedDataLen));
        SaveToFile(FileName);
        end;
 finally
   MemoryStream.Free;
   RawData := nil;
   CompressedData := nil;
   SetLength(S, 0);
 end;

и расжатие данных

           SetLength(CompressedData, CompressedDataLen);
           ReadBuffer(CompressedData[0], CompressedDataLen);
           P1 := @CompressedData[0];  
           DecompressBuf(P1, CompressedDataLen, RawDataLen, P2, i);
           SetLength(RawData, RawDataLen);
           Move(P2^, RawData[0], RawDataLen);
 finally
   MemoryStream.Free;
   RawData := nil;
 end;


sniknik   (2011-02-27 20:46:00) [1]

> А где выделение памяти для самой структуры?
там же где следование этому - "кто выделил память, ее и освобождает", и остальным правилам работы с/в dll без ShareMem. ну типа не передавать структуры, особенно с "......." внутри.
(ну раз отвечает на это, и показывает код "как он по этому сделал"... значит согласен следовать)


Юрий Зотов   (2011-02-27 19:41:00) [2]

А где выделение памяти для самой структуры?


Alik   (2011-02-26 18:01:00) [3]


> _Юрий   (05.02.11 10:16) [2]
> Обойтись без ShareMM можно при условии, что всегда тот,
> кто выделил память, ее и освобождает
> То есть если память выделяется в DLL, то и освобождаться
> она должна в DLL.


Сделал так:
Перменные P1, P2: Pointer, описал в основном юните программы и передаю  их в DLL в структуре данных. Там же (в основном юните) выделяю память    GetMem(P1, CompressedDataLen).

PStruct = ^TStruct;
TStruct = record
 .......
 P1, P2: Pointer;
 end;

procedure (Struct: PStruct);
.........
  with Struct^ do begin
           ReadBuffer(P1^, CompressedDataLen);
           DecompressBuf(P1, CompressedDataLen, RawDataLen, P2, i);
           SetLength(RawData, RawDataLen);
           Move(P2^, RawData[0], RawDataLen);
           if P1 <> nil then FreeMem(P1);
           if P2 <> nil then FreeMem(P2);
         ......
         end;

........
end;

Но результат тот же самый! Сбой происходит уже на ReadBuffer(P1^, CompressedDataLen)!

"Exception: EreadError in module xxx.dll at 00012623"


Кря-кря   (2011-02-08 14:32:00) [4]

Удалено модератором


Slym   (2011-02-08 13:52:00) [5]

Alik   (05.02.11 1:28)
Move(P2^, CompressedData[0], CompressedDataLen);
WriteBuffer(CompressedData[0], CompressedDataLen);

зачем мувить из буфера в буфер? WriteBuffer(P2^, CompressedDataLen);


KSergey   (2011-02-08 13:41:00) [6]

Удалено модератором


УРЯ   (2011-02-05 16:22:00) [7]

Удалено модератором


sniknik   (2011-02-05 12:59:00) [8]

> ShareMem прописано и в ДЛЛ и в программе ее вызывающей.
> Выделение памяти под массивы и освобождение памяти из под них производится внутри ДЛЛ!
т.е. перевожу - 'все делаю правильно, это "оно" глючит'. ...
а как же это -
> В чем разница, может я что то делаю не так с указателями????
или раз не с указателями, то правильно, и раз указали  не на них... то - ;это не я это "оно"'. так?

один вопрос, если сам знаешь в чем дело зачем спрашиваешь?

> предлагаешь тебе поверить без кода ?
уже давно предлагаю - без подтверждающего кода/вопросы в стиле "стук в подвале, в чем дело?" банить...


Игорь Шевченко   (2011-02-05 11:54:00) [9]


> ShareMem прописано и в ДЛЛ и в программе ее вызывающей.


предлагаешь тебе поверить без кода ?


Alik   (2011-02-05 11:10:00) [10]

ShareMem прописано и в ДЛЛ и в программе ее вызывающей.
Выделение памяти под массивы и освобождение памяти из под них производится внутри ДЛЛ!


_Юрий   (2011-02-05 10:16:00) [11]

Обойтись без ShareMM можно при условии, что всегда тот, кто выделил память, ее и освобождает
То есть если память выделяется в DLL, то и освобождаться она должна в DLL.


CrytoGen   (2011-02-05 07:53:00) [12]

ShareMM


Наверх

Титульная страница Поиск, карта сайта Написать письмо