Autor |
Beitrag |
Savage
      
Beiträge: 110
|
Verfasst: Fr 26.12.03 23:59
Hi @All
wie es der Titel schon sagt, ich bekomme es einfach nicht hin, einen Frame, die ich in eine DLL gepackt habe, in meinen Programm zu laden.
Weis jemand, wie ich es hinbekomme? Wenn ich ne ganze Form aus ner DLL verwende, öffne ich diese mit einer Procedure in der DLL, aber bei ner Frame funzt das ja leider nicht
Ich hoffe, ihr könnt mir weiterhelfen
mfg
Savage
|
|
Savage 
      
Beiträge: 110
|
Verfasst: Do 01.01.04 18:10
Titel: statisch funktioniert es jetzt aber dynamisch nicht...
Hi @all
ich habe es nun mit dem Frame hinbekommen, aber leider nur, wenn ich die DLL statisch lade und die Projekte (Hauptprogramm + DLL mit Laufzeitp. compiliere)
Ich hoffe, ihr könnt mir jetzt etwas weiter helfen.
Hier mal mein Source:
DLL mit Frame:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| library Project2;
uses sharemem, Windows, SysUtils, Classes, Controls, StdCtrls, Unit1 in 'Unit1.pas' ;
{$R *.RES}
var frame : TFrame1;
procedure delframe;stdcall; begin frame.Destroy; end;
Procedure showframe(h : twincontrol);stdcall; begin frame := TFrame1.Create(nil); frame.Parent := h; frame.Left := 50; frame.Top := 70; end; |
Vom Statischen einlesen, was funktioniert:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| unit Unit1;
interface
uses Sharemem, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation Procedure showframe(h : twincontrol);stdcall;external 'Project2.dll'; procedure delframe;stdcall;external 'Project2.dll'; {$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject); begin showframe(form1); end;
procedure TForm1.Button2Click(Sender: TObject); begin delframe end;
end. |
Und nun hier die dynamische Variante, wo ich eine Zugriffsverletzung bekomme
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| unit Unit1;
interface
uses sharemem,Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type tshowframe = procedure(h : twincontrol); type tdelframe = procedure;
type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private public end;
var Form1: TForm1; showframe : TShowframe; delframe : TDelframe; funcptr : TFarProc; Dllhandle : THandle; implementation {$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject); begin dllhandle := loadlibrary('Project2.dll'); funcptr := GetProcAddress(dllhandle,'showframe'); if funcptr <> nil then begin @showframe := funcptr; showframe(form1); end; end;
procedure TForm1.Button2Click(Sender: TObject); begin end;
end. |
Ich hoffe, einer von euch weis, wo der Fehler liegen könnte.
mfg
Savage
Moderiert von Peter Lustig: Code- durch Delphi-Tags ersetzt
|
|
CenBells
      
Beiträge: 1547
Win 7
Delphi XE5 Pro
|
Verfasst: Fr 02.01.04 08:10
wo bekommst du denn die zugriffsverletzung?
Gruß
ken
_________________ Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.
|
|
Savage 
      
Beiträge: 110
|
Verfasst: Fr 02.01.04 10:55
Die Zugriffsverletzung bekomme ich direkt nach:
showframe(form1);
warum, weiß ich noch immer nicht.
mfg
Savage
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Fr 02.01.04 11:18
Bei der statischen Variante importierst du die Funktionen korrekt mit der Aufrufkonvention die du auch den Funktionen in der Dll verpasst hast -> stdcall
Bei der dynamischen Variante machst du keine Angaben zur Aufrufkonvention weshalb der Compiler die standardkonvention register nimmt...
2 Möglichkeiten: entweder in der Dll die stdcall löschen und auch auf register umsteigen, oder aber im Programm die Prozedur-Typen für den dyn. Import auch als stdcall deklarieren..
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Savage 
      
Beiträge: 110
|
Verfasst: Fr 02.01.04 11:27
thx Motzi,
an das stdcall hatte ich nun überhaupt nicht gedacht.
Jetzt funktioniert es endlich - DANKE
mfg
Savage
|
|
CenBells
      
Beiträge: 1547
Win 7
Delphi XE5 Pro
|
Verfasst: Do 18.08.05 16:16
hi.
*Kram* *Pust* *entstaub*
der Thread ist ja schon etwas älter, aber ich habe mich jetzt mal wieder mit der geschichte beschäftigt.
Ich habe mir jetzt auch eine kleine testapplikation geschrieben, allerdings bekomme ich beim anzeigen des frames aus der test-dll immer den Fehler "TFont kann nicht zu TFont zugewiesen werden." Kann mir wer sagen, wie ich das umgehen kann? Oder auch, was ich dagegen unternehmen kann?
@salvage: hast du das geschafft?
Gruß
Ken
_________________ Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.
|
|
nitschchedu
Hält's aus hier
Beiträge: 5
|
Verfasst: Di 02.05.06 11:08
Hey Savage,
kannst du mir das ganze Projekt Posten? ich will das auch in der art machen doch leiter ist es mir noch nicht vergönnt.
|
|
ScripTrix
Hält's aus hier
Beiträge: 1
|
Verfasst: Sa 22.07.06 22:38
nitschchedu hat folgendes geschrieben: | Hey Savage,
kannst du mir das ganze Projekt Posten? ich will das auch in der art machen doch leiter ist es mir noch nicht vergönnt. |
würd mich auch interessieren, würd mich da über post sehr freuen.
ok packages ist das stichwort  dann gehts 
|
|
|