Announcement

Collapse
No announcement yet.

Udf hilfe

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Udf hilfe

    Moin Leute,

    ich habe ein aus meine sicht ziemlich lächerliches Problem. Ich wollte eine UDF in Delphi schreiben jedoch hat das nicht funktioniert sie einzubinden via IBExpert. Jetzt hab ich mir gedacht vielleicht liegt es an der DLL. Ich habe einfach eine total einfache DLL geschrieben die nur den wert zurückgiebt den sie bekommt.
    CODE:
    Library test;

    uses
    sysutils,
    classes;
    function test1(zahl1: integer): integer; stdcall;
    begin
    result := zahl1
    end;
    exports
    test1;
    begin
    end.

    Diese DLL habe ich dann mit diesem Code deklariert:

    Declare external function u_Test
    integer
    returns integer by value
    entry_point 'test1' module_name 'age.dll'

    mit diesem SQL statement will ich die funktion dann nutzen:

    select u_test (zahl) from T_test

    und erhalte dann folgende Fehlermeldung:

    Unsuccessful execution caused by a system error that preludes successful execution of subsequent statements. Error reading data from the connection.

    Connection will ne closed immediately.

    und die kommt nach jedem klicken wieder -.-

    Die Tabelle enthält 2 Spalten ID und Zahl ist mit zwei Datensätzen füllt worden und zwar
    ID: 1 Zahl: 7
    ID: 2 Zahl: 17
    name der Tabelle ist t_test.

    Was mache ich hier falsch?

    rechtschreibfehler bitte ignorieren aus zeitmangel

    MfG AnGeLo^
    Zuletzt editiert von AnGeLo^; 16.03.2009, 14:50.

  • #2
    ageof test1

    Comment


    • #3
      Ne sorry daran liegts nicht -.- hatte den Code nur von AgeOF in test geändert um die leser nicht zu veriwirren das hatte ich wohl übersehen. Vielleicht jdm ne andere Idee!

      Trotzdem danke
      Zuletzt editiert von AnGeLo^; 16.03.2009, 17:26.

      Comment


      • #4
        IMHO sollte als Aufrufkonvention cdecl statt stdcall verwendet werden.
        Dann sollten auch Integer als Var übergeben werden.

        Meiner Meinung nach:
        Code:
        uses
          sysutils, classes;
         
        function test1(var zahl1: integer): integer; cdecl;
        begin
          result := zahl1;
        end;
         
        exports
          test1 name 'TEST1';
         
        begin
          IsMultiThread := true;
        end.
        Frank

        [EDIT]
        und wenn Library test, dann

        Declare external function TEST1
        integer
        returns integer by value
        entry_point 'TEST1' module_name 'test'

        ohne Angabe von .dll
        [/EDIT]
        Zuletzt editiert von Frank Reim; 16.03.2009, 23:42.

        Comment


        • #5
          Danke danke hast mich ein ganzes stück weiter gebracht die Fehler meldung ist beseitigt nur egal was für werte ich der DLL übergebe ich bekomme immer 109 in beiden Datensätzen wenn ich die UDF ausführe. Hättest du oder jemand anders vielleicht noch ne Idee?

          Comment


          • #6
            Originally posted by AnGeLo^ View Post
            Hättest du oder jemand anders vielleicht noch ne Idee?
            Zeig doch mal den Code deiner UDF und das Statement zum Anlegen in der DB.

            Frank

            Comment


            • #7
              Wie gesagt der Code war ja nur ein Test das hier hatte ich wirklich damit vor. Dennoch auch der einfache Code im oberen Post gibt mir 109 aus das ist der

              DLL Code:

              library age;

              uses
              SysUtils,
              DateUtils,
              Classes;


              function ageof(Gdatum: Tdatetime): Integer; cdecl;
              var today: tdatetime;
              begin
              today := now;
              result := YearsBetween(gdatum, today)
              end;
              exports
              ageof name 'ageof';
              begin
              ismultithread := true;
              end.
              UDF Code:

              DECLARE EXTERNAL FUNCTION U_AGE
              DATE
              RETURNS INTEGER BY VALUE
              ENTRY_POINT 'ageof' MODULE_NAME 'age';
              Select statement:
              select u_age(geburtsdatum) from t_age
              Ergebnis:

              Eine spalte namens U_AGE in der zwei Datensätze stehen und zwar 109 und 109.

              Comment


              • #8
                Hi,

                ja, Datum funktioniert wieder ganz anders. Ich empfehle dir, die Sourcen einer freie Lib wie z.B. FreeUdfLib anzusehen.
                Es ist nämlich unter Umständen etwas umfangreicher.

                Frank

                Comment


                • #9
                  Alles klar ich Google mal nach den dingern und den Sourcecode find ich einfach so ?

                  Comment


                  • #10
                    Originally posted by AnGeLo^ View Post
                    Alles klar ich Google mal nach den dingern und den Sourcecode find ich einfach so ?
                    http://www.ibphoenix.com/main.nfs?a=...e=ibp_udf_libs

                    Frank

                    Comment

                    Working...
                    X