Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Für mich unerklärliche Access Violation (https://www.delphipraxis.net/145958-fuer-mich-unerklaerliche-access-violation.html)

Borschti 11. Jan 2010 14:15


Für mich unerklärliche Access Violation
 
Hallo,

wie der Titel schon sagt erhalte ich in meinem Programm eine für mich nicht nachvollziehbare Access Violation.

Also ich habe mehrere Klassen und Formulare in meinem Projekt, es sind aber nur 2 Klassen mit Formularen an der Access Violation beteiligt.

Hier mal ein paar Codeschnippsel:

Delphi-Quellcode:
procedure TFmOutlookImport.FormActivate(Sender: TObject);
var
  slSetLog : TStringList;
  SettingLog : TSettingLog;
  regSettings : TFmSettings;
  i : Integer;
begin
  if {ParamStr(1) = '\b'} true then
    begin
      SettingLog := TSettingLog.Create;
      slSetLog := SettingLog.OpenSettingLog(ExtractFilePath(Application.ExeName) + 'standSets.csv');//ParamStr(2));

      FmSettings.edtSets.Text := SlSetLog[0];
      FmSettings.edtExcelFilePath.Text := slSetLog[1];
      FmSettings.edtOutlookFilePath.Text := slSetLog[2];
      if slSetLog[3] = 'True' then
        begin
          FmSettings.edtOutlookBackupPath.Text := slSetLog[4];
        end else
          begin
            FmSettings.edtOutlookBackupPath.Text := 'Sicherung wird nicht erstellt.';
            FmSettings.checkSichShow.Checked := False;
          end;
      FmSettings.edtOutlookForm.Text := slSetLog[5];

      if slSetLog.Count >= 7 then
        begin
          FmSettings.edtEmailBetreff.Text := slSetLog[6];
          if slSetLog.Count >= 8 then
            begin
              FmSettings.lbEmailCCs.Clear;
              for i := 7 to slSetLog.Count - 1 do
                begin
                  FmSettings.lbEmailCCs.Items.Append(slSetLog[i]);
                end;
            end;
        end;

      regSettings.SetOutlookVerNr(FOutlookVerNr);
      regSettings.CreateRegFile(FmSettings.edtOutlookForm.Text+ '_' +IntToStr(FoutlookVerNr)); //Hier wird die Prozedur CreateRegFile die sich in der klasse TFmSettings befindet aufgerufen und hier kommt später auch die Fehlermeldung.
//Merkwürdig finde ich nur das ich vorher auch auf eine prozedur dieser Klasse zugreife, also SetOutlookVerNr dort aber keine Fehlermeldung bekomme.

      slSetLog.Destroy;
      SettingLog.Destroy;

      OutlookPro := TOutlookPro.Create(Self);
      OutlookPro.KontaktSchreiben(StatusBar);
      OutlookPro.Destroy;
      Close;
Hier sind nun meine prozeduren CreateRegFile die ich zuvor aufgerufen habe und die prozedur ExecRegFile die gleich mit aufgerufen wird. Bei der Funktion ShellExecute in der prozedur ExecRegFile bekomme ich nun die Fehlermeldung:'Im Projekt PrOutlookImport.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Accessvioaltion at adress 004671F in module 'PrOutlookImport.exe'. Read of adress 000001B4' aufgetreten.
Delphi-Quellcode:
procedure TFmSettings.CreateRegFile(fileName : String);
var
  slBatFile : TStringlist;
begin
  slBatFile := TStringList.Create;
  slBatFile.Add('regedit /s ' + fileName + '.reg');
  slBatFile.SaveToFile(ExtractFilePath(Application.ExeName) + fileName + '.bat');
  slBatFile.Destroy;

  ExecRegFile(fileName);
end;

procedure TFmSettings.ExecRegFile(fileName : String);
var
  e: Integer;
  test : String;
begin
  e := ShellExecute(Handle, NIL,
                    PCHAR(ExtractFilePath(Application.ExeName) + fileName + '.bat'),
                    PCHAR(''), NIL, SW_SHOW); //Hier die Fehlermeldung

  if (e<=32) then
    begin
      ShowMessage('Fehler: Batch-Datei konnte nicht ausgeführt werden!')
    end
end;
Woran kann das liegen? Ich habe schon probiert das erzeugen des Formulars FmSettings im Projekt Quellcode vor das erzeugen des Formulars FmOutlookImport zu setzen, daran lag es aber nicht, wäre auch unlogisch da ja die prozedur SetOutlookVerNr auch ohne Probleme aufgerufen werden kann. Auch die schreibweise der durch ShellExecute aufzurufenden Datei ist vollkommen richtig. Ich weiß nicht woran es sonst noch liegen könnte. Wenn ich diese ganzen Schritte über einen Buttonklick ausführen lasse funktioniert alles wunderbar wie man hier sehen kann:

Delphi-Quellcode:
procedure TFmOutlookImport.Importierenstarten1Click(Sender: TObject);
var
  OutlookPro : TOutlookPro;
  regSettings : TFmSettings;
  outlookVerNr : Integer;
begin
  OutlookPro := TOutlookPro.Create(Self);
  regSettings.CreateRegFile(FmSettings.edtOutlookForm.Text+ '_' +IntToStr(FoutlookVerNr));
  OutlookPro.KontaktSchreiben(StatusBar);
  OutlookPro.Destroy;
  Close;
end;
lg Alex

dataspider 11. Jan 2010 15:52

Re: Für mich unerklärliche Access Violation
 
Hi,

ich weiß zwar nicht, ob es das Problem ist.
Aber mir fällt spontan auf, dass du alle Objekt durch Aufruf des Destructors freizugeben versuchst.
Das würde ich erst mal ändern. (also Free anstatt Destoy)

Frank

mkinzler 11. Jan 2010 15:54

Re: Für mich unerklärliche Access Violation
 
Schau doch mal im Debugger, in welcher Zeile der Fehler auftritt

Borschti 11. Jan 2010 16:20

Re: Für mich unerklärliche Access Violation
 
Hi,

also der Fehler tritt beim Ausführen von ShellExecute in der procedure ExecRegFile auf, habe ich auch auskommentiert.

@Dataspider: Das werde ich mal ausprobieren, danke :)

Borschti 11. Jan 2010 16:25

Re: Für mich unerklärliche Access Violation
 
@Dataspider: Daran lag es leider nicht, gibt es denn noch andere vorschläge? :(

Uwe Raabe 11. Jan 2010 16:26

Re: Für mich unerklärliche Access Violation
 
Die Variable regSettings ist innerhalb der Methode lokal und wird nicht initialisiert. Verwunderlich ist also eigentlich wenn kein Fehler auftaucht!

p80286 11. Jan 2010 16:27

Re: Für mich unerklärliche Access Violation
 
Glaub ich Dir:
Zitat:

Delphi-Quellcode:
var
  e: Integer;
  test : String;
begin
  e := ShellExecute(Handle, NIL,
                    PCHAR(ExtractFilePath(Application.ExeName) + fileName + '.bat'),
                    PCHAR(''), NIL, SW_SHOW); //Hier die Fehlermeldung

Wenn Du jetzt noch Handle "ordentlich" definierst, sollte es klappen

Zitat:

hwnd

Specifies a parent window. This window receives any message boxes that an application produces. For example, an application may report an error by producing a message box.
Gruß
K-H

Luckie 11. Jan 2010 16:29

Re: Für mich unerklärliche Access Violation
 
Also ShellExecute kannst du schon mal ausschließen, das wirft keine Exception. Wahrscheinlich tritt der Fehler in dem Aufruf davor aus. Überprüfe mal im Debugger, ob auch alle Objekte instantiiert werden.


Zitat:

Zitat von p80286
Glaub ich Dir:
Zitat:

Delphi-Quellcode:
var
  e: Integer;
  test : String;
begin
  e := ShellExecute(Handle, NIL,
                    PCHAR(ExtractFilePath(Application.ExeName) + fileName + '.bat'),
                    PCHAR(''), NIL, SW_SHOW); //Hier die Fehlermeldung

Wenn Du jetzt noch Handle "ordentlich" definierst, sollte es klappen

Was ist daran auszusetzen? Da es sich um eine Methode der Form handelt, handelt es sich um [/i]Handle[i] um das Handle des Formulares.

p80286 11. Jan 2010 16:31

Re: Für mich unerklärliche Access Violation
 
Ok, übersehen!
Omnia mea Culpa

K-H

Uwe Raabe 11. Jan 2010 16:37

Re: Für mich unerklärliche Access Violation
 
Zitat:

Zitat von Luckie
Überprüfe mal im Debugger, ob auch alle Objekte instantiiert werden.

Dazu braucht's aber keinen Debugger - das sieht man auch so, das regSettings (das Formular) nicht instanziiert wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:18 Uhr.
Seite 1 von 2  1 2      

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