Форум: "Начинающим";
Текущий архив: 2011.06.05;
Скачать: [xml.tar.bz2];
ВнизСбой при вызове методов 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.003 c