![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сбой при вызове методов 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