AGB  ·  Datenschutz  ·  Impressum  







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

TObject, DLL, DLL Freigabe

Ein Thema von haentschman · begonnen am 14. Mär 2014 · letzter Beitrag vom 14. Mär 2014
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#1

TObject, DLL, DLL Freigabe

  Alt 14. Mär 2014, 11:48
Hallo Alle...

Der Titel ist nur eine Stichwortsammlung.

1. Gegeben:
Datenobjekte (unwichtiges entfernt)
Delphi-Quellcode:
TMasterDeviceVersion = class
  strict private
  var
    FModel: string;
    FAppVersion: string;
    FSysVersion: string;
  public
    property Model: string read FModel write FModel;
    property AppVersion: string read FAppVersion write FAppVersion;
    property SysVersion: string read FSysVersion write FSysVersion;
  end;

TMasterDevice = class
  strict private
    FVersion: TMasterDeviceVersion;
  public
    constructor Create;
    destructor Destroy; override;
    property Version: TMasterDeviceVersion read FVersion write FVersion;
    ...
  end;
.
.
constructor TMasterDevice.Create;
begin
  FVersion:= TMasterDeviceVersion.Create;
end;

destructor TMasterDevice.Destroy;
begin
  FVersion.Free;
  inherited;
end;
2.Gegeben:
Auszug aus DLL
Delphi-Quellcode:
procedure ParseVersion(const aText: PChar; MasterVersion: TMasterDeviceVersion); stdcall;
var
  sl: TStringList;
  I, J: Integer;
begin
  sl:= TStringList.Create;
  try
    sl.Text:= aText;
    for I:= 0 to sl.Count - 1 do
    begin
      if AnsiStartsText('var verAp', sl[I]) then
      begin
        for J:= 12 to Length(sl[I]) do
        begin
          if sl[I][J] = ' then
          begin
            MasterVersion.Model:= Copy(sl[I], 12, J - 12);
            MasterVersion.AppVersion:= Copy(sl[I], J + 1, Length(sl[I]) - J - 2);
            Break;
          end;
        end;
      end;
      if AnsiStartsText('var verSist', sl[I]) then
      begin
        MasterVersion.SysVersion:= Copy(sl[I], 14, Length(sl[I]) - 15);
      end;
    end;
  finally
    sl.Free;
  end;
end;
Problem:
1. Die Instanz von TMasterDevice wird im Hauptthread erzeugt
2. Die DLL wird dynamisch geladen
3. Der DLL Procedure wird der "Text" und die MasterVersion übergeben.
4. Wenn die Procedure Parse Version zurückkommt sind alle Versions Properties korrekt gefüllt.
5. Wenn ich nun die DLL freigebe steht in MasterVersion nur Müll drin. Im Master Objekt, welches auch über die DLL gefüllt wird ist alles noch korrekt.

Kann mir einer die Ursache erklären?

Nachtrag:

Aufruf der Procedure aus der DLL
Delphi-Quellcode:
if LoadMessage.Data > 'then
begin
  FParseVersion(PChar(LoadMessage.Data), FMasterDevice.Version);
  if FMasterDevice.Version.AppVersion > 'then // hier ist korrekt gefüllt... Basis DLL geladen
  begin
    LoadMasterDeviceDLL; // gibt ein vorhandenes DLL Handle (Basis DLL) frei und lädt die passende DLL nach Version
  end;
  if Assigned(FOnVersion) then // hier steht dann Müll im FMasterDeviceVersion direkt nach der Freigabe in LoadMasterDeviceDLL
    FOnVersion(self, True);
end

Geändert von haentschman (14. Mär 2014 um 11:59 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TObject, DLL, DLL Freigabe

  Alt 14. Mär 2014, 12:00
Wenn Du Delphi Objekte im Interface zwischen Hauptprogramm und Bibliothek verwenden willst darfst Du keine Dlls sondern musst Bpls verwenden. Oder du musst ein "flache" Schnittstelle verwenden.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#3

AW: TObject, DLL, DLL Freigabe

  Alt 14. Mär 2014, 12:23
Danke für deine Antwort.

Solange ich die DLL nur mit dem Delphi Programm benutze soll es keine Probleme geben. Es funktioniert ja auch, solange die DLL geladen bleibt. Da aber das Objekt im Hauptthread erzeugt wird verstehe ich nicht wieso die Freigabe der DLL den Inhalt beeinflußt.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: TObject, DLL, DLL Freigabe

  Alt 14. Mär 2014, 13:42
Ich versuchs mal mit meinen bescheidenen Wissensstand:
Es sind zwei verschiedene Speichermanager!
Einer in der Anwendung, einer in der DLL.
Die Strings (AppVersion, Model...) unterliegen den Speichermanager der DLL.
Wenn die DLL entladen wird, werden auch alle referenzgezählten Typen darin freigeben, also die Strings!
Ergebnis: Du hast im MasterVersion-Objekt in deiner Anwendung zwar noch gültige Adressen auf irgendwelche Speicherbereiche, aber da steht jetzt was anderes bzw. Müll drin.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#5

AW: TObject, DLL, DLL Freigabe

  Alt 14. Mär 2014, 13:58
Danke erstmal
Zitat:
Die Strings (AppVersion, Model...) unterliegen den Speichermanager der DLL.
Ich glaube ja auch das es daran liegt. Aber wieso? Die gehören zu dem Objekt welches im Hauptthread erzeugt wurde. Liegt es daran, daß der Text über eine Stringlist aufbereitet wird welche in der DLL erzeugt wird? Da müßte aber schon beim Freigeben der Stringlist Müll drinstehen.

Geändert von haentschman (14. Mär 2014 um 14:02 Uhr)
  Mit Zitat antworten Zitat
schöni

Registriert seit: 23. Jan 2005
Ort: Dresden
445 Beiträge
 
Delphi 7 Personal
 
#6

AW: TObject, DLL, DLL Freigabe

  Alt 14. Mär 2014, 14:10
Ich versuchs mal mit meinen bescheidenen Wissensstand:
Es sind zwei verschiedene Speichermanager!
Einer in der Anwendung, einer in der DLL.
Die Strings (AppVersion, Model...) unterliegen den Speichermanager der DLL.
Wenn die DLL entladen wird, werden auch alle referenzgezählten Typen darin freigeben, also die Strings!
Ergebnis: Du hast im MasterVersion-Objekt in deiner Anwendung zwar noch gültige Adressen auf irgendwelche Speicherbereiche, aber da steht jetzt was anderes bzw. Müll drin.
Heißt das, das bei der BPL ein Speichermanager für alles zuständig ist, während bei der gewöhnlichen dll 2 verschieden sind. Ich diskutier gerade beim Lazaurs 1.2 Thread mit, dort geht es um die notwendige Neuübersetzung der IDE bei Installation neuer Komponenten. Ist also das Speichermanagerproblem einer der Gründe dafür?

@mkinzler: Was ist eine "flache Schnittstelle"?
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: TObject, DLL, DLL Freigabe

  Alt 14. Mär 2014, 14:16
Ich versuchs mal mit meinen bescheidenen Wissensstand:
Es sind zwei verschiedene Speichermanager!
Einer in der Anwendung, einer in der DLL.
Die Strings (AppVersion, Model...) unterliegen den Speichermanager der DLL.
Wenn die DLL entladen wird, werden auch alle referenzgezählten Typen darin freigeben, also die Strings!
Ergebnis: Du hast im MasterVersion-Objekt in deiner Anwendung zwar noch gültige Adressen auf irgendwelche Speicherbereiche, aber da steht jetzt was anderes bzw. Müll drin.
Heißt das, das bei der BPL ein Speichermanager für alles zuständig ist, während bei der gewöhnlichen dll 2 verschieden sind.
Ja.

Zitat:
@mkinzler: Was ist eine "flache Schnittstelle"?
Die einzelnen Teile gesondert. Bzw. über ein Interface
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#8

AW: TObject, DLL, DLL Freigabe

  Alt 14. Mär 2014, 14:23
@mkinzler

Kannst du mal skizzieren wie ich eine DLL über ein Interface anbinde und keine "Speicher" Probleme habe. Wenn ich mir von der DLL das Interface auf die "Proceduren" geben lasse ist das Speicherproblem Geschichte?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: TObject, DLL, DLL Freigabe

  Alt 14. Mär 2014, 14:36
Im Grunde sehr einfach:
Delphi-Quellcode:
  IMasterDeviceVersion = interface
  ['{DF6962EE-B638-4B59-9BE6-82B8BB369477}']
    function GetAppVersion: WideString;
    function GetModel: WideString;
    function GetSysVersion: WideString;
    procedure SetAppVersion(const Value: WideString);
    procedure SetModel(const Value: WideString);
    procedure SetSysVersion(const Value: WideString);

    property Model: WideString read GetModel write SetModel;
    property AppVersion: WideString read GetAppVersion write SetAppVersion;
    property SysVersion: WideString read GetSysVersion write SetSysVersion;
  end;

  TMasterDeviceVersion = class(TInterfacedObject, IMasterDeviceVersion)
  strict private
    var
      FModel: WideString;
      FAppVersion: WideString;
      FSysVersion: WideString;
    function GetAppVersion: WideString;
    function GetModel: WideString;
    function GetSysVersion: WideString;
    procedure SetAppVersion(const Value: WideString);
    procedure SetModel(const Value: WideString);
    procedure SetSysVersion(const Value: WideString);
  public
    property Model: WideString read GetModel write SetModel;
    property AppVersion: WideString read GetAppVersion write SetAppVersion;
    property SysVersion: WideString read GetSysVersion write SetSysVersion;
  end;
Und dann:
Delphi-Quellcode:
procedure ParseVersion(const aText: PChar; MasterVersion: IMasterDeviceVersion); stdcall;
//
Du darfst dann natürlich auch in der Anwendung nur noch mit IMasterDeviceVersion usw. arbeiten.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#10

AW: TObject, DLL, DLL Freigabe

  Alt 14. Mär 2014, 14:42
Danke, das ist wirklich zu einfach. Warum nicht gleich so?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 12:20 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