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

Вниз

Сбой при вызове методов ZLib из DLL   Найти похожие ветки 

 
Alik   (2011-02-05 01:28) [0]

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

Использую сжатие одномерного байтового массива методами 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;


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

ShareMM


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

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


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

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


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


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


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


 
sniknik ©   (2011-02-05 12:59) [5]

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

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

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


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

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


 
KSergey ©   (2011-02-08 13:41) [7]

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


 
Slym ©   (2011-02-08 13:52) [8]

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

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


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

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


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


> _Юрий   (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-27 19:41) [11]

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


 
sniknik ©   (2011-02-27 20:46) [12]

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



Страницы: 1 вся ветка

Текущий архив: 2011.06.05;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.008 c
2-1298533195
nastena2428
2011-02-24 10:39
2011.06.05
Связь таблиц в БД


2-1298537474
FIL-23
2011-02-24 11:51
2011.06.05
растягиване компонент пропорционально форме


2-1298927662
Sashka
2011-03-01 00:14
2011.06.05
Работа с AsyncCall


2-1298528519
Trekker
2011-02-24 09:21
2011.06.05
Открытие страницы IE в полноэкранном режиме в текущем окне


2-1298609942
maxefficiently
2011-02-25 07:59
2011.06.05
RAR Component