DLL függvény átadási "hiba"
2009-01-11T15:05:00+01:00
2009-01-11T23:28:28+01:00
2022-08-12T17:15:33+02:00
javorek
Sziasztok!

A problémám a következő lenne. Delphi 7 rendszerben kreáltam egy DLL fájl. Egyetlen egy függvény lenne benne, amely viszont használja a Zeost, tehát usesbe beírtam a kellő unitokat. Viszont ahogy lefordítom a dll-t és meghívom a függvényt egy külső programmal akkor nem történik semmi. se hibaüzi, se acces violation, a függvény csupán üres értékkel tér vissza.
Észrevételem még, hogy a dll mérete majdnem 1MB.

A kérdésem az lenne, hogy vajon be lehet e dll-be forgatni a zeos unitokat, és van e méretbeli korlátozása dll fájloknak

A segítségeteket előre is köszönöm: Javorek Tamás

u.i: Mellékelem a dll forrását, nem sok:


library sqlengine; uses SysUtils, Classes, ZAbstractRODataset, ZDataset, ZConnection; {$R *.res} function fp_generate_custom(host:shortstring; user:shortstring; passw:shortstring; protocol:shortstring; db:shortstring; tabla:shortstring):shortstring; stdcall; var chr,fp:shortstring; i,x:integer; zc:TZconnection; zq:TZReadonlyquery; Owner:TComponent; ok:boolean; begin ok:=false; zc:=TZconnection.Create(nil); zc.HostName:=host; zc.User:=user; zc.Password:=passw; zc.Protocol:=protocol; zc.Connect; //a mysql query felépítése zq:=TZReadonlyquery.Create(nil); zq.Connection:=zc; while ok=false do //a cilklus addig fut, amíg talál egy szabad ujjlenyomatot begin; chr:=('0123456789ABCDEF'); fp:=''; for x:=1 to 8 do begin randomize; fp:=fp+chr[random(15)+1]; end; //a mysql kapcsolat felépítése zq.active:=false; zq.SQL.Clear; zq.SQL.Add('Select ujjlenyomat from '+db+'.'+tabla+' where ujjlenyomat="'+fp+'"'); zq.Active:=true; if zq.RecordCount=0 then ok:=true; end; zq.Active:=false; zc.Disconnect; zq.Free; zc.Free; fp_generate_custom:=fp; end; function getdll_ver:shortstring; stdcall; begin result:=('1.0b'); end; exports fp_generate_custom, getdll_ver; begin end.

A gond az, hogy lehet, hogy a nagy függvény hibás, de hogy a kis nyomorult getdll_ver is üres értékkel tér vissza...
Mutasd a teljes hozzászólást!
Habár ebben a topicban azt mondtam, hogy kussolok, mégis merészkedni fogok. Ugye nem haragszol?

A gond az, hogy lehet, hogy a nagy függvény hibás, de hogy a kis nyomorult getdll_ver is üres értékkel tér vissza...

Az a kis nyomorult getdll_ver nem is fog így soha működni.
Tennivalók:
1. Elolvasod fusinuku hozzászólását,
2. Megfogadod klorand tanácsát vagy elolvasod mégegyszer fusinuku tanácsát,
3. Módosítod a getdll_ver függvényed deklarációját így:
function getdll_ver:PChar; stdcall;
vagy elolvasod fusinuku tanácsát mégegyszer.

Egyébként ott van a Delphi által generált kódban. Lehet nem vetted észre.

Lehetséges egy belső delphi hiba

Hát persze.
Mutasd a teljes hozzászólást!

  • function getdll_ver( var s:shortstring ); stdcall; begin s:=('1.0b'); end;

    Mutasd a teljes hozzászólást!
  • Köszi a választ, de sajnos ugyanazt csinálja. Van pár dll-em, ahol ez paraméterlista nélkül is tökéletesen működik. A hiba csak akkor fordul elő, ha egyszer beimportáltalm a Zeos unitokat. hiába veszem ki utána, ezzel a dll-el mindíg ezt csinálja. Azért köszi.
    Mutasd a teljes hozzászólást!
  • { Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. }

    Első ránézésre te ennek a figyelmeztetésnek,
    (vagy ennek figyelmen kívül hagyásának) estél áldozatul.
    Mutasd a teljes hozzászólást!
  • Neked is köszi az utánajárást. Az egyetlen probléma az az, hogy most már ha csinálok egy tök új dll-t, ami kizárólag ezt a hihetetlen bonyorultságokat felölelő getdll_ver függvényt tartalmazza, akkor se megy... Lehet hogy a hiba az én készülékemben van... Lehetséges egy belső delphi hiba, ami a nem megfelelően telepített komponensekből adódnak? Mert akkor sajna ReInstall delphi...
    Mutasd a teljes hozzászólást!
  • ShareMem az elso unit a uses-nel?
    Mutasd a teljes hozzászólást!
  • Habár ebben a topicban azt mondtam, hogy kussolok, mégis merészkedni fogok. Ugye nem haragszol?

    A gond az, hogy lehet, hogy a nagy függvény hibás, de hogy a kis nyomorult getdll_ver is üres értékkel tér vissza...

    Az a kis nyomorult getdll_ver nem is fog így soha működni.
    Tennivalók:
    1. Elolvasod fusinuku hozzászólását,
    2. Megfogadod klorand tanácsát vagy elolvasod mégegyszer fusinuku tanácsát,
    3. Módosítod a getdll_ver függvényed deklarációját így:
    function getdll_ver:PChar; stdcall;
    vagy elolvasod fusinuku tanácsát mégegyszer.

    Egyébként ott van a Delphi által generált kódban. Lehet nem vetted észre.

    Lehetséges egy belső delphi hiba

    Hát persze.
    Mutasd a teljes hozzászólást!
  • Ne haragudj, hogy nyers voltam. Tényleg nem akartam bunkó lenni, csak kezdő szinten vagyok még én is és nem szeretem, ha ezért piszkálnak. Bocsi még1x. A kódot megnézem...
    Mutasd a teljes hozzászólást!
  • Nos a helyzet a következő. Magyarázatot nem tudok rá adni, de a következő történt:

    Véletlenül lehagytam az stdcall; parancsot a függvény végéről, és az egész masina hirtelen, mint Frankeinstein, életre kelt, és elkezdett helyesen működni. Szóval, a működő dll forráskódja:

    library Project2;

    uses
    SysUtils,
    Classes;

    {$R *.res}

    function getdll_ver:shortstring;
    begin
    result:=('1.0b');
    end;


    exports
    getdll_ver;

    begin
    end.

    A teszterprogramban pedig egyszerűen a következő sor az implementation után:

    function getdll_ver:shortstring; external 'Project2'

    Magyarázatot nem tudok rá adni, de működik...
    Mutasd a teljes hozzászólást!
  • Nem jó!
    //akarmi.dll kodja function getdll_ver:PChar; stdcall; ... //testerprogram kodja: function getdll_ver:PChar; stdcall; external 'akarmi.dll'; ...
    Az stdcall konvenciót ajánlom használatra, a legtöbb ( talán az összes windows ) api azt használja. Ha így teszel, a dll-ed hívható lesz VB, C, stb. kódból is.

    ---
    { Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results.
    A te kódod csak akkor lesz helyes, ha így módosítod:
    library Project2; uses ShareMem SysUtils, Classes; {$R *.res} ...
    ÉS a tesztprogramot is módosítod így:

    unit Unit1; interface uses ShareMem, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
    Mutasd a teljes hozzászólást!
  • Lemódosítottam mindent, királyul működik a dolog, egy kivétellel, a teszterprogram kilépéskor runtime error too many consecutive exceptions... de ez már a jövő zenéje, és nem akarlak zaklatni téged, majd elkezdek utánajárni, mi lehet ez, és ha végképp nem megy, hozzátok fordulok... Köszi a segítséget mindenkinek!

    Mutasd a teljes hozzászólást!
abcd