Ich habe modifiziert, debuggen, modifizieren, debuggen (Sie kennen den Drill) und ich kann einfach nicht herausfinden, was diese Zugriffsverletzungen verursacht!
Am typischsten ist " Lesen der Adresse 80000000 " in der Skype4COM.dll, aber ich vermute nicht, dass es der Code ist, der das verursacht.
Mein erster Verdacht war, dass ich zu viele Befehle an die Skype-API (über Skype4COM) gesendet habe, aber nachdem ich einige Pausenlogik hinzugefügt hatte, um sicherzustellen, dass Skype und das COM-Objekt mithalten konnten, wurde mir klar, dass das nicht stimmte - Es passiert immer noch!
Ich benutze Threads, um dies zu tun, und sogar ohne Verwendung von Threads provoziert es immer noch einen AV. (Ich verwende nur einen Thread auf einmal)
Hier ist meine Thread Execute-Methode:
%Vor%Die Zugriffsverletzung tritt in der Mitte des gesamten Prozesses auf - ich weiß, denn wenn es am Ende wäre, wäre die Fortschrittsleiste, die den Fortschritt anzeigt, voll, und das ist es nicht, es liegt normalerweise bei 10-80%.
Das ErrMsg (); ist im Grunde nur eine MessageDlg Routine, also würde ich nicht alle mbOk und so Zeug machen müssen.
Das Protokoll (); fügt den Fehler zu meinem Log-Memo hinzu.
Wenn Sie weitere Informationen benötigen, zögern Sie nicht zu fragen!
EDIT: Ich habe vergessen zu erwähnen, dass das Debuggen etwas schwierig ist, weil das AV auf meinem Client-PC stattfindet, nicht auf meinem. Ich werde versuchen, jede verdächtige Aktion zu protokollieren, indem ich Log (); vor / nach jeder verdächtigen Linie.
EDIT2: Ich habe es gerade auf dem PC eines anderen Kumpels getestet, und sein Werk funktioniert einwandfrei. Ich habe ein paar Tester, und es ist wie 50% von ihnen, die die AVs berichtet ..
Hier ist eines der madExcept Logs:
%Vor% EDIT 3: Nachdem ich jede Codezeile protokolliert habe, habe ich festgestellt, dass der Gauner die CreateChatWith.SendMessage
-Zeile ist! Was schlägst du vor?
EDIT 4: Alles klar, durch die Aufteilung von CreateChatWith und SendMessage war es die SendMessage , die das verursacht!
Danke!
Ihre Ausnahmebedingungsnachricht ist wahrscheinlich etwas wie "Zugriffsverletzung bei Adresse XXXXXXX. Blablabla". Notieren Sie sich diese Adresse und platzieren Sie einen Haltepunkt irgendwo in Ihrer Execute-Methode. Wenn die Ausführung an diesem Haltepunkt stoppt, wählen Sie "Fehler suchen" aus dem Menü (unter Bearbeiten oder etwas) und geben Sie die Adresse ein. Sie werden jetzt zu dem Code springen, bei dem der Fehler aufgetreten ist.
Wenn es irgendwo in Ihrer Execute-Methode ist, teilen Sie uns bitte mit, welche Zeile es ist. Außerdem würde ich vorschlagen, dass Sie etwas wie MadExcept verwenden, um Ihre Ausnahmen einschließlich eines Stack-Trace zu protokollieren.
Wenn Sie nicht wissen, wie Sie eine DLL mit dem Delphi-Debugger debuggen können
Nach dem Lesen Ihres Posts vermute ich, dass Sie nicht wissen, wie man eine DLL mit Delphi debuggt (nichts für ungut). So machen Sie es:
Da es nicht genug Informationen gibt, um genau zu wissen, werde ich eine Wette annehmen. Ich wette, die AVs kommen von diesen Zugriffen auf die lokale Variable User
:
Ich vermute, dass der Typ von User
ein Zeigertyp ist, der durch die Typdeklaration angegeben wird:
Ich vermute, dass diese Besetzung:
%Vor%ist etwas, das nicht wirklich vom selben Typ ist. Bei der Umwandlung wird keine Validierung durchgeführt, der Compiler versucht glücklicherweise, die Struktur des deklarierten Typs über den Speicher, auf den gezeigt wird, zu schichten. Die Probleme treten auf, wenn Sie versuchen, sich auf Elemente dieser Struktur zu beziehen, und das tatsächliche Layout dessen, was im Speicher vorhanden ist, stimmt nicht ganz überein.
Wenn Sie diesen Code durchgehen und die Daten bei jedem Schritt überprüfen könnten, sollte es sehr einfach sein, den Fehler zu finden, vorausgesetzt, dass dies bereits passiert, wenn I
klein ist.
Es gibt andere hier, die besser erraten können, als ich es kann. Takers?
Wenn Sie alles in Ihrem Code dreifach überprüft haben, dann vergleichen Sie die Pascal-Header-Implementierung von SendMessage () für Skype DLL mit C-Headern und suchen Sie nach einem Fehler in der Header-Übersetzung. Was Sie über SendMessage () senden, muss 100% entsprechen, was erwartet wird.
Tags und Links multithreading delphi access-violation skype