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 Novataris
Vejen til devops med Bavarian Nordic
Bavarian Nordics vækst blev starten på et DevOps-samarbejde med Novataris for hurtigt at kunne tilpasse IT-organisation til forretningen.
7. december 2023
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