AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi udf tut nicht was sie soll
Thema durchsuchen
Ansicht
Themen-Optionen

udf tut nicht was sie soll

Ein Thema von sancho1980 · begonnen am 22. Jun 2006 · letzter Beitrag vom 22. Jun 2006
Antwort Antwort
Lemmy
Online

Registriert seit: 8. Jun 2002
Ort: Berglen
2.395 Beiträge
 
Delphi 10.4 Sydney
 
#1

Re: udf tut nicht was sie soll

  Alt 22. Jun 2006, 19: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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz