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

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

Fixed by revision [6896] in version: 3.3.9.3

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.

Add Comment

Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.