![]() |
Speicherzugriffsfehler
Moin.
Ich habe gerade einen immer wieder rekonstruierbaren Fehler, der scheinbar nicht in meinem Code auftritt. Wiefolgt: meine DLL (im folgenden als "ich" bezeichnet) exportiert eine Initialisierungs- und eine Deinitialisierungsfunktion. Die Anwendung (im folgenden "es", nicht von mir entwickelt) ruft die eine beim Starten, die andere beim Beenden auf. So weit, so gut. Nun kommt es aber manchmal, dass Es meine Deinit. auch zur Laufzeit aufruft und später wieder die Init. Das funktioniert immer noch. Aber danach ruft es eine weitere Funktion meiner DLL auf. Die läuft durch, kann ich im Debugger schrittweise verfolgen. Er kommt bis zum abschließenden "end;" dieser Funktion. Klicke ich nun nochmal auf Einzelschritt, kommt folgender Fehler: Zitat:
Code:
Kann damit jemand etwas anfangen? Ich nämlich nicht.
00001D10 CODE:HarmonyInitWave+44 retn HarmonyInitWave returned to rpg2000.exe:0050C457
00001D10 rpg2000.exe:0050C457 retn returned to Stack[00001D10]:0012FB94 00001D98 ST0= 1.041310961582891512e-2504 ST1= 0.0 ST2= 8.0616745606685941392e-2505 ST3= 3.5949607961044423618e3498 ST4= 0.0 ST5= 1.0 ST6= 1.0 ST7= 4.8770310000000001828e6 CTRL=1372 CS=1B DS=23 ES=23 FS=3B GS=0 SS=23 EAX=12FAC4 EBX=BE26E4 ECX=FFFFFFFE EDX=DA2240 ESI=BEFCA8 EDI=BEDF28 EBP=12FADC ESP=12FAD4 EFL=200282 00001D98 CODE:HarmonyInitWave+37 retn ESP=12FAD8 00001D98 CODE:HarmonyInitWave:loc_DA222F mov al, [ebp+var_1] EAX=12FA01 00001D98 CODE:HarmonyInitWave+42 pop ecx ECX=1000000 ESP=12FADC 00001D98 CODE:HarmonyInitWave+43 pop ebp EBP=12FB5C ESP=12FAE0 00001D98 CODE:HarmonyInitWave+44 retn ESP=12FAE4 00001D98 CODE:HarmonyInitWave+44 retn HarmonyInitWave returned to rpg2000.exe:0050C457 00001D98 rpg2000.exe:0050C457 retn ESP=12FAE8 00001D98 rpg2000.exe:0050C457 retn returned to Stack[00001D98]:0012FB94 00001D98 Stack[00001D98]:0012FB94 aam 0FDh EAX=120001 SF=0 00001D98 0012FB96 EFL=210302 TF=1 RF=1 Wenn man bei geworfener exception in Delphi das Programm weiterlaufen lässt kommt wieder derselbe Fehler an derselben Stelle. Lässt man es ohne Debugger laufen, beendet sich einfach die Host-Anwendung. Die Deinitialisierungsmethode gibt alle in der Init. createten Resourcen wieder frei. (Wenn man beide Funktionen komplett leert, tritt derselbe Fehler auf.) Ich hoffe mir kann jemand hier helfen. Wenn ihr mehr Informationen braucht, sagt bescheid. |
Re: Speicherzugriffsfehler
Puh, das ist schwer nachzuvollziehen. Eine AV bekommt man in der Regel, wenn auf Speicher zugegriffen wird, der ungültig ist. Also du gibst zum Beispiel Speicher frei und danach wird wieder daraufzugegriffen. Hast du irgendwie Zugriff auf den Code von "Es"?
|
Re: Speicherzugriffsfehler
Zitat:
Also ich greife eigentlich auf nix zu was schon freigegeben ist. Ich meine, wie gesagt, wenn ich die Funktionen ganz leer mache, also gar nix initialisiere und auch nix lösche, tritt immer noch derselbe Fehler auf. |
Re: Speicherzugriffsfehler
Herzlich willkommen in der Delphi-PRAXiS, derula.
Bei dem Versuch, die Harmony.dll von deinem RPGMaker zu ersetzen, könntest du die falschen Aufrufkonventionen für deine DLL-Funktionen verwendet haben. Hast du dir schon alle notwendigen Informationen zu deinem Projekt besorgt? ![]() ![]() Grüße vom marabu |
Re: Speicherzugriffsfehler
Zitat:
Zitat:
Danke jedenfalls für die Links. Edit: und wie gesagt funktioniert alles, außer wenn man aus dem RM raus das Spiel startet und dann wieder beendet. |
Re: Speicherzugriffsfehler
Hallo,
wegen deiner Geheimniskrämerei musste ich mir erst ein paar Hintergrundinfos besorgen und bin auf RPGMaker und die mitgelieferte Harmony.dll gestoßen. An anderer Stelle fand ich dann Hinweise darauf, dass Harmony.dll bei älternen Versionen beigepackt ist, bei neueren nicht mehr benutzt wird. Als Autor von Harmony.dll wurde auf eine Nachfrage Prof Raes ausgedeutet, deshalb der erste Link. Wegen der dort fehlenden oder nicht sofort ersichtlichen technischen Infos habe ich den zweiten Link hinzugefügt. Vergiss beide Links, wenn sie nichts mit deinem Problem zu tun haben. Die beiden Projekte von ineluki habe ich zwar auch entdeckt, aber auch dort auf die Schnelle nichts entdeckt und weil ineluki auf eine ältere Frage von einem Hilfesuchenden nicht direkt geantwortet hat, sondern um private Kontaktaufnahme bat, habe ich weitere Recherchen eingestellt. Wenn du unsicher bist, ob du eine function in deiner eigenen Harmony.dll korrekt implementiert hast, dann stelle die funktionierende Funktion von ineluki und deine Implementierung hier online. Nur so kann hier jemand ohne viel Aufwand sehen, wo der Fehler steckt. Da du geschrieben hast, dass auch eine Dummy-Funktion zu dem Fehler führt, habe ich auf die Verwendung einer falschen Aufrufkonvention geschlossen. Freundliche Grüße |
Re: Speicherzugriffsfehler
Sorry wegen der Geheimniskrämerei. Hab gedacht es wäre einfacher euch Details zu ersparen ^^'... Ich hab jetzt auch die Referenz auf die Harmony Library gefunden, aber RPG Maker's harmony.dll ist sicher Delphi-compiliert... vielleicht gabs ne ältere Version von HL auch für Delphi?
Ich hab auch deshalb keine Details gesagt, weil man zum Nachvollziehen den RPG-Maker und das RTP installieren muss. Und ich weiß gar nicht ob man den noch irgendwo herkriegt. ![]() ![]() Meine ist relativ groß, weil sie noch Debug-Informationen enthält. Also, ich hab wirklich alles durchprobiert was ich für möglich hielt, aber hat alles nicht geholfen. Also falls es weiterhilft, meine DLL verwendet DSMixer von Carlos Barbadosa und damit DirectX, Teile der Audio Tools Library und somit implizit auch TNT Unicode. |
Re: Speicherzugriffsfehler
Liste der Anhänge anzeigen (Anzahl: 1)
Die DLL's helfen nur jemandem, der den RPGMaker installiert hat.
Ich weiß nicht wie du vorgegangen bist, aber ich würde zuerst eine DLL entwerfen, die alle Funktionsaufrufe an die Original-DLL durchreicht. Wenn die funktioniert kannst du deinen Init- und DeInit-Code einhängen. Bist du so vorgegangen? Freundliche Grüße |
Re: Speicherzugriffsfehler
Zitat:
Sorry, dass ich darauf nicht vorher gekommen bin, trotzdem danke für die Hilfe! Tolle Community hier. (Ich hab den Fehler in früheren Versionen meiner DLL gar nicht bemerkt, ich dachte, den hätte ich irgendwann eingebaut, aber wenn nichtmal diese Dummy-DLL funktioniert, wird bei meiner der Bug wohl auch schon immer drin gewesen sein...) |
Re: Speicherzugriffsfehler
An einen Fehler in Delphi mag ich nicht glauben. Wenn die Aufruf-Konvention korrekt ist, dann tippe ich auf die beiden Funktionen mit dem String-Parameter.
BTW: Bei meiner substitute dll habe ich die Importe aus ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:47 Uhr. |
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