1) zStream,у меня нет в Builder,поэтому использовал ZLib,думаю что в этом нет ничего страшного.
2) Сделал как в статье,но то что в Delphi ReallocMem(Buffer, BufSize) в С++ это Buffer = realloc(Buffer,BufSize) - НЕ РАБОТАЕТ!!! - Access violation... как так?
Совсем запарился,может ошибка где,то в FIBPlus? Если нет то подсажите как разрешить,я уже начинаю подeмывать о техподдержке FIBPlus. Вот листинг процедуры:
Код: Выделить всё
void __fastcall PackBuffer(void *SourceBuf,int &SourceLen)
{
try
{
unsigned long DestLen=SourceLen*1.1+12;
Bytef * DstBuf=NULL;
DstBuf =(Bytef *) realloc(DstBuf,DestLen);
if (compress2 ( DstBuf, &DestLen,
(Bytef *)SourceBuf,SourceLen,
9)
!=_OK
)return;
// число (длина неупакованного буфера) преобразованное в строку
AnsiString SrcLenStr = IntToStr(SourceLen);
// количество символов строки
int SybolsLen =SrcLenStr.Length();
/* размер упакованног буфера c дописанным значением исходного значения*/
SourceLen =DestLen+SybolsLen+1;
SourceBuf = realloc(SourceBuf,SourceLen);/* Вот тут ACCESS VIOLATION и выходит!!!!*/
SourceBuf =(Bytef*) memcpy(SourceBuf, DstBuf,DestLen);
free(DstBuf);
((Bytef *)SourceBuf)[DestLen] = '#';// разделитель <блок данных>#<исходный размер>
//дописываем длину
int cntr=1;
for (int i= SourceLen-1;i>DestLen;i--)
((Bytef *)SourceBuf)[i]=(Bytef)SrcLenStr[cntr++];
}
catch (Exception &E)
{
ShowMessage("PackBuffer error\n"+E.Message);
Form1->pFIBTransaction1->Rollback();
}
}