Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehler "access violation" - keine Ahnung, warum... (https://www.delphipraxis.net/169819-fehler-access-violation-keine-ahnung-warum.html)

DeddyH 14. Aug 2012 14:20

AW: Fehler "access violation" - keine Ahnung, warum...
 
Das hättest Du aber auch ein bisschen früher sagen können. Habe ich die Situation richtig verstanden:
- größerer Record -> Programm läuft, Hardware stürzt ab
- kleinerer Record -> Programm stürzt ab
:?:

EWeiss 14. Aug 2012 14:22

AW: Fehler "access violation" - keine Ahnung, warum...
 
Dann erstelle zwei records und vergleiche auf die Firmware ..

Einen Record in der reihenfolge zu ändern bzw.. zu kürzen ist keine gute Idee
Mach das mal bei meiner DLL dann geht auch nichts mehr.
Ist aber auch logisch oder?

Das hat mich auch gewundert "NativeUInt" = HRESULT in C++

Delphi-Quellcode:
if COM_TcpOpen(zeiger, ipAddress, port) = S_OK then
begin
  ...
end
aber jeder so wie er will.

EDIT:

Sorry: Diese art der Programmierung ist auch unverständlich.

Delphi-Quellcode:
procedure TForm1.btnstartmanipulationClick(Sender: TObject);
   begin
     return := COM_RbsManipulationReq(zeiger, tagmanipulation);
     return := COM_StartRbsManipulationReq(zeiger);
   end;
Du definierst eine Variable return und tust nichts damit
Irgendwo seltsam das ganze.

gruss

p80286 15. Aug 2012 15:28

AW: Fehler "access violation" - keine Ahnung, warum...
 
Zunächst einmal scheint hier ein Mißverständnis über Zeiger/Pointer vor zu liegen.
Ein Zeiger/Pointer enthält NIL oder eine Adresse, die auf einen Speicherbereich zeigt. Der Wert, den der Zeiger enthält, ist vollkommen uninteressant. Von Interesse ist nur der Speicherbereich auf den der Zeiger zeigt. Wenn hier ein paarmal vom Inhalt des Zeigers die Rede war hoffe ich, daß dies eine sprachliche Ungenauigkeit war.
Wie DeddyH schon ausgeführt hat ist
Delphi-Quellcode:

zeiger : pointer;

...

new(zeiger);
vornehm ausgedrückt, Blödsinn.
Delphi-Quellcode:
new(zeiger);
ist nur dann sinnvoll, wenn zeiger als Pointer auf irgendetwas definiert ist. z.B.
Delphi-Quellcode:
tmyrec=record
         wert:integer;
         nix :byte;
       end;
 
zeiger:^tmyrec;
pint :înteger;

...

new(zeiger);
new(pint);
Dann beginnt die Record Definition mit zwei Byte-Werten.
Das könnte nach einem
Delphi-Quellcode:
packed record
verlangen, muß aber nicht. Wäre u.U. aber auch eine Erklärung für das Verhalten.

Gruß
K-H

Pow3rus3r 16. Aug 2012 07:34

AW: Fehler "access violation" - keine Ahnung, warum...
 
Zitat:

Zitat von DeddyH (Beitrag 1178243)
Das hättest Du aber auch ein bisschen früher sagen können. Habe ich die Situation richtig verstanden:
- größerer Record -> Programm läuft, Hardware stürzt ab
- kleinerer Record -> Programm stürzt ab
:?:

So ist es. Bei dem zu großen (ehemals korrekten) Record bekomme ich ein Hardwaretimout als Returnwert und das Programm bringt keinen Fehler.

Bei dem kleineren Record funktioniert die Werteübergabe an die Hardware (und die Hardware setzt den Befehl korrekt um), aber mein Delphi Programm bringt den Fehler.

DeddyH 16. Aug 2012 07:40

AW: Fehler "access violation" - keine Ahnung, warum...
 
Man könnte da jetzt wild herumwuseln (das Schlüsselwort absolute kommt mir da in den Sinn). Aber an Deiner Stelle würde ich zunächst beim Hersteller nachfragen, ob es eine an die neue Firmware angepasste DLL gibt. Anschließend die Firmware-Version erfragen und je nachdem die eine oder andere DLL laden und mit dem passenden Record ansprechen. Das scheint mir noch das Einfachste zu sein.

Pow3rus3r 16. Aug 2012 09:42

AW: Fehler "access violation" - keine Ahnung, warum...
 
Zitat:

Zitat von DeddyH (Beitrag 1178413)
Man könnte da jetzt wild herumwuseln (das Schlüsselwort absolute kommt mir da in den Sinn). Aber an Deiner Stelle würde ich zunächst beim Hersteller nachfragen, ob es eine an die neue Firmware angepasste DLL gibt. Anschließend die Firmware-Version erfragen und je nachdem die eine oder andere DLL laden und mit dem passenden Record ansprechen. Das scheint mir noch das Einfachste zu sein.

Die Anfrage hatte ich gestern schon rausgeschickt. Gerade kam eine Antwort. Die DLL hat sich geändert, natürlich mit anderem Prozedureinsprungspunkt (_COM_RbsManipulationReq@52 statt _COM_RbsManipulationReq@112).

Nun kommt kein Fehler mehr!

Da wäre ich im Leben nicht drauf gekommen. Danke für eure Hilfe! Ihr seid echt mal fit in Delphi!

himitsu 16. Aug 2012 10:23

AW: Fehler "access violation" - keine Ahnung, warum...
 
In C-Sprachen und in den Delphi-BPLs wird im Exportnamen von Funktionen/Prozeduren auch gerne mal die Parameterdeklaration mit aufgenommen.
Bei Delphi-DLLs (wenn man nicht explizit ws nderes angibt) und bei vielen WinAPIs enspricht aber der Exportname dem Prozedurnamen.

Zitat:

Da wäre ich im Leben nicht drauf gekommen
Wie importierst du denn die Prozedur?

Da hätte es doch schon auffallen sollen, daß die Prozedur, unter dem alten Namen, nicht gefunden wird. :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:32 Uhr.
Seite 4 von 4   « Erste     234   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz