Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.07;
Скачать: CL | DM;

Вниз

BLOB в UDF   Найти похожие ветки 

 
GanibalLector ©   (2004-10-07 20:01) [0]

Цель: создать в ХП 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 .


 
Johnmen ©   (2004-10-07 20:54) [1]

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


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

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


 
GanibalLector ©   (2004-10-07 22:12) [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-08 01:57) [4]

Рабочая :

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-08 02:13) [5]

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



Страницы: 1 вся ветка

Текущий архив: 2004.11.07;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.04 c
1-1098700751
Strimer
2004-10-25 14:39
2004.11.07
Использование Project2 в Project1


4-1096671072
НовичОк
2004-10-02 02:51
2004.11.07
Заголовки кнопок в другом приложении


1-1098331929
TeNY
2004-10-21 08:12
2004.11.07
.CHM HELP


14-1098303857
KilkennyCat
2004-10-21 00:24
2004.11.07
Мож старо, но я только сейчас увидел про писающих программеров


1-1098393176
Garfunkel
2004-10-22 01:12
2004.11.07
Временное отключение мыши