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
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#1

udf tut nicht was sie soll

  Alt 22. Jun 2006, 20:05
Datenbank: firebird • Version: 1.5 • Zugriff über: ibx, ibexpert
hallo,
ich hab ein problem (wie immer *löl)
ich habe eine dll, welche 'eigentlich' tut was sie soll, nämlich in einem widestring einen substring suchen und diesen durch einen anderen substring zu ersetzen.
das projekt ist im anhang

so, dann kopiere ich die dll in mein firebird-udf-verzeichnis, starte den server neu und deklariere die udf mit:

SQL-Code:
DECLARE EXTERNAL FUNCTION REPLACESUBSTRING
    CSTRING(100),
    CSTRING(100),
    CSTRING(100)
RETURNS CSTRING(100) FREE_IT
ENTRY_POINT 'Replace' MODULE_NAME 'MyFirebirdUDFs'
Mit einem sql-aufruf wie select replacesubstring('Muster', 'us', 'af') from rdb$database will ich dann natürlich erreichen, dass 'Muster' zu 'Mafter' gemacht wird.
aber das ergebnis, dass mir der query zurückgibt ist immer noch 'Muster'

was mach ich falsch?

danke,

martin
Angehängte Dateien
Dateityp: rar dlls_156.rar (53,5 KB, 8x aufgerufen)
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: udf tut nicht was sie soll

  Alt 22. Jun 2006, 20:11
Der Aufruf der Funktion funktioniert 1.lokal 1. Beim Aufruf der Dll?
Markus Kinzler
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#3

Re: udf tut nicht was sie soll

  Alt 22. Jun 2006, 20:14
Zitat von mkinzler:
Der Aufruf der Funktion funktioniert 1.lokal 1. Beim Aufruf der Dll?
versteh jetzt die frage nicht ganz, fakt is aber dass die funktion das richtige ergebnis liefert, wenn ich sie mit folgendem testprogramm laufen lasse
:
Angehängte Dateien
Dateityp: rar testprojekt_840.rar (232,3 KB, 5x aufgerufen)
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
peter12

Registriert seit: 28. Feb 2005
Ort: Oberneukirchen ,Österreich
183 Beiträge
 
Delphi 2006 Professional
 
#4

Re: udf tut nicht was sie soll

  Alt 22. Jun 2006, 20:17
Konnte es nicht in
Delphi 5 compilieren TntSysUtils fehlt mir.

Unterschiede zu meiner DLL

exports Replace name 'Replace';

Bei mir >>> exports Replace ;

function Replace(s, old, new: PWideChar): PWideChar; cdecl; export;

Bei mir >>> function Replace(s, old, new: PWideChar): PWideChar; cdecl;

Peter
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#5

Re: udf tut nicht was sie soll

  Alt 22. Jun 2006, 20:20
Zitat von peter12:
Konnte es nicht in
Delphi 5 compilieren TntSysUtils fehlt mir.

Unterschiede zu meiner DLL

exports Replace name 'Replace';

Bei mir >>> exports Replace ;

function Replace(s, old, new: PWideChar): PWideChar; cdecl; export;

Bei mir >>> function Replace(s, old, new: PWideChar): PWideChar; cdecl;

Peter
ja, du brauchst dafür die tnt-unicode-controls:

http://www.tntware.com/delphicontrols/unicode/
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
Lemmy

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

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
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 19:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz