Hallo Wissende,
irgendwie, scheine ich heute Pech zu haben, Delphi hat was gegen mich. Ich habe ein kleines Testprojekt:
Delphi-Quellcode:
{$APPTYPE CONSOLE}
...
var
exec: TWUSExecutor;
logg: TWUSNoLog;
begin
try
exec := TWUSExecutor.Create;
try
Logg := TWUSNoLog.Create;
try
exec.TempPath := ExtractFilePath(paramstr(0));
// logg.CreateLog(exec.TempPath, '');
exec.Logger := logg
as TWUSNoLog;
exec.RunApplicationName := IncludeTrailingPathDelimiter(ExtractFilePath(paramstr(0)))
+ '
ExecTest.exe';
exec.Parameters('
p1@p2@p3@http://nixda');
exec.Run;
finally
logg.Free;
end;
finally
exec.Free;
end;
except
on E:
Exception do
Writeln(E.Classname, '
: ', E.
Message);
end;
end.
wenn dann der executor ausgeführt wird, bringt er mir an der Stelle:
Delphi-Quellcode:
procedure WinRun;
begin
fState := wusUSDoExecute;
fWUSLogger.LogWrite(fState, fRunApplicationName); //<<< hier die Meldung: .. to many ...
if WUSWindows.Execute(fRunApplicationName, fParameters) then
"... to many consecutive exceptions: 'access violation at 0x00000000: read of address 0x00000000'"
dabei ist fWUSLogger im Executor folgendermassen definiert:
Delphi-Quellcode:
TWUSExecutor = class
strict private
...
fWUSLogger: TWUSBaseLogger; //Logger
...
public
...
property Logger: TWUSBaseLogger read fWUSLogger write fWUSLogger;
...
end;
und die Logger:
Delphi-Quellcode:
TWUSBaseLogger = class
private
fLogging: boolean; //Logging On or Off
public
constructor Create;
destructor Destroy; override;
procedure Clear;
procedure LogWrite(const aState: TWUSUpdateState; const aMessage: String); virtual; abstract;
property Logging: boolean read fLogging;
end;
TWUSNoLog = Class(TWUSBaseLogger)
public
procedure LogWrite(const aState: TWUSUpdateState; const aMessage: String); Override;
End;
Wenn ich an der Fehlerstelle nachsehe, welchen Wert Logger.LogWrite hat, so verweisst sie auf die Addresse $0, sie sollte aber doch bei der Zuweisung auf die Addresse der Instanz zeigen, welche ich im Testprogramm dem Executor übergeben habe. Weshalb, wird die Addresse unterschlagen?
Wenn ich über den selben Mechanismus, in einer Klasse den Logger weiterreiche, geht das einwandfei.
Weiss jemand Rat?
Danke schon mal,
Greeny