﻿id	summary	reporter	owner	description	type	status	milestone	component	version	severity	resolution	keywords	cc
3847	Type casting error in _WinAPI_MultiByteToWideChar	anonymous	Jpm	"This little example throws a fatal error.
{{{#!autoit
#include <GUIConstants.au3>
#include <GuiEdit.au3>

crush()

Func crush()
    GUICreate('', 400, 400)
    Local $idEdit = GUICtrlCreateEdit(@ScriptFullPath, 0, 0, 400, 350, -1, 0)
    Local $idButton_ShowLen = GUICtrlCreateButton('Show Length', 10, 360, 380, 30)
    GUISetState()

    While True
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $idButton_ShowLen
                _GUICtrlEdit_ShowBalloonTip($idEdit, 'Length', StringLen(GUICtrlRead($idEdit)), $TTI_INFO)
        EndSwitch
    WEnd
EndFunc   ;==>crush
}}}

The `_GUICtrlEdit_ShowBalloonTip` function does not cast its parameters to a string type, so `_WinAPI_MultiByteToWideChar` misunderstands the input and passes it as `""struct*""`, which results in a fatal error.


Option to solve the error:
{{{#!autoit
Func _WinAPI_MultiByteToWideChar($vText, $iCodePage = 0, $iFlags = 0, $bRetString = False)
;~ 	Local $sTextType = ""str"" ; remove
;~ 	If Not IsString($vText) Then $sTextType = ""struct*"" ; remove
	Local $sTextType = (IsDllStruct($vText) Or IsPtr($vText)) ? ""struct*"" : ""str""

	; compute size for the output WideChar
	Local $aResult = DllCall(""kernel32.dll"", ""int"", ""MultiByteToWideChar"", ""uint"", $iCodePage, ""dword"", $iFlags, _
			$sTextType, $vText, ""int"", -1, ""ptr"", 0, ""int"", 0)
	If @error Or Not $aResult[0] Then Return SetError(@error + 10, @extended, 0)

	; allocate space for output WideChar
	Local $iOut = $aResult[0]
	Local $tOut = DllStructCreate(""wchar["" & $iOut & ""]"")

	$aResult = DllCall(""kernel32.dll"", ""int"", ""MultiByteToWideChar"", ""uint"", $iCodePage, ""dword"", $iFlags, $sTextType, $vText, _
			""int"", -1, ""struct*"", $tOut, ""int"", $iOut)
	If @error Or Not $aResult[0] Then Return SetError(@error + 20, @extended, 0)

	If $bRetString Then Return DllStructGetData($tOut, 1)
	Return $tOut
EndFunc   ;==>_WinAPI_MultiByteToWideChar
}}}
"	Bug	closed	3.3.15.5	Standard UDFs	3.3.14.5	None	Fixed		
