AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Zugriffsverletzung bei Adresse 0043815C in Modul 'xxx.exe'. Lesen von Adresse
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsverletzung bei Adresse 0043815C in Modul 'xxx.exe'. Lesen von Adresse

Ein Thema von Moien · begonnen am 2. Jul 2020 · letzter Beitrag vom 6. Jul 2020
Antwort Antwort
Moien

Registriert seit: 20. Feb 2020
6 Beiträge
 
#1

Zugriffsverletzung bei Adresse 0043815C in Modul 'xxx.exe'. Lesen von Adresse

  Alt 2. Jul 2020, 14:56
Delphi-Version: 10.2 Tokyo
Hallo Zusammen,

Ich habe ein Delphi-Programm und versuche, über mein Programm Variablen auf den OPC UA-Server zu schreiben. Ich erhalte den folgenden Fehler:
"TOPCClient.WriteItem - Exception: Zugriffsverletzung bei Adresse 0043815C in Modul 'xxx.exe'. Lesen von Adresse 00000000".

Ich habe einen Teil meines Codes hier kopiert, in dem der Fehler auftritt.

Delphi-Quellcode:
// -----------------------------------------------------------------------------
// WriteItem - Write OPCUA Item
// -----------------------------------------------------------------------------
function TOPCClient.WriteItem(Name: String; ItemValue: Variant): Boolean;
Var
  I : Integer;
  ItemFound : Boolean;
  label
  GoToWriteToOPCServer;
begin
  ItemFound := False;
  Result := FALSE;
  try
    for I := 0 to Length(OPCServerItemArray)-1 do begin
      if (AnsiMatchStr(Name, OPCServerItemArray[I].ItemName)) then begin
        ItemFound := True;
        WriteToOPCServerArray[WriteIndex].ItemName := Name;
        WriteToOPCServerArray[WriteIndex].Value := ItemValue;
        WriteToOPCServerArray[WriteIndex].Source := OPCServerItemArray[I].Source;
        WriteIndex := WriteIndex+1;
        Result := True;
        GoTo GoToWriteToOPCServer;
      end;
    end;

    if not(ItemFound) then begin
      Meldung(0,'TOPCClient.WriteItem: ' + Name + ' (is not found)');
    end;
    GoToWriteToOPCServer:
    if (WriteIndex = NoVarToWrite)then begin
      WriteMultipleIdx := WriteIndex;
      WriteIndex:= 0;
      WriteMultipleItems;
    end else if (WriteIndex > NoVarToWrite) then begin
      Meldung(0,'TOPCClient.WriteItem - Exception: The write array is too long!'+ 'WriteIndex = '+ IntToStr(WriteIndex));
    end;

  except
    on E: Exception do begin
      Meldung(0,'TOPCClient.WriteItem - Exception: ' + E.Message + ' info: ' + Name + ' WriteIndex: ' + IntToStr(WriteIndex) + ' I = ' + IntToStr(I));
    end;
  end;
end;

// -----------------------------------------------------------------------------
// WriteMultipleItem - Write OPCUA Item
// -----------------------------------------------------------------------------

Procedure TOPCClient.WriteMultipleItems;
Var
  I : Integer;
  Results : OleVariant;
  ExpandedText : WideString;
begin
  SetLength(WriteValueArguments,WriteMultipleIdx);
  try
    if (connected) then begin
      for I := 0 to WriteMultipleIdx-1 do begin
        WriteValueArguments[I] := CoUAWriteValueArguments.Create;
        WriteValueArguments[I].EndpointDescriptor.UrlString := Url_String;
        ExpandedText := 'nsu='+ nsu + ';s=' + S0 + '.' + WriteToOPCServerArray[I].Source + '.' + WriteToOPCServerArray[I].ItemName;
        WriteValueArguments[I].NodeDescriptor.NodeId.ExpandedText := ExpandedText;
        WriteValueArguments[I].Value := WriteToOPCServerArray[I].Value;
      end;

      WriteArguments := VarArrayCreate([0, WriteMultipleIdx-1], varVariant);
      for I := 0 to WriteMultipleIdx-1 do begin
        WriteArguments[I] := WriteValueArguments[I];
      end;

      TVarData(Results).VType := varArray or varVariant;
      TVarData(Results).VArray := PVarArray(OPCUAClientMultiWrite.WriteMultipleValues(
      PSafeArray(TVarData(WriteArguments).VArray)));
    end else begin
      Meldung(0,'TOPCClient.WriteAllItems: not connected to the OPC UA Server');
    end;
  except
    on E: Exception do begin
      Meldung(0,'TOPCClient.WriteMultipleItems - Exception: ' + E.Message);
    end;
  end;
end;
Ich würde mich über Ihre Unterstützung freuen.

LG
Moien
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#2

AW: Zugriffsverletzung bei Adresse 0043815C in Modul 'xxx.exe'. Lesen von Adresse

  Alt 2. Jul 2020, 16:48
Wieso arbeitest Du mir Goto ?

Delphi-Quellcode:
var
  ItemFound : Boolean;
  label
  GoToWriteToOPCServer;
begin
  try
    for I := 0 to Length(OPCServerItemArray)-1 do begin
        GoTo GoToWriteToOPCServer;
    end;

...

    GoToWriteToOPCServer:
...
Das sollte man nicht mehr Nutzen, nur wenn man genau weiss was da passiert (und selbst dann nicht).

Aus for-Schleifen springt man mit break raus

Delphi-Quellcode:
    for I := 0 to Length(OPCServerItemArray)-1 do begin
      if Bedingung then
        break;
    end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Zugriffsverletzung bei Adresse 0043815C in Modul 'xxx.exe'. Lesen von Adresse

  Alt 2. Jul 2020, 17:48
Jupp, also erstmal das Goto ist hier sowieso nutzlos,
denn mit [OH]Break;[/OH] die Schleife abbrechen reicht vollkommen,
denn das IF vor dem Meldung überspringt diesen Teil sowieso.

Außerdem Doppelte Infos:
Wieso ItemFound, wenn Result die selbe Information enthält?

Zitat:
Lesen von Adresse 00000000
Die Null sagt dir, dass da auf ein NIL zugegriffen wird.
00000000 oder 00000123 ist alles NIL, letzteres mit einem Offset, z.B. wenn man auf eine Variable zugreift, die ja bissl unterhalb der gezeigten Adresse liegt.

NIL lässt sich ja leicht prüfen.

Bei großen Zeigern-Adressen ist ein "ungültiger" Zeiger schuld,
wie z.B. eine nicht-initialisierte Variable oder ein Zeiger auf ein Objekt, welches bereits freigegeben wurde.

Zitat:
Zugriffsverletzung bei Adresse 0043815C in Modul 'xxx.exe'
Nennt dir die Stelle ... die könnte man z.B. im Debugger (CPU-Ansicht) oder in der MAP-Datei bzw. Debuginfos suchen.

Die Adresse hilft aber selten, da es die Stelle ist wo es knallte, aber meistens eine aufrufende Stelle den Fehler verursachte,
drum schaut man in den Stacktrace, von wo es her kam. (Debugger, Eurekalog oder Dergleichen)



Egal was du machst, ich empfehle die Benutzung des Debuggers, um die Zeile zu bekommen wo es knallte.
Wir können hier nicht helfen, da uns niemand gesagt hat WO es knallt (Zeile)
und wir auch garnicht wiessen was Vaiablen außerhalb des gezeigten Codes drin seht.

Der Code selber hat jetzt erstmal scheinbar keine "gravirenden" Fehler, die mit jetzt direkt ins Auge gefallen sind.
Abgesehn von unnötigen Variablen, unnötigen Sprüngen und bissl sinnfreien Kommentaren (was die machen erklärt bereits der Name)
Obwohl: Warum fehlt "OPCUA" in den Methodennamen? Und dann sind die Kommentare plötzlich komplett nutzlos.
$2B or not $2B

Geändert von himitsu ( 2. Jul 2020 um 17:59 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Zugriffsverletzung bei Adresse 0043815C in Modul 'xxx.exe'. Lesen von Adresse

  Alt 2. Jul 2020, 18:14
Hallo,
ich würde MadExcept zu Hilfe nehmen.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#5

AW: Zugriffsverletzung bei Adresse 0043815C in Modul 'xxx.exe'. Lesen von Adresse

  Alt 3. Jul 2020, 03:15
Da die anderen bereits die groben Fehler genannt haben, kann ich die überspringen. (Goto *schauder* *schüttel* hab ich zuletzt vor laaanger Zeit als Programmieranfänger in Turbo Pascal benutzt.) Andererseits habe ich den Eindruck, dass hier noch globale Variablen im Spiel sind (ja, es könnten auch Klassenvariablen sein).

Ich habe einen Teil meines Codes hier kopiert, in dem der Fehler auftritt.
In welcher Zeile kommt es zur Exception? Hast du mal den Debugger (F8 bzw. F7) bemüht und/oder Breakpoints im Code gesetzt?

Delphi-Quellcode:
Procedure TOPCClient.WriteMultipleItems;
[...]
begin
[...]
      for I := 0 to WriteMultipleIdx-1 do begin
        WriteValueArguments[I] := CoUAWriteValueArguments.Create;
Sicher, dass das so richtig ist? Normalerweise wird ein Konstruktor mit dem Namen des Typs der Klasse gerufen, also TKlasse.Create, nicht Klasse.Create. Heißt der Typ deiner Klasse so oder ist das eine Variable?

Grüße
Dalai
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.355 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Zugriffsverletzung bei Adresse 0043815C in Modul 'xxx.exe'. Lesen von Adresse

  Alt 3. Jul 2020, 07:37
Wenn wir schon auf grundlegende Probleme in dem Source eingegangen wird, möchte ich noch eine Anmerkung loswerden.

Delphi-Quellcode:
function TOPCClient.WriteItem(Name: String; ItemValue: Variant): Boolean;
Var
  I : Integer;
begin
  try
    for I := 0 to Length(OPCServerItemArray)-1 do begin
...
    end;
...
  except
    on E: Exception do begin
      Meldung(0,'TOPCClient.WriteItem - Exception: ' + E.Message + ' info: ' + Name + ' WriteIndex: ' + IntToStr(WriteIndex) + ' I = ' + IntToStr(I));
    end;
  end;
end;
Das "I" in deiner Exception ist mit Vorsicht zu genießen, da Schleifenvariablen nach dem Durchlauf undefiniert sein können. Ob das bei einer Exception in der Schleife auch so ist, entzieht sich allerdings meiner Kenntnis. Verlassen würde ich mich jedenfalls nicht darauf.
Peter
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
650 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Zugriffsverletzung bei Adresse 0043815C in Modul 'xxx.exe'. Lesen von Adresse

  Alt 3. Jul 2020, 16:29
Da fehlt leider so eingies an wichtigen Details um etwas genaueres zu sagen. Was aber dein Fehler aussagt ist, dass du da einen NIL Pointer adressierst. Also zum Beispiel ein nicht initialisiertes Object oder ein Array. ("Lesen von Adresse 00000000" beduetet zugriff auf NIL)
  Mit Zitat antworten Zitat
Moien

Registriert seit: 20. Feb 2020
6 Beiträge
 
#8

AW: Zugriffsverletzung bei Adresse 0043815C in Modul 'xxx.exe'. Lesen von Adresse

  Alt 6. Jul 2020, 08:37
Vielen Dank für die Feedbacks.
Ich habe "Break" anstelle von "GoTo" verwendet, aber ich erhalte immer noch die Exception.
Die Exception kommt in dieser Zeile zum ersten Mal:

WriteArguments := VarArrayCreate([0, WriteMultipleIdx-1], varVariant);

LG
Moien
  Mit Zitat antworten Zitat
Moien

Registriert seit: 20. Feb 2020
6 Beiträge
 
#9

AW: Zugriffsverletzung bei Adresse 0043815C in Modul 'xxx.exe'. Lesen von Adresse

  Alt 6. Jul 2020, 08:40
Was brauchst du als weiteren Input?
LG
Moien
Da fehlt leider so eingies an wichtigen Details um etwas genaueres zu sagen. Was aber dein Fehler aussagt ist, dass du da einen NIL Pointer adressierst. Also zum Beispiel ein nicht initialisiertes Object oder ein Array. ("Lesen von Adresse 00000000" beduetet zugriff auf NIL)
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
650 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Zugriffsverletzung bei Adresse 0043815C in Modul 'xxx.exe'. Lesen von Adresse

  Alt 6. Jul 2020, 13:53
Was ist OPCServerItemArray / WriteToOPCServerArray und wo/wie erstellst du das? Was hat WriteMultipleIdx für einen Wert und wo/wie wird dieser gesetzt?

Versuche doch ein kleines Beispielprojekt zu machen, das den Fehler reproduziert. Anhand deines Codes ist der Fehler nicht einfach zu finden und vermutlich liegt die Quelle des Fehlers garnicht in diesem Code sondern ausserhalb, wo du Objekte, etc. erstellst/abfüllst, die du hier nutzt.

Geändert von Rolf Frei ( 6. Jul 2020 um 14:06 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:05 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