Einzelnen Beitrag anzeigen

Benutzerbild von haentschman
haentschman
Online

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