powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите с указателями из delphi в С++builder
4 сообщений из 4, страница 1 из 1
Помогите с указателями из delphi в С++builder
    #34172210
Алексей3696
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть компонент FIBPlus, так вот там можно затавать функции фильтров для блоб полей
вот тип функции фильтра.
typedef void __fastcall (*TIBBlobFilterProc)(void *BlobBuffer, int &BlobSize);
вот так я она регистрируется:
pFIBDatabase1->RegisterBlobFilter(-15,(TIBBlobFilterProc*)PackBuffer,(TIBBlobFilterProc*)UnpackBuffer );
Вопрос такой Как сделать realloc ,буфера данных SourceBuf?

void __fastcall UnpackBuffer(void *SourceBuf,int &SourceLen)
{
unsigned char *m1= *(unsigned char **)SourceBuf;
// Как сделать realloc ,буфера данных SourceBuf?
return;

}
тут передаётся указатель на указатель буфера(я так понял посмотрев в исходники FIB). То есть,по моему, в переводе с паскаля произошло следующее:
unsignrd char * buff; // PChar в паскале
...
UnpackBuffer(&buff,100);
так что изменить буфер вполне можно,только вот как замутить не знаю... Стыдно конечно,но не получается у меня :-)
P.S. delphi знаю плохо
...
Рейтинг: 0 / 0
Помогите с указателями из delphi в С++builder
    #34173771
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почти, ничего не понял, что написано выше, но.

Исходя из:

Код: plaintext
UnpackBuffer(&buff, 100 );
так
Код: plaintext
1.
(*buf)=realloc(*buf, <нужно количество байт>);
...
Рейтинг: 0 / 0
Помогите с указателями из delphi в С++builder
    #34176037
Алексей3696
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так,вот необходимо как-то привести этот буфер к нормальному виду изменить в нём данные и его размер. Кстати realloc не поможет, менеджер памяти другой у дельфей SysReallocMem вроде как-то юзать надо.

вот часть заголовка на C++
typedef void __fastcall (*TIBBlobFilterProc)(void *BlobBuffer, int &BlobSize);
typedef TIBBlobFilterProc *PIBBlobFilterProc;
.....
//описание класса класса
void __fastcall IBFilterBuffer(char * &BlobBuffer, int &BlobSize, int BlobSubType, bool ForEncode);
....
далее обявляю свои функции и сохраняю указатели на свои функции где-то в классе они сохраняются методом:
void __fastcall RegisterBlobFilter(int BlobSubType, PIBBlobFilterProc EncodeProc, PIBBlobFilterProc DecodeProc);

Вот функция паскаля которая вызывает мою
procedure TIBBlobFilters.IBFilterBuffer(var BlobBuffer: PChar;
var BlobSize: Integer; BlobSubType: integer; ForEncode: boolean);
var
pProc:PIBBlobFilterProc;
IBBlobFilterProc:TIBBlobFilterProc;
//srcStream,dstStream:TStream;
begin
pProc := nil;
//srcStream:=nil;
//dstStream:=nil;
if (BlobSubType<0) and (BlobSize>0) and (BlobBuffer<>nil) then
pProc:=GetFilterProc(BlobSubType,ForEncode);
if assigned(pProc) then
begin
@IBBlobFilterProc:=pProc;
IBBlobFilterProc(BlobBuffer,BlobSize);
end;
end;
и
PIBBlobFilterProc = ^TIBBlobFilterProc;
TIBBlobFilterProc = procedure (var BlobBuffer; var BlobSize:longint);
...
Рейтинг: 0 / 0
Помогите с указателями из delphi в С++builder
    #34176413
Алексей3696
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот так я делал:

void __fastcall UnpackBuffer(void *SourceBuf,int &SourceLen)
{
SourceLen = 200;
unsigned char **m1= (unsigned char **)SourceBuf;
*m1 =(unsigned char *)SysReallocMem( *m1,SourceBuf );
memset((*m1),'+',(unsigned int)SourceLen);
return;
}
Вот так буфер становится больше(или меньше) и всё вроде бы работает, но вот при освобождении этого буфера где-то в библиотеке происходит ошибка
Bad parameter in process: Project1.exe(3236) - C:\FIBPlus\BCB2006\sources\FIBMiscellaneous.pas#551
A bad memory block (0x1378CE0) has been passed to the function.
0x00F5F058 Call to SysFreeMem(0x00435F44)
0x51F23C2C
0x00434693 - C:\FIBPlus\BCB2006\sources\FIBMiscellaneous.pas#551
0x51F265C7
0x0042CEB3 - C:\FIBPlus\BCB2006\sources\FIBDataSet.pas#8783
0x5233F16C
0x5233F035

а вот так делается освобождение буфера в библиотеке:
// деструктор
destructor TFIBBlobStream.Destroy;
begin
CloseBlob;
SetSize(0);// вызывается эта функция
ReallocMem(FOldBuffer, 0);
........
end;

procedure TFIBBlobStream.SetSize(NewSize: Long);
var
begin
if (NewSize <> FBlobSize) then
begin
ReallocMem(FBuffer, NewSize);// ВОТ ТУТ ВЫВАЛИВАЕТСЯ EXCEPTION
FBlobSize := NewSize;
// Guarantee that FBuffer is nil, if size is 0.
if NewSize = 0 then
FBuffer := nil;
end;
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите с указателями из delphi в С++builder
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]