Einzelnen Beitrag anzeigen

Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 

Re: udf tut nicht was sie soll

  Alt 22. Jun 2006, 20:27
Hi,

Zitat aus meinen UDF-Tutorial:

Zitat:
In der nächsten Funktion sollen mit AnsiUpperCase die Zeichen in Großbuchstaben
umgewandelt werden, incl. der korrekten deutschen Umlaute. Eine Übergabe des
umgewandelten Strings als Result-Ergebnis der Funktion mit dem Typ PChar
funktioniert nicht. Hier muss jetzt etwas Aufwand betrieben werden, dass der von
der UDF verwendete Speicherbereich für den String auch den IB-Server erreicht und
von ihm korrekt freigegeben wird. Dazu dient eine Funktion in der ib_util.dll (ist im
BIN-Verzeichnis:
function ib_util_malloc(l: integer): pointer; cdecl; external
'ib_util.dll';
Diese Funktion generiert einen Zeiger auf den verwendeten Speicherbereich. Dieser
Zeiger wird anschließend an den IB-Server übergeben und der Inhalt ausgelesen.
Dann kann der Server den Speicherbereich freigeben. Die Funktion sieht dann so
aus:

Delphi-Quellcode:
function UpperChar(const p:PChar):PChar; cdecl;
{
DECLARE EXTERNAL FUNCTION UpperChar
CString(255)
RETURNS CString(255) FREE_IT
ENTRY_POINT 'UpperChar' MODULE_NAME 'MyUDF'
}

var s:string;
begin
s:=STRING(p);
s:=AnsiUpperCase(s);
Result := ib_util_malloc(Length(s)+1);
StrPCopy(Result, s);
end;
Der eingehende PChar wird in einen String umgewandelt und dieser dann durch die
Funktion AnsiUpperCase gejagt. Nun kommts: Die Stringlänge wird an die Funktion
ib_util_malloc übergeben, der den Speicherbereich alloziiert. Die Stringlänge wird
dabei um eins erhöht (weil er als Nullterminierter String zurückgegeben wird!).
Anschließend wird der String mit StrPCopy in den dafür vorbereiteten
Speicherbereich kopiert. In der Deklaration ist diesesmal für den Rückgabewert „BY
REFERENCE“ und „FREE_IT“ angegeben, damit der Server den Speicherbereich
wieder freigibt.
Das kann vielleicht auch dazu führen, dass die Funktion in Firebird nicht das macht was sie soll.

Lemmy
  Mit Zitat antworten Zitat