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