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