Einzelnen Beitrag anzeigen

Pfl

Registriert seit: 5. Jun 2012
Ort: Berlin
65 Beiträge
 
Delphi XE6 Architect
 
#1

Hilfe bei AccessViolation

  Alt 2. Dez 2014, 20:42
Hallo, liebe Community,

ich bin heute beim Ausführen meines Programmes auf folgenden Fehler gestoßen :

'Zugriffsverletzung in 0x0084931b: lesen von Adresse 0x000003e0, Prozess easl_vcl.exe (7276).

Hier der Source :
Delphi-Quellcode:
procedure TForm_main.FormCreate(Sender: TObject);
var
  project: TProjectFile;
  domfile: file of TProjectFile;
begin
  // Verzeichnis fuer Temp. Dateien und Sicherungen
  cstore_temp := ExpandEnvStr('%Appdata%\EA\Monetalis\.$$$');
  // Verzeichnis fuer Lizenzen, Projektdateien
  cStore_TODO := ExpandEnvStr('%Appdata%\EA\Monetalis\.TODO');

  // Index fuer StringGrid
  i := 1;

  // DOM-Datei erzeugen
  project.ver := GetVersion; // Welche Programmversion ?
  project.licensecounter := 0; // Angefangen wird bei 0 Lizenzen
  project.datec := date; // Aktuelles Datum wird bei erneutem Laden ausgelesen
  project.datem := date - 60; // 60Tage Laufzeit bei Testversionen
  project.fileinfo := 'MONETALIS LicenseManager Project'; // Beschreibung
  project.erkennung := 'DOM'; // Char fuer die ersten Bytes
  project.index := i; // wird erhoeht, sobald Programm ein neues Projekt erzeugt
  project.serial := ''; // noch leer; wird aus Array gefuellt

  try
    AssignFile(domfile, cStore_TODO + '\' + datetostr(date) + '.dom');
    // in .TODO ablegen

    Rewrite(domfile); // erneut schreiben (in RAM)
    write(domfile, project); // abschliessen
  finally
    CloseFile(domfile); // Datei "schließen", also auf Platte schreiben

    // kopieren nach temp
    CopyFile(pchar(cStore_TODO + '\' + datetostr(date) + '.dom'),
      pchar(cstore_temp + '\' + datetostr(date) + '.dom'), False)
  end;

  // ---------------------------------------------------------------------------

  // PC-Name ermitteln
  form_main.Caption :=
    ' Monetalis FinanzV | Graphischer Lizenzmanager EA 2014 [ ' +
    GetComputername + ' ]';
  StatusBar1.Panels[1].Text := 'PC: ' + GetComputername;
  // ---------------------------------------------------------------------------

  // ***************************************************************************

  // StringGrid erhält seine Indices von 0 aufwärts
  while length(trim(StringGrid1.Cells[2, i])) > 0 do
  begin
    inc(i);
  end;
  reg := TRegistry.Create(KEY_READ); // nur lesen
  { Teilweises auslesen des Registry-Schlüssels,der die Aktivierungsdaten ethält }
  reg.RootKey := HKEY_LOCAL_MACHINE;
  // HKLM (nur Admins dürfen lesen und schreiben)
  reg.OpenKey('SOFTWARE\EA\MonetalisFV\LM\2014', true);

  // ---------------------Einstellungen lesen--------------------

  { TODO -o EA Berlin -c Einstellungen : Einstellungen werden noch nicht wirksam! }

  ini := TIniFile.Create(cStore_TODO + 'user_defined.sol'); // erzeugen in RAM
  try
    if ini.readString('StringGrid1', 'ColorHighlighting', '') = 'Ythen
      Formsettings.colorset.Checked := true
      // wenn Y in der Ini-Datei als Wert steht, dann Haken setzen
    else
      Formsettings.colorset.Checked := False;
    // andernfalls (also ein N in der Datei), dann kein Haken

    if ini.readString('VisualEffect', 'Design', '')
      = Formsettings.designauswahl.Items.Text then
      Formsettings.CheckBox1.Checked := true
      // Prinzip s. vorherige Abfrage; anstelle dessen hier :
      // die Oberflaeche des Programmes betreffend
    else
      Formsettings.CheckBox1.Checked := False;
  finally
    ini.free; // Objekt freigeben, sonst EInvalidPointer except.
  end;


  // ---------------------Testversion----------------------------

  StringGrid1.Cells[1, i] := reg.readString('Product'); // Produkt
  // Seriennummer der Testversion
  StringGrid1.Cells[2, i] := reg.readString('TL');
  StringGrid1.Cells[3, i] := reg.readString('LNr');
  StringGrid1.Cells[4, i] := datetostr(reg.ReadDate('ExpDate'));
  // ggf. DateTimeToStr()
  // Ablaufdatum
  StringGrid1.Cells[5, i] := reg.readString('PCName');
  // PC-Name

  // ***************************************************************************

  // ---------------------Vollversion----------------------------
  StringGrid1.Cells[1, i] := reg.readString('Product');
  StringGrid1.Cells[2, i] := reg.readString('FV'); // FullVersion
  // Bei Vollversionen nur der Dateiname !!!

  (*
    Einstellungen einlesen und korrekt deklarieren; Nutzer kann eine bereits aktivierte
    Textversion nicht doppelt aktivieren!
  *)


  // stringgrid erhält seine spaltennamen
  with StringGrid1 do
  begin
    Cells[0, 0] := 'Index';
    Cells[0, 1] := inttostr(0 + i); // weiterführen
    Cells[1, 0] := 'Produkt';
    Cells[2, 0] := 'Seriennummer\GUID';
    Cells[3, 0] := 'Lizenz-Nr.';
    Cells[4, 0] := 'Ablaufdatum';
    Cells[5, 0] := 'PC-Name'; // früher defaut-lizenz jetzt pc-name
  end;

  // Zeile dem "LOG" hinzufuegen
  log.Lines.Add('Getting common information.......SUCCESS');

  // Erstes Panel in der StatusBar versorgen
  StatusBar1.Panels[0].Text := 'Arbeitsplatz: 1';

  // Zweites Panel versorgen
  StatusBar1.Panels[2].Text := 'Datum : ' + datetostr(date);

  // Loakle IP auslesen (!)
  GetLocalIPs(Memo1.Lines);

  // Falls keine IP vorhanden, dann N.N. eintragen, ...
  if not GetLocalIPs(Memo1.Lines) then
    StatusBar1.Panels[3].Text := 'IPv4-Adresse: N. N.'
  else
    // andernfalls IP aus Memo an StatusBar-Panel 4 senden (von 0 aus)
    StatusBar1.Panels[3].Text := 'IPv4-Adresse: ' + Memo1.Lines.Text;
end;
Der Debugger verwies auf diese Methode. Gibt es irgendeinen Hinweis, was wohl die Ursache war?

Vielen Dank für eure Mühe.
Miniaturansicht angehängter Grafiken
screenshot-2014-12-02-21.39.53.jpg  
Friedrich
  Mit Zitat antworten Zitat