Delphi dll meghívása oda visza?

Delphi dll meghívása oda visza?
2008-09-02T12:10:32+02:00
2008-09-02T23:02:22+02:00
2022-11-10T20:25:36+01:00
eniak
Sziasztok!

A problémám a következő


procedure opendll; external 'mydll.dll'; procedure adatdll(i:string); external 'mydll.dll'; procedure TForm1.Button1Click(Sender: TObject); begin opendll; end; procedure TForm1.Button2Click(Sender: TObject); begin adatdll(edit1.Text); end; procedure tform1.adatexe(i:string); begin edit1.Text:=i; end; end

ezzel a forráskóddal az alkalmazásom meghív egy külső dll-ben két eljárást, az egyik eljárás a dllben lévő formot indítja el. Na most ezen a formon van egy gomb, aminek meg kéne hívnia az "adatexe" nevű eljárást a dll-t hívó exében.

A kérdés hogyan tudok dll-böl, a dll-t hívó exe-ben lévő eljárást meghívni delphi 7 ben?

eniak.
Mutasd a teljes hozzászólást!
Azt rontod el, hogy így a dll nem kapja meg az exe rutinjának címét. Természetesen ez még kell a főprogramba:

type tExeProc = procedure(i : string) of object; procedure SetProc(AExeProc : tExeProc); external 'mydll.dll'; procedure TForm1.Button1Click(Sender: TObject); begin opendll; SetProc(AdatExe); end;

feltéve, hogy jól értem, és a Button1 létesíti a kapcsolatot a dll-lel.
Mutasd a teljes hozzászólást!

  • Tedd ki azt a másik eljárást is egy külön dll-be és mehet is a dolog. Exe-ben lévő függvényt/eljárást nem tudsz csak úgy meghívni egy másik futtatható állományból.
    Mutasd a teljes hozzászólást!
  • Átadhatod a DLL-nek a főprogram eljárásának címét, mint az OnClick eseménykezelő is működik:

    //dll: type tExeProc : procedure(i : string) of object; var ExeProc : tExeProc; procedure SetProc(AExeProc : tExeProc); //export begin ExeProc:=AExeProc; end; //ahol használod: if Assigned(ExeProc) then ExeProc('Ezt a stringet adom át'); //exe: procedure TForm1.InitDLL; begin SetProc(AdatExe); end; procedure TForm1.AdatExe(i : string); : : :
    Mutasd a teljes hozzászólást!
  • Épen most alkarom beletelni az exébe, mert az exének csak az a dolga hogy megnyissa a (jelenleg 2) dll-t, és üresen áll foglalja a memóriát, ha meg bezárom bezáródik a két dll is ,így gondoltam, hogy az egyik dll tartalmát átdobom az exébe.

    eniak
    Mutasd a teljes hozzászólást!
  • Sajnos nekem nem működik , ha a dll két rész van. a sima dll, és a formhoz tartozó unit, ha az unitba teszem bele akkor kifagy már a types résznél hogy nem ismeri fel, ha a dll-es részébe teszem akkor lefut rendesen, de nem csinál semit.

    Az exe oldalon meg nem ismeri fel a SetProc(AdatExe); részt, úgy probáltam hogy ezt kiszedtem belőle.

    dll

    type tExeProc = procedure(i : string) of object; {$R *.res} var form:tform1; ExeProc : tExeProc; procedure SetProc(AExeProc : tExeProc); //export begin ExeProc:=AExeProc; end; procedure exesend(i:string); begin beep; if Assigned(ExeProc) then ExeProc('Ezt a stringet adom át'); end; procedure opendll; begin form:=tform1.Create(application); form.Show; end; procedure adatdll(i:string); begin form.edit1.text:=i; end; exports opendll, adatdll, exesend; begin end.
    dll formja

    type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure exesend(i:string); external 'mydll.dll'; procedure TForm1.Button1Click(Sender: TObject); begin exesend(edit1.Text); end; end.
    exe
    type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure adatexe(i:string); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure opendll; external 'mydll.dll'; procedure adatdll(i:string); external 'mydll.dll'; procedure TForm1.AdatExe(i : string); begin edit1.Text:=i; end; procedure TForm1.Button1Click(Sender: TObject); begin opendll; end; procedure TForm1.Button2Click(Sender: TObject); begin adatdll(edit1.Text); end; end.

    MIT ronthatok el

    eniak
    Mutasd a teljes hozzászólást!
  • Akkor próbálkozz callback függvény implementálásával vhogy így. Dll esetén elképzelhető, hogy egy kicsit másképp működik, vhogy így.
    Mutasd a teljes hozzászólást!
  • Sajnos eböl nem sokat értettem (nem tudok angolul).

    Azon gondolkoztam, hogy nem lenne e egyszerűbb ha valahogy úgy indítanám el az exéből a dll-t hogy az exe bezárása után is fusson a dll, ha ezt meglehet oldani valahogy, sínen vagyok?

    eniak

    u.i (sajnos elkel mennem , ma este 9 után leszek csak megint )
    Mutasd a teljes hozzászólást!
  • Azt rontod el, hogy így a dll nem kapja meg az exe rutinjának címét. Természetesen ez még kell a főprogramba:

    type tExeProc = procedure(i : string) of object; procedure SetProc(AExeProc : tExeProc); external 'mydll.dll'; procedure TForm1.Button1Click(Sender: TObject); begin opendll; SetProc(AdatExe); end;

    feltéve, hogy jól értem, és a Button1 létesíti a kapcsolatot a dll-lel.
    Mutasd a teljes hozzászólást!
  • Nem, és nem. Lásd polyJoe és általam leírtakat.
    Mutasd a teljes hozzászólást!
  • uses sharemem;
    vagy
    (i:pchar)
    Mutasd a teljes hozzászólást!
  • Csinálsz egy fgv-t az exeben, kiexportálod, majd úgy hívod a dll-ből, mintha egy dll lenne az exe.
    procedure adatexehivo(i:string); export; begin Form1.adatexe(i); End;
    Mutasd a teljes hozzászólást!
  • Tökéletesen működik

    Köszönöm szépen mindenkitől a hozzászólásokat, polyJoe a pont.

    eniak
    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