Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

BLOB в UDF [IB6.x, FB]


GanibalLector ©   (2004-10-07 20:01:00) 

Цель: создать в ХП BLOB!!!
Соответственно,зашел на Ibase.ru и скачал бесплатные UDF.
Нашел там подходящие

declare external function f_StrBlob
 cstring(254),
 blob
 returns parameter 2
 entry_point 'StrBlob' module_name 'FreeUDFLib';

declare external function f_BlobAsPChar
 blob
 returns cstring(1024) /* free_it */ /* or 32000 or whatever... */
 entry_point 'BlobAsPChar' module_name 'FreeUDFLib';

В ХП пишу так : BL=f_StrBlob(f_BlobAsPchar(Bl)||некоторое поле)
все чудесно работает,до тех пор пока BL не переваливается за 255!!!
т.е. я не могу присвоить ф-цией f_StrBlob строку более 255 символов,а также преобразовать ф-цией f_BlobAsPchar строку более 255 символов.
Ну это понятно,т.к. там Pchar,а он не может быть более 255

Посмотрел исходник UDF и понял,что так дело не пойдет.
Т.е. нужна ИНАЯ функция,которая будет передавать Pchar и текущее содержимое PBlob,а на выходе должно быть PBlob=PBlob+Pchar.
(тем самым отпадет необходимость вызывать f_BlobAsPchar и ошибка исчезнет)

Вот,код  ф-ции.ПОМОГИТЕ переделать ее
function StrBlob(sz: PChar; Blob: PBlob): PBlob;cdecl;
begin
 {$ifdef FULDebug}
 WriteDebug('StrBlob() - Enter');
 {$endif}
 result := Blob;
 if (not Assigned(Blob)) or
    (not Assigned(Blob^.BlobHandle)) then exit;
 Blob^.PutSegment(Blob^.BlobHandle, sz, StrLen(sz));
 {$ifdef FULDebug}
 WriteDebug('StrBlob() - Exit');
 {$endif}
end;

З.Ы.Скажу честно,пытался(без никаких DLL...)но все время получаю access violation .


GanibalLector   (2004-10-08 02:13:00) [1]

В конце-концов забил на UDF и сделал выходным параметром varchar(15000) и наступило СЧАСТЬЕ.


GanibalLector   (2004-10-08 01:57:00) [2]

Рабочая :

function BlobCat( sz: PChar; Blob1,CatBlob: PBlob): PBlob; cdecl;
var
length: Integer;
bytesRead:ushort;
buffer: PChar;
begin
{$ifdef FULDebug}
WriteDebug('BlobCat() - Enter');
{$endif}

length := Max(Blob1^.TotalSize, StrLen(sz));
inc(length);
buffer := StrAlloc(length);
Blob1^.GetSegment(Blob1^.BlobHandle, buffer, length, bytesRead);
CatBlob^.PutSegment(CatBlob^.BlobHandle, buffer, bytesRead);
CatBlob^.PutSegment(CatBlob^.BlobHandle, sz, StrLen(sz));
StrDispose(buffer);
Result := CatBlob;

{$ifdef FULDebug}
WriteDebug('BlobCat() - Exit');
{$endif}

end;


Но вся соль в том,что если использовать так :
BL= BlobCat(некоторое поле,BL); то нифига не выйдет.А жаль...


GanibalLector   (2004-10-07 22:12:00) [3]

Вот,нашел UDF обьединения двух BLOB-ов

unction BlobCat(Blob1, Blob2, CatBlob: PBlob): PBlob; cdecl;
var
 length, bytesRead: Integer;
 buffer: PChar;
begin
 // will read blobs 1 at a time so allocate enough
 // memory to hold the larger of the 2 blobs
 length := Max(Blob1^.TotalSize, Blob2^.TotalSize);

 // change length to adjust for string terminator
 inc(length);

 // allocate memory for buffer
 // make sure isMultiThread is true for DLL
 buffer := StrAlloc(length);

 // get data for blob1
 Blob1^.GetSegment(Blob1^.BlobHandle, buffer, length, bytesRead);

 // store into CatBlob
 CatBlob^.PutSegment(CatBlob^.BlobHandle, buffer, bytesRead);

 // concat data for blob2
 Blob2^.GetSegment(Blob2^.BlobHandle, buffer, length, bytesRead);

 // store into CatBlob
 CatBlob^.PutSegment(CatBlob^.BlobHandle, buffer, bytesRead);

 // free memory for buffer
 StrDispose(buffer);

 Result := CatBlob;
end;


сделал по образцу так :


function BlobCat( sz: PChar; Blob1,CatBlob: PBlob): PBlob; cdecl;
var
 length: Integer;
 bytesRead:ushort;
 buffer: PChar;
begin
{$ifdef FULDebug}
 WriteDebug('StrBlob() - Enter');
{$endif}

 length := Max(Blob1^.TotalSize, StrLen(sz));
 inc(length);
 buffer := StrAlloc(length);
 Blob1^.GetSegment(Blob1^.BlobHandle, buffer, length, bytesRead);
 CatBlob^.PutSegment(CatBlob^.BlobHandle, buffer, bytesRead);
 CatBlob^.PutSegment(CatBlob^.BlobHandle, sz, StrLen(sz));
 StrDispose(buffer);
 Result := CatBlob;

{$ifdef FULDebug}
WriteDebug('StrBlob() - Exit');
{$endif}

end;

Не работает...где-то видать ошибся.Вернее работает,но выдает неверный BLOB


GanibalLector   (2004-10-07 21:00:00) [4]

А что, большую строку надо вернуть ?
По разному.Иногда очень большая,иногда маленькая


Johnmen   (2004-10-07 20:54:00) [5]

А что, большую строку надо вернуть ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо