3

Ich habe versucht, eine einfache benutzerdefinierte Funktion (UDF) für Firebird 2.5 mit C++ Builder 2010 zu erstellen, aber ich bekomme es nicht in Firebird arbeiten.Erstellen einer benutzerdefinierten Funktion für Firebird 2.5 mit C++ Builder 2010

  1. ein DLL-Projekt mit Standardeinstellung erstellen in C++ Builder 2010
  2. eine Einheit mit meinem Beispiel UDF einschließlich "ibase.h" und "ib_util.h" Hinzufügen:

    extern "C" __declspec(dllexport) int __stdcall MYFUNC (int i) 
    { 
        int result = 2 * i; 
        return result; 
    } 
    
  3. Erstellen des DLL FBUDFMBD.dll in Pfad C:\Program Files (x86)\Firebird\Firebird_2_5\UDF

  4. Registrierung meine UDF über IBExpert in einer Probe db mit

    DECLARE EXTERNAL FUNCTION F_MYFUNC 
    INTEGER 
    RETURNS INTEGER 
    ENTRY_POINT 'MYFUNC' MODULE_NAME 'FBUDFMBD'; 
    
  5. Aufrufen der UDF mit

    select F_MYFUNC(3) from RDB$DATABASE; 
    

    Ergebnisse in Fehlermeldung

    Invalid token. 
    invalid request BLR at offset 36. 
    function F_MYFUNC is not defined. 
    module name or entrypoint could not be found. 
    

Mit dem Werkzeug GExperts - PE Informationen ich meine UDF als DLL-Export sehen MYFUNC Ordnungszahl $1 und Einstiegspunkt $1538.

Was ich falsch mache, kann Firebird meine DLL und seine UDF nicht richtig registrieren?

Gibt es etwas in meinem DLL-Projekt zu ändern, in Bezug auf die Standard-Compiler-Optionen?

+0

Meiner Erfahrung nach bekommt die Firebird UDF-Frage - normalerweise - hier nicht viele Antworten; Vielleicht möchten Sie Ihre Frage auch auf die Firebird-Support-Mailingliste stellen. –

+0

Ich bin nicht 100% sicher, aber ich glaube, Sie müssen entfernen Sie die 'extern" C "__declspec (dllexport)', suchen Sie nach einem Beispiel unter https://github.com/FirebirdSQL/firebird/blob/8905e15435116bfac3abb30ae476d4812d1fe04b/src /extlib/ib_udf.cpp –

Antwort

2

In Delphi können Sie cdecl schreiben und nicht stdcall

d.h

function ExisteBase(const aBase:PChar):Integer; cdecl; 

Nicht
function ExisteBase(const aBase:PChar):Integer; stdcall; 

Vielleicht auf C++ __cdecl

Ich hoffe, half ich in einigen

2

Vielen Dank! Ich habe es durch deine Hilfe bekommen.

Top 2: Korrigierte C++ - Code ist:

extern "C" __declspec(dllexport) int MYFUNC (int * val) 
{ 
    int result = 2 * *val; 
    return result; 
} 

Achten Sie auf Referenz Aufruf des Eingangsparameters.

Top 4: die UDF von

in einem Firebird 2.5 db Registrieren
DECLARE EXTERNAL FUNCTION F_MYFUNC 
INTEGER 
RETURNS INTEGER BY VALUE 
ENTRY_POINT '_MYFUNC' MODULE_NAME 'FBUDFMBD'; 

Achten Sie auf den führenden unterstreicht bei dem Funktionsnamen!

top 5:select F_MYFUNC(3) from RDB$DATABASE; funktioniert wirklich gut!

+0

..und jetzt gehe ich mit String-Parametern weiter. –

Verwandte Themen