Modify ↓
Opened 13 years ago
Closed 13 years ago
#2176 closed Bug (Fixed)
DllCallbackRegister crash on x64
Reported by: | Melba23 | Owned by: | trancexx |
---|---|---|---|
Milestone: | 3.3.9.3 | Component: | AutoIt |
Version: | 3.3.9.2 | Severity: | None |
Keywords: | Cc: |
Description
As requested by trancexx http://www.autoitscript.com/forum/topic/119505-guiframe-udf-melba23-version-24-mar-12/page__view__findpost__p__976627 here is a short reproducer script that crashes when run as x64 under the lastest Beta (3.3.9.2) and does nto in x32:
#include <WinAPI.au3> OnAutoItExitRegister("On_Exit") ; Store registered Callback handle Global $hRegCallBack = DllCallbackRegister("_NewWndProc", "lresult", "hwnd;uint;wparam;lparam") $pProcPointer = DllCallbackGetPtr($hRegCallBack) ; Create a GUI $hGUI = GUICreate("Test", 500, 500) GUISetState(@SW_SHOW, $hGUI) ; Create a child $hGUI_Child = GUICreate("Child", 200, 200, 100, 100, 0x40000000, -1, $hGUI) ;$WS_CHILD GUICtrlCreateLabel("", 0, 0, 200, 200, -1, 0x01) ; $WS_EX_DLGMODALFRAME GUICtrlSetCursor(-1, 11) GUISetState(@SW_SHOW, $hGUI_Child) ; Subclass the child ;Global $pOldWndProc = 0 Global $pOldWndProc = _Child_SubClass($hGUI_Child) ConsoleWrite($pOldWndProc & @CRLF) If $pOldWndProc = 0 Then MsgBox(0, "Subclass", "Error") Exit EndIf While 1 If GUIGetMsg() = -3 Then Exit WEnd Func _Child_SubClass($hWnd) Local $aRet ; Subclass GUI If @AutoItX64 Then $aRet = DllCall('user32.dll', 'long_ptr', 'SetWindowLongPtrW', 'hwnd', $hWnd, 'int', -4, 'long_ptr', $pProcPointer) ; $GWL_WNDPROC Else $aRet = DllCall('user32.dll', 'long', 'SetWindowLongW', 'hwnd', $hWnd, 'int', -4, 'long', $pProcPointer) ; $GWL_WNDPROC EndIf ; Check for subclassing error If @error Or $aRet[0] = 0 Then Return 0 ; Return success Return $aRet[0] EndFunc ;==>_Child_SubClass Func _NewWndProc($hWnd, $iMsg, $wParam, $lParam) Return ProcPassMsg($hWnd, $iMsg, $wParam, $lParam) EndFunc ;==>_NewWndProc Func ProcPassMsg($hWnd, $iMsg, $wParam, $lParam) Return _WinAPI_CallWindowProc($pOldWndProc, $hWnd, $iMsg, $wParam, $lParam) EndFunc ;==>ProcPassMsg Func On_Exit() ; Delete child GUIDelete($hGUI_Child) ; Free registered Callback handle DllCallbackFree($hRegCallBack) EndFunc ;==>On_Exit
M23
Attachments (0)
Change History (1)
comment:1 Changed 13 years ago by trancexx
- Milestone set to 3.3.9.3
- Owner set to trancexx
- Resolution set to Fixed
- Status changed from new to closed
Guidelines for posting comments:
- You cannot re-open a ticket but you may still leave a comment if you have additional information to add.
- In-depth discussions should take place on the forum.
For more information see the full version of the ticket guidelines here.
Note: See
TracTickets for help on using
tickets.
Fixed by revision [6896] in version: 3.3.9.3