AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Benutzen von Klassen aus einer DLL

Ein Thema von moelski · begonnen am 14. Sep 2010 · letzter Beitrag vom 14. Sep 2010
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.400 Beiträge
 
Delphi 12 Athens
 
#1

AW: Benutzen von Klassen aus einer DLL

  Alt 14. Sep 2010, 07:25
Nein, selbst wenn du es implementierst (in der DLL), es dann in der DLL aber nicht benutzt, dann wird dieses vom Compiler wegoptimiert.
Nun hast du ja nocheine Implementation dieser Klasse in der EXE, wo du nun diese Funktion nutzen willst und dieses hat seine eigene RTTI und weiß von der Wegoptimierung nix.

Delphi-Quellcode:
function Met1; virtual/overload;
procedure Met2; virtual/overload;
procedure Met3; virtual/overload;
z.B.
in DLL alles irgendwie implementiert (eventuell auch erst in Nachfahren), aber nur einen Teil irgendwo verwendet/verlinkt.

In der Exe willst du aber dieses, alles oder nur'n anderen Teil nutzen.

also, in der DLL:
VMT-Index 0 = Met1
VMT-Index 1 = Met3

in der EXE:
VMT-Index 0 = Met1
VMT-Index 1 = Met2
VMT-Index 2 = Met3

Ruft man hier in der Met2 auf, dann wird in der DLL dafür aber Met3 ausgeführt.
Und bei Met3 knallt es sowieso, da es da nix gibt.

Wenn in der DLL garnichts irgendwie eingebunden ist, dann seht auch nichts in dieser VMT.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#2

AW: Benutzen von Klassen aus einer DLL

  Alt 14. Sep 2010, 07:42
Hmm so ganz bin ich noch nicht bei dir.

Zitat:
Nein, selbst wenn du es implementierst (in der DLL), es dann in der DLL aber nicht benutzt, dann wird dieses vom Compiler wegoptimiert.
Woher will denn der Compiler wissen was er wegoptimieren darf?
Da ich hier eine Klasse implementiere kann er doch erstmal gar nicht wissen was ich später in der EXE davon verwenden werde

Könntest du evtl. das Beispiel prog (Posting 1) mal so umbauen, das es zu der von dir beschriebenen Fehlfunktion kommt?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.400 Beiträge
 
Delphi 12 Athens
 
#3

AW: Benutzen von Klassen aus einer DLL

  Alt 14. Sep 2010, 09:10
Alles, was nicht in diesem Modul (EXE/DLL) verwendet wird, wird nicht mit einkompiliert.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#4

AW: Benutzen von Klassen aus einer DLL

  Alt 14. Sep 2010, 09:18
Moin !

Delphi-Quellcode:
library Device;

uses
  SysUtils, Dialogs, ShareMem,
  Classes,
  Obj_Unit in 'Obj_Unit.pas',
  nrclasses, nrcomm;

type
  TMWSt98 = class(TMWSt)
  private
    FMWStSatz : Real;
  public
    constructor Create;
    function GetBrutto (const aNetto : Currency): Currency; override;
    procedure SetPercent(const aPercent : Integer); override;
    Function ShowPortInfo : string; override;
  end;

constructor TMWSt98.Create;
begin
  inherited Create;
  FMWStSatz := 1.15;
  Assert(MWST_VERSION = 1, 'Falsche Unit-Version!');

// nrcomm := TNrComm.Create(nil);
end;

function TMWSt98.GetBrutto(const aNetto: Currency): Currency;
begin
  Result := aNetto * FMWStSatz;
  ShowMessage(comm.ComName);
end;

procedure TMWSt98.SetPercent(const aPercent : Integer);
begin
  FMWStSatz := 1.0 + (aPercent/100);
end;

Function TMWSt98.ShowPortInfo : string;
var Output : string;
begin
  Comm.EnumPorts := epFullInfo;
  Comm.Update;
  output := comm.ComName + #13#10 +
                    Comm.Device[comm.DeviceIndex].RegKey;
  Formular.Memo1.Lines.Add(output);
  ShowPortInfo := Output;
end;

{ Schnittstellenprozedur }
function CreateMWStObj: TMWSt98; stdcall;
begin
  Result := TMWSt98.Create;
end;

{ Export der Schnittstellenprozedur }
exports
  CreateMWStObj; // resident;

begin
  { nichts zu tun }
end.
Zitat:
Alles, was nicht in diesem Modul (EXE/DLL) verwendet wird, wird nicht mit einkompiliert.
Mag sein das ich heute morgen aufm Schlauch stehe, aber von den Klassenmethoden wird in der DLL nix genutzt. Müsste das dann nicht wegoptimiert werden
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Benutzen von Klassen aus einer DLL

  Alt 14. Sep 2010, 12:29
Moin !

Je länger ich mit dem DLL Thema rumprobiere, desto mehr komme ich zu dem Entschluss, keine DLLs zu verwenden

Egal wie man es angeht, man stößt doch immer wieder auf Probleme die man eigentlich nicht haben mag.

Im Grunde wollte ich mit den DLLs Programmteile auslagern weil sie für bestimmte User unnötig sind. Aber mir ist eben eine Idee gekommen wie man es auch anders lösen könnte.

Man könnte ja bestimmte Klassen bzw. Bereiche in der Anwendung in eine Compiler Direktive verpacken. In etwa so:
Delphi-Quellcode:
  {$Define TESTMODE}
  text := 'We are in test mode';

  // Display the value of text if we are in test mode
  {$IfDef TESTMODE}
  ShowMessage('text = '+text);
  {$EndIf}
Dann könnte man Anwendungen mit unterschiedlichem Funktionsumfang erstellen lassen.

Da das aber hier total OT wird werde ich dazu mal ein anderes Thema eröffnen.

Danke jedenfalls an alle hier im Thread für die Erklärungen !
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz