AGB  ·  Datenschutz  ·  Impressum  







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

Komplettes Projekt in DLL auslagern

Ein Thema von PierreB · begonnen am 6. Feb 2006 · letzter Beitrag vom 3. Dez 2006
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#11

Re: Komplettes Projekt in DLL auslagern

  Alt 3. Dez 2006, 09:43
für mich klingeln die Fehler als wären Strings oder Objekte zwischen DLL und Haupprogramm ohne ShareMem ausgetauscht worden.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#12

Re: Komplettes Projekt in DLL auslagern

  Alt 3. Dez 2006, 09:48
Zitat von SirThornberry:
für mich klingeln die Fehler als wären Strings oder Objekte zwischen DLL und Haupprogramm ohne ShareMem ausgetauscht worden.
ist dies auch der Fall, wenn man zwischen Hauptprogramm und DLL nur Shortstrings also strings[255] verwendet?
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Balu der Bär
(Gast)

n/a Beiträge
 
#13

Re: Komplettes Projekt in DLL auslagern

  Alt 3. Dez 2006, 09:56
Nein, auch mit eingebundener ShareMem bleiben die bösen Fehler am Ende.
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#14

Re: Komplettes Projekt in DLL auslagern

  Alt 3. Dez 2006, 10:59
Zitat von Balu der Bär:
Nein, auch mit eingebundener ShareMem bleiben die bösen Fehler am Ende.
Im Gegensatz zu Packages sind DLLs eigenständige Binaries. Sie enthalten also ihre eigene Implementierung eines MemoryManagers[1] und wenn nicht anders angegeben enthalten sie ihre eigene Version der RTL, aller verwendeten Unit und eigentlich allem was Delphi zu Delphi macht.
Wenn du ein Form aus einer DLL lädst hast du 3 Möglichkeiten.
  • Du referenzierst die benötigten Packages (RTL,VCL,XXX) in Exe und DLL extern. Dadurch ist ein TObject für Echse und DLL das gleiche. Genau wie TObject und alles andere in den extern gelinkten Packages.
    Das bedeutet aber, dass du die DLL immer mit der gleichen Compilerversion wie bei der Echse kompilieren musst.
  • Du benutzt Interfaces.
    Damit bist du kompatibel zwischen Sprachen und Delphi Versionen, da sich Interfaces in Delphi generell an COM-Pflichten halten und somit zwangläufig kompatibel sind.
    Du kannst damit auch easy die Abhängigkeit auf ShareMem los werden. Indem du anstatt Strings, WideStrings nimmst.
    WideString werden von Windows selbst verwaltet.
    IMHO sind Interfaces in Delphi32 fast immer die netteste Art Funktionalität bereit zu stellen.
    Dank autom. Referenzzählung muss sich der konsumierende Code auch nicht mehr mit widerlichen try-finally Blöcken ärgern.
  • Du gibst nur ein Handle auf dein Fenster zurück und arbeitest nur mit API-Funktionen.
    Dadurch gibt es keine Vermischung von unterschiedlichen Implementierungen der RTL.
Verion1 ist die, die am einfachten ist. Aber sie zwingt dich mindestens RTL und VCL extern mitzugeben.
Lösung 2 erfordert einen Wrapper, der ein Interface implementiert. Aber nach diesem Mini-Schnipsel bist absolut unabhängig und kannst auch D7 kompilierte DLLs mit 2006 benutzen und vice versa.
Lösung 3 ist IMHO absolut furchtbar, auch wenn die WinAPI-Fritzen da sicherlich anderer Meinung wären.





[1]den Punkt hast du mit ShareMem schon gelöst
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#15

Re: Komplettes Projekt in DLL auslagern

  Alt 3. Dez 2006, 11:07
Kannst Du mir ein Beispiel geben wie, so ein Wrapper aussehen könnte?

Die DLL wurde mit D7 Prof. erstellt und sollte dann in TDE verwendet werden...
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#16

Re: Komplettes Projekt in DLL auslagern

  Alt 3. Dez 2006, 14:08
Zitat von GuenterS:
Kannst Du mir ein Beispiel geben wie, so ein Wrapper aussehen könnte?

Die DLL wurde mit D7 Prof. erstellt und sollte dann in TDE verwendet werden...
Kein Problem.
Ich habe mich aber zurückgehalten, da ich keine Lust hatte mir was sinnvolles auszudenken.
Man nehme eine Form in D7, die Ein Edit, einen Button und eine ListBox hat.
Drücke ich den Button wird der Inhalt an die LB gehängt.
Das ganze könnte man so als Interface verpacken um diese Funktionalität anderen zur Verfügung zu stellen ohne dass sie etwas über TObject, AnsiStrings oder die VCL wissen müssten:
Delphi-Quellcode:
unit uDllFormInterfaces;

interface
uses
  Windows;

type
  IDllForm = interface(IUnknown)
  ['{CE9CD182-13A2-4DAE-B7AA-ED8A8100B8A4}']
    function get_Caption : WideString; stdcall;
    procedure set_Caption(const value : WideString); stdcall;

    function get_Item(aIndex : Integer) : WideString; stdcall;
    procedure set_Item(aIndex : Integer; const value : WideString); stdcall;

    function get_Handle : HWnd; stdcall;

    function AddLine(const line : WideString) : Integer; stdcall;

    procedure Show; stdcall;
    function ShowDialog : Integer; stdcall;
    procedure Hide; stdcall;


    property Caption : WideString
      read get_Caption
      write set_Caption;
    property Item[aIndex : Integer] : WideString
      read get_Item
      write set_Item;
    property Handle : HWnd
      read get_Handle;
  end;
Verpacken könnte man es so:
Delphi-Quellcode:
uses
  uDllFormInterfaces,
  uDllForm,
  Windows;

type
  TDllFormWrapper = class(TInterfacedObject, IDllForm)
  private
    fForm: TDllForm;
  protected
    function get_Caption: WideString; stdcall;
    function get_Item(aIndex: Integer): WideString; stdcall;
    procedure set_Caption(const value: WideString); stdcall;
    procedure set_Item(aIndex: Integer; const value: WideString); stdcall;
    property Form : TDllForm read fForm;
    function get_Handle: HWnd; stdcall;
  public

    function AddLine(const line: WideString): Integer; stdcall;

    property Caption : WideString
      read get_Caption
      write set_Caption;
    property Item[aIndex : Integer] : WideString
      read get_Item
      write set_Item;
    property Handle : HWnd
      read get_Handle;

    constructor Create;
    destructor Destroy; override;

    procedure Hide; stdcall;
    procedure Show; stdcall;
    function ShowDialog : Integer; stdcall;

  end;

  function CreateDllForm : IDllForm; stdcall;

implementation

uses
  Dialogs;

function CreateDllForm : IDllForm;
begin
  result := TDllFormWrapper.Create();
end;

{ TDllFormWrapper }

constructor TDllFormWrapper.Create;
begin
  inherited;
  fForm := TDllForm.Create(nil);
end;

destructor TDllFormWrapper.Destroy;
begin
  fForm.Free();
  ShowMessage('freed!'); // weil manche nicht an RefCounting glauben ;-)
  inherited;
end;

function TDllFormWrapper.AddLine(const line: WideString): Integer;
begin
  result := Form.ListBox1.Items.Add(line);
end;

function TDllFormWrapper.get_Caption: WideString;
begin
  result := Form.Caption;
end;

function TDllFormWrapper.get_Item(aIndex: Integer): WideString;
begin
  result := Form.ListBox1.Items[aIndex];
end;

procedure TDllFormWrapper.set_Caption(const value: WideString);
begin
  Form.Caption := value;
end;

procedure TDllFormWrapper.set_Item(aIndex: Integer;
  const value: WideString);
begin
  Form.ListBox1.Items[aIndex] := value;
end;

procedure TDllFormWrapper.Hide;
begin
  Form.Hide();
end;

procedure TDllFormWrapper.Show;
begin
  Form.Show();
end;

function TDllFormWrapper.ShowDialog : Integer;
begin
  result := Form.ShowModal();
end;

function TDllFormWrapper.get_Handle: HWnd;
begin
  result := Form.Handle;
end;
Ich habe eine Screenie angehängt, der zeigt dass es geht und beide Mini-Projekte.
Miniaturansicht angehängter Grafiken
screenie_146.png  
Angehängte Dateien
Dateityp: zip dllforms_137.zip (50,0 KB, 25x aufgerufen)
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Balu der Bär
(Gast)

n/a Beiträge
 
#17

Re: Komplettes Projekt in DLL auslagern

  Alt 3. Dez 2006, 18:36
Danke dir Robert, mal gucken inwieweit ich das in meinem Programm umsetzen kann.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 14:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz