Einzelnen Beitrag anzeigen

GreenHorn3600

Registriert seit: 24. Jun 2007
165 Beiträge
 
#1

To many consecutive execptions

  Alt 29. Aug 2009, 19:22
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
  Mit Zitat antworten Zitat