27. juli 2002 - 12:55
Der er
2 kommentarer og 2 løsninger
Class i DLL?
Jeg skal have smidt en class ind i en DLL, som jeg skal kunne accesse, som var det bare en anden alm. class... Jeg havde overvejet at lave en funtion i DLL'en, som så nogenlunde sådan ud: function ReturnClass(): TMyClass; export; begin Result := TMyDLLClass; end; Men vil det virke..?
Annonceindlæg fra Bazoom
Få styr på gamer computerens hardware
I gaming-verdenen kan det rigtige hardware være forskellen mellem en uforglemmelig spiloplevelse og konstant frustration. Her er hvad du bør overveje.
22. juli 2024
Mener du faktisk en "class" eller en "class of object" ? Det er lidt svært at se fra dit eksempel. Er TMyClass en Class? Eller en Class of MyClass?
Okai - jeg er ikke så skrap til dette her... Jeg forsøgte med: Mit program, der skal bryge class'en: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; MyClass: TNewClass; implementation {$R *.dfm} function ReturnClass: TNewClass; external 'Project1.dll'; procedure TForm1.Button1Click(Sender: TObject); begin MyClass := ReturnClass; end; end. Mit DLL-projekt: library Project1; uses SysUtils, Classes, Unit1 in 'Unit1.pas'; var MyClass: TNewClass; {$R *.res} function ReturnClass: TNewClass; export; begin MyClass := TNewClass.Create; Result := MyClass; end; exports ReturnClass; begin end. Og endelig min unit i DLL'en: unit Unit1; interface uses Dialogs; type TNewClass = class protected procedure SetMsg(Value: String); function GetMsg: String; private public procedure ShowMsg(); published property Msg: String read GetMsg write SetMsg; end; var SysMsg: String; implementation procedure TNewClass.SetMsg(Value: String); begin SysMsg := Value; end; procedure TNewClass.ShowMsg(); begin ShowMessage(SysMsg); end; function TNewClass.GetMsg: String; begin Result := SysMsg; end; end.
det er smartest hvis du laver en separat unit til din klasse, da både dll projectet og applikationerne skal bruge denne. unit Cls; interface type TNewClass = class protected procedure SetMsg(Value: String); function GetMsg: String; private public procedure ShowMsg(); published property Msg: String read GetMsg write SetMsg; end; implementation uses Dialogs; var SysMsg : string; procedure TNewClass.SetMsg(Value: String); begin SysMsg := Value; end; procedure TNewClass.ShowMsg(); begin ShowMessage(SysMsg); end; function TNewClass.GetMsg: String; begin Result := SysMsg; end; end. Dll'en kan se sådan ud: library ClsLib; uses SysUtils, Classes, Cls in 'Cls.pas'; function ReturnClass: TNewClass; stdcall; begin Result := TNewClass.Create; end; exports ReturnClass; end. og til sidst hvordan du bruger dll'en: unit MainForm; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Cls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; function ReturnClass: TNewClass; stdcall; implementation uses Cls; {$R *.DFM} function ReturnClass; external 'CLSLIB.DLL' name 'ReturnClass'; procedure TForm1.Button1Click(Sender: TObject); var NC : TNewClass; begin NC := ReturnClass; NC.Msg := 'Hello'; NC.ShowMsg; NC.Free; end; end.
Hvis du kun skal bruge din Class fra et delphi program er det meget nemere at bruge Runtime-packages det styrer delphi helt af sig selv, du compiler bare med Runtime-packages hakket af, så får du en exe der automatisk benytter den form du har i den packages, du kan læse mere i online hjælpen, du kan også se et ex. på din dll løsning i hjælpen, ved at kigge på ex. om at lægge en form i en dll, en form er jo også en Class ( TForm ) så principet er det samme. /Martin
Kurser inden for grundlæggende programmering