Entwickler-Ecke
Off Topic - exe-Datei startet oft mit einer Meldung "Zugriffsverletzung"
galagher - Mo 18.09.17 18:46
Titel: exe-Datei startet oft mit einer Meldung "Zugriffsverletzung"
Hallo!
Wenn ich das Projekt mit Delphi XE2 kompilieren, gibt es keine Probleme, die .exe-Datei läuft.
Wenn ich es mit Delphi 10.1 kompiliere, gibt es zunächst auch keine Probleme, die .exe-Datei läuft, solange sie in einem Ordner ist, in dem ich mit meinem eingeschränkten Benutzerkonto Schreibrechte habe. Wenn die Datei in einem Ordner in C:\Program Files (x86) ist, kommt manchmal direkt nach dem Start folgende Meldung:
Zitat: |
Zugriffsverletzung bei Adresse 75484355 in Modul 'comctl32.dll'. Lesen von Adresse 00000055. |
Beim Klicken auf meine Komponente TImageCombo zur Laufzeit kommt diese Meldung ebenfalls. Also liegt es auf der Hand, dass mit dieser Komponente etwas nicht stimmt. Also habe ich ein neues Projekt erstellt, das diese Komponente ebenfalls mit gleichen Einstellungen enthält, und siehe da: Das Programm läuft anstandslos auch im Program Files (x86)-Ordner.
Wenn ich die Komponente aus dem eigentlichen Projekt entferne, läuft es aber ebenfalls problemlos. :eyecrazy:
Was hat das zu bedeuten?
galagher - Mo 18.09.17 19:14
galagher hat folgendes geschrieben : |
dass mit dieser Komponente etwas nicht stimmt. |
Zur Erklärung: Meine Komponente bezieht ihre Images aus einer TImageList.
Ist dieser Code korrekt? Denn wenn ich ihn auskommentiere, habe ich klarerweiese keine Images mehr in der ComboBox, aber auch keine Fehlermeldung:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| procedure TImageCombo.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); var OutText: String; begin if Assigned(ImageList) then begin if ItemHeight <> ImageList.Height then ItemHeight := ImageList.Height; while Items.Count < ImageList.Count do Items.Add(''); end;
OutText := Items.Strings[Index];
with Canvas do begin FillRect(Rect);
if (FDrawBitmap) and Assigned(ImageList) then begin ImageList.Draw(Canvas, Rect.Left+2, Rect.Top, Index, True); Rect.Left := Rect.Left + ImageList.Width + 4; Rect.Bottom := Rect.Top + ImageList.Height + 14; Rect.Top := Rect.Top+FItemTop; end else begin FillRect(Rect); Rect.Left := 3; end;
DrawText(Handle, PChar(OutText), Length(OutText), Rect, dt_WordBreak); end; end; |
GuaAck - Mo 18.09.17 20:17
Hallo
galagher,
hast Du es schon mal mit dem Debugger versucht, z. B. Breakpoint auf Zeile 5 in Deinem Code und dann mit Einzelschritten ausführen?
Oft treten solche Fehler auf, wenn z. B. ein OnChange-Event (das man übersehen hat) ausgelöst wird, aber noch nicht alle Resourcen für die entsprechende Behandlungsroutine verfügbar sind.
Gruß
GuaAck
galagher - Mo 18.09.17 20:58
GuaAck hat folgendes geschrieben : |
hast Du es schon mal mit dem Debugger versucht, z. B. Breakpoint auf Zeile 5 in Deinem Code und dann mit Einzelschritten ausführen? |
Aus Delphi heraus funktioniert es ja immer, ebenso aus einem Ordner, in dem ich Schreibrechte habe!
Aber ich denke, ich habe den Fehler:
galagher hat folgendes geschrieben : |
dass mit dieser Komponente etwas nicht stimmt. |
Das ist korrekt!
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TImageCombo.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); var OutText: String; begin
inherited;
end; |
[delphi]
jaenicke - Di 19.09.17 04:05
Ein Tipp für solche Fälle:
Du kannst das Programm auch mit externen Debugsymbolen kompilieren und ein ShowMessage ins FormCreate oder den Projektquelltext .dpr nach dem begin setzen. Dann startest du das Programm so wie du es tust, wenn es das Problem gibt, lässt die MessageBox stehen und verbindest dich mit Delphi zu dem laufenden Prozess. Dann bestätigst du die MessageBox und bekommst vermutlich den Fehler auch im Debugger angezeigt.
galagher - Di 19.09.17 08:32
Der Fehler war eindeutig die Zeile
Delphi-Quelltext
1:
| if ItemHeight <> ImageList.Height then ItemHeight := ImageList.Height; |
in Prozedur TImageCombo.DrawItem, denn immer, wenn ich diese auskommentiert habe, gab's kein Problem.
Obwohl das Problem jetzt gelöst ist, stelle ich mir die Frage, warum es beim Ausführen im Ordner Program File (x86) öfter, aber nicht immer, zu der Fehlermeldung kam, beim Ausführen in anderen Ordnern niemals, und warum das nur bei Delphi 10.1-Kompilaten so war, bei Delphi XE2-Kompilaten nie! Ist doch seltsam, oder?
Delete - Di 19.09.17 12:58
- Nachträglich durch die Entwickler-Ecke gelöscht -
galagher - Di 19.09.17 17:49
Frühlingsrolle hat folgendes geschrieben : |
Setz' inherited mal ganz am Anfang, und nicht irgendwo mittendrin. |
Habe ich schon gestern gemacht, und
FImageList.Height wird jetzt in einer eigenen Prozedur eingestellt, beim Zuweisen einer TImageList. Jetzt funktioniert es anstandslos!
jaenicke - Mi 20.09.17 06:42
galagher hat folgendes geschrieben : |
Obwohl das Problem jetzt gelöst ist, stelle ich mir die Frage, warum es beim Ausführen im Ordner Program File (x86) öfter, aber nicht immer, zu der Fehlermeldung kam, beim Ausführen in anderen Ordnern niemals, und warum das nur bei Delphi 10.1-Kompilaten so war, bei Delphi XE2-Kompilaten nie! Ist doch seltsam, oder? |
Weil es schlicht "Zufall" ist, wenn etwas im Speicher nicht stimmt. Da steht dann an einer Speicherstelle eben mal das eine und mal das andere und je nachdem knallt es dann. Da reicht es schon eine Variable hinzuzufügen oder eben ein anderes Verzeichnis zu nehmen und schon ist etwas anders.
Mit dem konkreten Problem hat die Änderung nichts zu tun.
jaenicke - Mi 20.09.17 14:41
Möglich ist bei with alles, aber sehen tue ich so erst einmal keinen Konflikt. (Aber dass man das nicht so schnell sieht, ist ja genau das Tückische daran.)
galagher - Mi 20.09.17 18:58
jaenicke hat folgendes geschrieben : |
Mit dem konkreten Problem hat die Änderung nichts zu tun. |
Nach der Änderung ist der Fehler aber definitiv weg, und du wirst mir zustimmen, dass der Code in der DrawItem-Prozedur fehl am Platz war! Ich wusste es vor ca. 10 Jahren, als ich die Komponente entwickelt habe, nicht besser.
Der Fehler trat, wenn er denn auftrat, immer unmittelbar nach dem Programmstart auf, und, das habe ich nicht geschrieben, dann konnte ich die ComboBox nicht benutzen: Sie klappte zwar auf und zeigte die Images an, aber beim "Drübergehen" mit der Maus klappte sie mit besagter Fehlermeldung wieder zu.
jaenicke hat folgendes geschrieben : |
Möglich ist bei with alles, aber sehen tue ich so erst einmal keinen Konflikt. (Aber dass man das nicht so schnell sieht, ist ja genau das Tückische daran.) |
Das
with ist immer noch drin!
Also für mich steht fest: Der Code war dort deplatziert, verursachte dort den Fehler und gehört in eine eigene Prozedur, und zwar in jene, die die ImageList zuweist. Er muss ja auch nur 1x ausgeführt werden, und nicht jedesmal beim Zeichnen.
Delphi XE2 erzeugt wohl Code, der das toleriert, Delphi 10.1 nicht. Vielleicht irre ich mich ja, aber es sieht so aus!
jaenicke - Do 21.09.17 06:02
galagher hat folgendes geschrieben : |
jaenicke hat folgendes geschrieben : | Mit dem konkreten Problem hat die Änderung nichts zu tun. | Nach der Änderung ist der Fehler aber definitiv weg, und du wirst mir zustimmen, dass der Code in der DrawItem-Prozedur fehl am Platz war! |
So meinte ich das nicht. Ich meinte das bezogen auf den Absatz vorher und allgemein. Wenn Speicher nicht den gewünschten Inhalt hat, kann eine Änderung an anderer Stelle dazu führen, dass der Fehler auftritt oder verschwindet. Eben zum Beispiel durch Änderung des Verzeichnisses oder des Compilers.
Dass du die richtige Stelle gefunden hast, wollte ich damit nicht bezweifeln.
galagher - Do 21.09.17 21:10
jaenicke hat folgendes geschrieben : |
So meinte ich das nicht. Ich meinte das bezogen auf den Absatz vorher und allgemein. Wenn Speicher nicht den gewünschten Inhalt hat, kann eine Änderung an anderer Stelle dazu führen, dass der Fehler auftritt oder verschwindet. Eben zum Beispiel durch Änderung des Verzeichnisses oder des Compilers. |
Ja, das kann ich mir vorstellen!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!