- Offizieller Beitrag
Ich habe ja eine UDF "WindowDocking" geschrieben, die die Auswertung mit DllCallbackRegister und einer WindowProc-Funktion macht.
Soweit funktioniert das auch einwandfrei, aber wenn ich jetzt noch eine WindowProc-Funktion (eine andere UDF) einbinden will, dann schmiert mir das Script ab (Fenster friert ein und ich muss den Process killen).
Jede UDF für sich allein, läuft problemlos, nur zusammen geht es nicht. Ich habe jetzt mal ein Minimal-Beispielscript erstellt, womit das Problem immer noch auftritt (siehe unten).
Ich habe mir auch schon die Adressen ausgeben lassen, um zu schauen, ob da irgendwas nicht passt, aber ich konnte nichts entdecken.
Handelt es sich da um einen Bug oder übersehe ich etwas Gravierendes?
AutoIt
#include <WinAPISysInternals.au3>
#include <WinAPISysWin.au3>
#include <WindowsConstants.au3>
OnAutoItExitRegister('_Exit')
Global $hGui = GUICreate('Test', 640, 480)
GUISetState()
#Region stellt die 1.UDF dar
Global $hProcNew1 = DllCallbackRegister('_WindowProc1', 'ptr', 'hwnd;uint;wparam;lparam')
Global $hProcOld1 = _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, DllCallbackGetPtr($hProcNew1))
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : DllCallbackGetPtr($hProcNew1) = ' & DllCallbackGetPtr($hProcNew1) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hProcOld1 (Orig WinProc) = 0x' & Hex($hProcOld1) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
#EndRegion
#Region stellt die 2.UDF dar
Global $hProcNew2 = DllCallbackRegister('_WindowProc2', 'ptr', 'hwnd;uint;wparam;lparam')
Global $hProcOld2 = _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, DllCallbackGetPtr($hProcNew2))
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : DllCallbackGetPtr($hProcNew2) = ' & DllCallbackGetPtr($hProcNew2) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hProcOld2 = 0x' & Hex($hProcOld2) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
#EndRegion
Do
Until GUIGetMsg() = -3
Exit
Func _Exit()
Local $ret
$ret = _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, $hProcOld2)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : ret $hProcOld2 = 0x' & Hex($ret) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
DllCallbackFree($hProcNew2)
$ret = _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, $hProcOld1)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : ret $hProcOld1 = 0x' & Hex($ret) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
DllCallbackFree($hProcNew1)
$ret = _WinAPI_GetWindowLong($hGui, $GWL_WNDPROC) ; zum testen, ob der Originalwert wieder bei der Gui eingetragen ist
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : Orig WinProc = 0x' & Hex($ret) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
EndFunc ;==>_Exit
Func _WindowProc1($hWnd, $iMsg, $wParam, $lParam)
Switch $iMsg
Case $WM_MOUSEWHEEL
ConsoleWrite('_WindowProc1 $WM_MOUSEWHEEL' & @CR)
EndSwitch
Return _WinAPI_CallWindowProc($hProcOld1, $hWnd, $iMsg, $wParam, $lParam)
EndFunc ;==>_WindowProc1
Func _WindowProc2($hWnd, $iMsg, $wParam, $lParam)
Switch $iMsg
Case $WM_WINDOWPOSCHANGED
ConsoleWrite('_WindowProc2 $WM_WINDOWPOSCHANGED' & @CR)
EndSwitch
Return _WinAPI_CallWindowProc($hProcOld2, $hWnd, $iMsg, $wParam, $lParam)
EndFunc ;==>_WindowProc2
Alles anzeigen