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.