Einzelnen Beitrag anzeigen

Borschti

Registriert seit: 1. Nov 2007
Ort: Marburg Lahn
235 Beiträge
 
Delphi 2007 Professional
 
#1

Für mich unerklärliche Access Violation

  Alt 11. Jan 2010, 14:15
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] = 'Truethen
        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
  Mit Zitat antworten Zitat