Delphi/Firebird/UDF

Delphi/Firebird/UDF
2006-07-28T10:41:32+02:00
2006-07-30T21:51:25+02:00
2022-10-31T21:36:08+01:00
nova76
Készítettem egy dll fájlt a firebird adatbázisomhoz.
Ebben szeretnék összeadni 2 számot és lementeni az adatot egy fájlba.

Ime a kód:

library mydll.udf; uses SysUtils, Classes, mydlludf in 'mydlludf.pas'; {$R *.res} exports AddFunction; begin end. unit mydlludf; interface uses Classes, SysUtils; function AddFunction(var Width,Height:Integer; FileName:String):Integer;stdcall implementation function AddFunction(var Width,Height:Integer; FileName:String):Integer; Var SaveToFile:TStrings; begin SaveToFile:=TStringList.create; Result:=Width+Height; SaveToFile.Add('Az eredmeny:' + IntToStr(Result)) ; SaveToFile.SaveToFile(Filename); end; end.

Ime a declaráció a Firebirdben:

declare external function padd Integer, Integer, CSTRING(80) returns Integer by value entry_point 'AddFunction' module_name 'mydll.udf.dll';

és ime a lekérdezés:

select padd(12,12,'C:\kuka.txt') from rdb$Database

a fájl létrejön, azonban a tartalma igazán izgalmas:

Az eredmeny:25

És egy gyors fejszámolás, és máris csupa kérdőjel vagyok...
Mutasd a teljes hozzászólást!
Mert akkora kommentel írja a delphi is neked, hogy ha string-et adsz át paraméterben, illetve visszakapsz, akkor mindkét unitban (dll és alkalmazásban) első helyen kell hogy legyen a sharemem unit a usesolásban.

Most hogy átírtad PChar-ra, nincsenek ilyen gondjaid. De a ^ nem kell, deklaráld integerként simán. Hacsak a firebird nem követeli meg...
Mutasd a teljes hozzászólást!

  • konkrétan ehhez nem értek, de egyszer volt kellemetlen élményem, amikor összekavartam az érték szerinti és a referencia szerinti átadást, dll export mellett.
    (vagyis arra próbálok célozni, hogy az addfunction fejlécébe biztos kell-e az a var?)

    --ajven
    Mutasd a teljes hozzászólást!
  • nem kell a var, de akkor állítólag valamiért kalapozni kell.

    így:

    unit mydlludf; interface uses Classes, SysUtils, Dialogs; type PInteger = ^Integer; function AddFunction( Width,Height:PInteger; FileName:PChar):Integer;stdcall implementation function AddFunction(Width,Height:PInteger; FileName:Pchar):Integer; Var SaveToFile:TStrings; begin SaveToFile:=TStringList.create; Result:=Width^+Height^; SaveToFile.Add('Az eredmeny:' + IntToStr(Result)) ; SaveToFile.SaveToFile(Filename); showmessage(IntToStr(Width^+Height^)); end; end.

    És így jól jön ki az eredmény. Amit viszont nagyon szeretnék megtudni, hogy miért???
    Mutasd a teljes hozzászólást!
  • Mert akkora kommentel írja a delphi is neked, hogy ha string-et adsz át paraméterben, illetve visszakapsz, akkor mindkét unitban (dll és alkalmazásban) első helyen kell hogy legyen a sharemem unit a usesolásban.

    Most hogy átírtad PChar-ra, nincsenek ilyen gondjaid. De a ^ nem kell, deklaráld integerként simán. Hacsak a firebird nem követeli meg...
    Mutasd a teljes hozzászólást!
  • Úgy emlékszem alapértelmezésben minden paramétert cím szerint vár. Egyedül a visszatérési értéknél adhatod meg, hogy érték szerint adtad vissza. Ha a függvénynek valamelyik paramétere
    OUT
    típusú, azt külön jelezni kell.
    Ha az első verzióban a
    String
    -et (mert azt egyáltalán nem használhatod) kicseréled
    PChar
    -ra (csak úgy szabad!), akkor is működik. Ha majd a későbbiek során
    CSTRING
    -et vagyis
    PChar
    -t akarsz visszaadni az adatbáziskezelő számára, akkor van az adatbáziskezelő külső függvényei számára exportált memóriafoglaló függvény. Az InterBase-ban pl.
    ib_util_malloc
    (lsd. examples katalógus). Csak az SQL deklarációjánál meg kell majd adni a
    FREE_IT
    kulcsszót.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd