|
|
|
Помогите с указателями из delphi в С++builder
|
|||
|---|---|---|---|
|
#18+
Есть компонент 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 знаю плохо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2006, 10:44 |
|
||
|
Помогите с указателями из delphi в С++builder
|
|||
|---|---|---|---|
|
#18+
Почти, ничего не понял, что написано выше, но. Исходя из: Код: plaintext Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2006, 10:07 |
|
||
|
Помогите с указателями из delphi в С++builder
|
|||
|---|---|---|---|
|
#18+
так,вот необходимо как-то привести этот буфер к нормальному виду изменить в нём данные и его размер. Кстати 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); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2006, 21:10 |
|
||
|
Помогите с указателями из delphi в С++builder
|
|||
|---|---|---|---|
|
#18+
вот так я делал: 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; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2006, 08:19 |
|
||
|
|

start [/forum/topic.php?fid=57&tid=2029909]: |
0ms |
get settings: |
11ms |
get forum list: |
21ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
174ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
| others: | 251ms |
| total: | 540ms |

| 0 / 0 |
