DLl erzeugen

Für Fragen rund um die Ide und zum Debugger
khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

DLl erzeugen

Beitrag von khh »

hallo zusammen,
ich möchte unter Lazarus eine dll erzeugen um Klassen aus dieser zu verwenden.
Was mach ich falsch, dass ich beim Kompilieren keine dll sondern eine exe erzeuge :(

hab grad mal ein Beispiel aus dem Netz genommenum diese Möglichkeit zu testen.
Lazarus erstelltbeim Erzeugen einer Bibliothek ein neues Projekt und beim Kompilieren ne exe :(

was mach ich falsch?

hier ´nur mal der DLL-Code.
EDIT: der Link zum Beitrag http://entwickler-forum.de/showthread.php?t=24504" onclick="window.open(this.href);return false;

Code: Alles auswählen

library MWStObj;
{$mode objfpc}{$H+}
 
 
uses
 
  SysUtils,
 
  Classes,
 
  Obj_Unit in 'Obj_Unit.pas';
 
 
 
type
 
  TMWSt98 = class(TMWSt)
 
  private
 
    FMWStSatz : Real;
 
  public
 
    constructor Create;
 
    function GetBrutto(const aNetto: Currency): Currency; override;
 
    procedure SetPercent(const aPercent : Integer); override;
 
  end;
 
 
 
constructor TMWSt98.Create;
 
begin
 
  inherited Create;
 
  FMWStSatz := 1.15;
 
  Assert(MWST_VERSION = 1, 'Falsche Unit-Version!');
 
end;
 
 
 
function TMWSt98.GetBrutto(const aNetto: Currency): Currency;
 
begin
 
  Result := aNetto * FMWStSatz
 
end;
 
 
 
procedure TMWSt98.SetPercent(const aPercent : Integer);
 
begin
 
  FMWStSatz := 1.0 + (aPercent/100);
 
end;
 
 
 
{ Schnittstellenprozedur }
 
 
 
function CreateMWStObj: TMWSt98; stdcall;
 
begin
 
  Result := TMWSt98.Create;
 
end;
 
 
 
{ Export der Schnittstellenprozedur }
 
 
 
exports
 
  CreateMWStObj resident;
 
begin
 
  { nichts zu tun }
 
end.
danke für eure Hilfe

Gruss KH

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: DLl erzeugen

Beitrag von mschnell »

khh hat geschrieben:Was mach ich falsch, dass ich beim Kompilieren keine dll sondern eine exe erzeuge
machst Du "File" -> "new" -> "Library" ?

-Michael

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Re: DLl erzeugen

Beitrag von khh »

mschnell hat geschrieben:
khh hat geschrieben:Was mach ich falsch, dass ich beim Kompilieren keine dll sondern eine exe erzeuge
machst Du "File" -> "new" -> "Library" ?

-Michael
ja, oder in der deutschen Umgebung
Datei - Neu - Bibliothek ;-)

EDIT:

ih hab mal als gegenstück ne einfache beispiel genommen, die kompiliert er richtig zur dll

Code: Alles auswählen

library beispiel;
 
{$mode objfpc}{$H+}
 
uses
  Classes
  { you can add units after this };
 
// Die Funktion, die anderen Programmen zur Verfügung gestellt werden soll
// (in diesem Beispiel: Addieren zweier Zahlen)
function AddNumbers(a, b: Double): Double; cdecl;
begin
  Result := a + b;
end;
 
//Liste der zu Exportierenden Funktionen/Prozeduren
exports
  AddNumbers;
 
 
begin
// Programmcode, der beim Laden der DLL immer ausgeführt wird
end.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: DLl erzeugen

Beitrag von mschnell »

khh hat geschrieben:Datei - Neu - Bibliothek ;-)
Und dann wird ein EXE erzeugt ???? Das scheint mir ein Bug zu sein.

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Re: DLl erzeugen

Beitrag von khh »

mschnell hat geschrieben:
khh hat geschrieben:Datei - Neu - Bibliothek ;-)
Und dann wird ein EXE erzeugt ???? Das scheint mir ein Bug zu sein.

ja, im Falle des ersten Quellcodes wird ne exe erzeugt,im Falle des zweiten Codes ne DLL

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6763
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: DLl erzeugen

Beitrag von af0815 »

Kann das sein, das eine Programm ursprünglich erstellt hast und es erst durch umkopieren des Quelltextes alleine in eine Library verwandeln wolltest ?! Das würde das Verhalten erklären.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Re: DLl erzeugen

Beitrag von khh »

af0815 hat geschrieben:Kann das sein, das eine Programm ursprünglich erstellt hast und es erst durch umkopieren des Quelltextes alleine in eine Library verwandeln wolltest ?! Das würde das Verhalten erklären.
ich werd das morgen nochmal komplett neu machen, mal sehen was dabei rauskommt
bis dann

gruss KHH

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: DLl erzeugen

Beitrag von Hitman »

Nur weil die Datei auf .exe endet schließt es ja nicht aus, dass es trotzdem eine DLL ist ... also nenns halt um bzw. stell in den Projektoptionen ein, welche Endung er nehmen soll.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: DLl erzeugen

Beitrag von pluto »

Ist es nicht sogar so, dass in DLLS / SO Dateien keine Klassen Möglich sind ? Oder täusche ich mich da ? Ich meine mal sowas in dieser Richtung gelesen zu haben.
MFG
Michael Springwald

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: DLl erzeugen

Beitrag von Hitman »

Wieso sollten in DLLs keine Klassen möglich sein? Exportieren kann man sie nicht und Referenzen auf sie sollte man auch nicht rausgeben - mangels einheitlichem Memory Manager und unterschiedlicher RTL. Gleiches gilt für dynamische Arrays und somit auch Strings.
Genau für diesen Fall gibt es allerdings die COM und CORBA-style Interfaces. Für Zeichenketten sollte man (gut durchdacht was die Verwaltung angeht ...) PChar nehmen, ähnlich für dynamische Arrays einfache Pointer.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: DLl erzeugen

Beitrag von pluto »

Wenn DLLS und SO Dateien verwenden werden sollen, sollen sie doch auch unter anderen Compilieren Funktionieren. Würde das dann immer noch mit Klassen und CO gehen ?
MFG
Michael Springwald

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: DLl erzeugen

Beitrag von Hitman »

Wie gesagt - was in der DLL abgeht ist vollkommen egal. Was nach außen hin passiert ist entscheidend --> Interfaces, PChar, Pointer ;-)

Benutzeravatar
theo
Beiträge: 10856
Registriert: Mo 11. Sep 2006, 19:01

Re: DLl erzeugen

Beitrag von theo »

pluto hat geschrieben:Wenn DLLS und SO Dateien verwenden werden sollen, sollen sie doch auch unter anderen Compilieren Funktionieren. Würde das dann immer noch mit Klassen und CO gehen ?
Man schreibt das interface dann einfach z.B. mit Handles

z.B. aus der Anwendersicht, z.B. von C aus:

AHandle=dll_myobj_create;
dll_myobj_setparam(AHandle,15);
APchar=dll_myobj_tuwas(AHandle);
printf(APChar);
dll_myobj_free(AHandle);

Pascal Intern kann man das AHandle dann als Objektreferenz behandeln.
Das ist natürlich für den Fall, dass man eine Pascal Klasse quasi für C zugänglich machen will. Sonst ist es egal.
Derselbe Ansatz wird verwendet, um C++ Klassen (z.B. Qt) für Pascal oder C zugänglich zu machen.

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: DLl erzeugen

Beitrag von Socke »

Hitman hat geschrieben:Wieso sollten in DLLs keine Klassen möglich sein? Exportieren kann man sie nicht und Referenzen auf sie sollte man auch nicht rausgeben - mangels einheitlichem Memory Manager und unterschiedlicher RTL. Gleiches gilt für dynamische Arrays und somit auch Strings.
Warum sollte man keine Referenz auf eine Objekt herausgeben? Solange das Programm die Referenz nicht als Objekt behandelt ist doch alles in Ordnung (ist das nicht das "Handle-Konzept"?). Wenn ein Programm eine Objektreferenz aus der Bibliothek direkt benutzen soll (d.h. als Objekt und nicht als Handle), muss die Klassen-Deklaration im Programm vorhanden sein. In der Theorie kann ich mir vorstellen, dass auch das bei dem selben Compiler (mit den selben Einstellungen) funktioniert. Das Fehlerpotential ist aber extrem hoch. Dazu gibts jede Menge zusätzlichen Aufwand, damit die Klasse nicht zweimal implementiert wird et cetera ad absurdum. Als Ergebnis: Es wäre theoretisch möglich aber kaum zu realisieren.

Wenn man den selben Memory-Manager (cmem unter Linux; sharedmem unter Windows?) verwendet (und damit Programm und Bibliothek rw-Zugriff auf den gesamten Speicher haben), sollte das austauschen von dynamischen Arrays und Strings auch kein Problem sein. Voraussetzung ist natürlich, dass alle Komponenten diese Datentypen gleich behandeln (sprich gleiche Compiler-/RTL-Version!).

Inwiefern besteht eigentlich die Möglichkeit Methoden direkt als Flat-API zu verwenden?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: DLl erzeugen

Beitrag von mschnell »

Hitman hat geschrieben:Exportieren kann man sie nicht und Referenzen auf sie sollte man auch nicht rausgeben - mangels einheitlichem Memory Manager und unterschiedlicher RTL.
Ich denke, Du kannst auch Klassen exportieren. Die ABI funktioniert natürlich nicht, wenn das Aufrufende Programm nicht auch ein FP-Programm ist. Die Klassen-Funktionen verwenden doch sicher den Memory-Manager, des Systems mit dem zusammen sie übersetzt sind.

-Michael

Antworten