Modify ↓
Opened 5 years ago
Closed 5 years ago
#3847 closed Bug (Fixed)
Type casting error in _WinAPI_MultiByteToWideChar
| Reported by: | anonymous | Owned by: | J-Paul Mesnage |
|---|---|---|---|
| Milestone: | 3.3.15.5 | Component: | Standard UDFs |
| Version: | 3.3.14.5 | Severity: | None |
| Keywords: | Cc: |
Description
This little example throws a fatal error.
#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:
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
Attachments (0)
Change History (3)
comment:1 by , 5 years ago
comment:3 by , 5 years ago
| Milestone: | → 3.3.15.5 |
|---|---|
| Owner: | set to |
| Resolution: | → Fixed |
| Status: | new → closed |
Fixed by revision [12588] in version: 3.3.15.5
Note:
See TracTickets
for help on using tickets.

By the way, why is
_WinAPI_MultiByteToWideCharused in_GUICtrlEdit_ShowBalloonTip? If you just allocate a buffer, everything works.