Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi To many consecutive execptions (https://www.delphipraxis.net/139484-many-consecutive-execptions.html)

GreenHorn3600 29. Aug 2009 19:22


To many consecutive execptions
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:29 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