[GELÖST] Problem mit SHChangeNotify (WinAPI)
Übersicht

![]() |
NoaBetreff: [GELÖST] Problem mit SHChangeNotify (WinAPI) |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
habe folgendes Problem: SHChangeNotify habe ich auf folgende Art in mein Programm eingebunden: Code: [AUSKLAPPEN] Global dll:Int = LoadLibraryA("shell32") Global SHChangeNotify:Byte Ptr(wEventId:Long, uFlags:Short, dwItem1:Object, dwItem2:Object) = GetProcAddress(dll, "SHChangeNotify") Folgender Ablauf: -> Objekt1 einer Klasse1 wird erstellt -> Objekt1 ruft eigene Methode auf -> Methode ruft Methode eines anderen Objektes2 (Klasse2, Referenz in Klasse1) auf -> Methode ruft SHChangeNotify auf -> Unhandled Memory Exception tritt auf -> Return (wird nicht ausgeführt) -> Return (wird nicht ausgeführt) Also kurz: SHChangeNotify wird aus einer Methode heraus ausgerufen, wird erfolgreich ausgeführt (Ergebnis ist sichtbar -> somit erfolgreich ausgeführt) anschließend soll die Methode ein Return (ohne Rückgabe) ausführen, passiert aber nicht, sondern die "Unhandled Memory Exception" tritt auf. Ein Try-Catch-Block bringt keine Abhilfe. Wird das Programm im Debug Modus kompiliert und ausgeführt, tritt der Fehler nicht auf. Wird das Programm im Release Modus kompiliert und ausgeführt, tritt der Fehler auf. Auskommentieren der SHChangeNotify "behebt" das Problem im Release Modus. Hat jemand eine Idee, woran das liegen könnte? Im Voraus schonmal vielen Dank. |
||
- Zuletzt bearbeitet von Noa am Do, März 05, 2009 10:41, insgesamt einmal bearbeitet
![]() |
Suco-XBetreff: ..... |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] Global SHChangeNotify:Byte Ptr(wEventId:Long, uFlags:Short, dwItem1:Object, dwItem2:Object)"Win32" = GetProcAddress(dll, "SHChangeNotify") Also siehe "Win32". Außerdem sind die Datentypen, die du bei den Parametern angibst, so nicht gültig. Object musst du auf jedenfalls durch byte ptr ersetzen, für EventId und uFlags INteger nehmen. Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
![]() |
Noa |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wow, das wars. Vielen Dank für die Hilfe, doch noch eine kleine Frage: Wo find ich die Infos über sowas? Ich war schon froh als ich halbwegs irgendwo im Forum die Möglichkeit gefunden hab, wie man DLLs in BlitzMax verwendet, wie komm ich nun darauf, dass ich da ein "Win32" dahinter setzen muss? Steht das irgendwo in der Hilfe? | ||
![]() |
Suco-XBetreff: ...... |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja, Mark hat das ganze mal im Forum bekannt gegeben. Wenn man sich dazu mal Informationen aus dem Internet sucht klingt das ganze auch recht logisch.
Also die WinAPI Funktionen in den WinApi-Headerdateien haben vor jeder Funktion noch WINAPI stehen und dieser Ausdruck ist als __stdcal definiert. Da BlitzMax als Aufrufkonvention bei Funktionen aber cdecl benutzt, muss man WinAPI Funktionen extra mit "Win32" markieren. Der von BlitzMax erstellte Assembler Code für diese Funktion unterscheidet sich also wegen der Aufrufkonvention von cdecl. Den Unterscheid zwischen stdcall und cdecl kannst du Hier nachlesen. Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
![]() |
Noa |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nochmals vielen Dank für deine ausführliche Hilfe ^^. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group