﻿id	summary	reporter	owner	description	type	status	milestone	component	version	severity	resolution	keywords	cc
2326	Cancel not detected in _WinAPI_GetSaveFileName()	KaFu	Jpm	"Cancel is not detected in _WinAPI_GetSaveFileName() because the results of the GetSaveFileNameW call are not evaluated. See attached corrected version example (""Correction 1"" & ""Correction 2"")

{{{
#include <WinAPI.au3>

$ExportFileTypes = ""Amateur Data Interchange Format (*.adi;*.adif)""
$Path = ""C:\Test\""
$sDefFile = ""Test.adif""

$flags = BitOR(0, $OFN_PATHMUSTEXIST, $OFN_OVERWRITEPROMPT)
$aRet = _WinAPI_GetSaveFileName_Ex(""Export log entries to :"", $ExportFileTypes, $Path, $sDefFile, ""adif"", 0, $flags)
ConsoleWrite(@error & @CRLF)
If ($aRet[0] = 0) Then
	$sError = _WinAPI_CommDlgExtendedError()
	ConsoleWrite(""Cancelled"" & @CRLF)
Else
	For $N = 0 To $aRet[0]
		ConsoleWrite(""aRet["" & $N & ""] : "" & $aRet[$N] & @CRLF)
	Next
EndIf


Func _WinAPI_GetSaveFileName_Ex($sTitle = """", $sFilter = ""All files (*.*)"", $sInitalDir = ""."", $sDefaultFile = """", $sDefaultExt = """", $iFilterIndex = 1, $iFlags = 0, $iFlagsEx = 0, $hwndOwner = 0)
	Local $iPathLen = 4096 ; Max chars in returned string
	Local $tOFN = DllStructCreate($tagOPENFILENAME)
	Local $aFiles[1] = [0]

	Local $iFlag = $iFlags

	; Filter string to array conversion
	Local $asFLines = StringSplit($sFilter, ""|"")
	Local $asFilter[$asFLines[0] * 2 + 1]
	Local $iStart, $iFinal, $stFilter
	$asFilter[0] = $asFLines[0] * 2
	For $i = 1 To $asFLines[0]
		$iStart = StringInStr($asFLines[$i], ""("", 0, 1)
		$iFinal = StringInStr($asFLines[$i], "")"", 0, -1)
		$asFilter[$i * 2 - 1] = StringStripWS(StringLeft($asFLines[$i], $iStart - 1), 3)
		$asFilter[$i * 2] = StringStripWS(StringTrimRight(StringTrimLeft($asFLines[$i], $iStart), StringLen($asFLines[$i]) - $iFinal + 1), 3)
		$stFilter &= ""wchar["" & StringLen($asFilter[$i * 2 - 1]) + 1 & ""];wchar["" & StringLen($asFilter[$i * 2]) + 1 & ""];""
	Next

	Local $tTitle = DllStructCreate(""wchar Title["" & StringLen($sTitle) + 1 & ""]"")
	Local $tInitialDir = DllStructCreate(""wchar InitDir["" & StringLen($sInitalDir) + 1 & ""]"")
	Local $tFilter = DllStructCreate($stFilter & ""wchar"")
	Local $tPath = DllStructCreate(""wchar Path["" & $iPathLen & ""]"")
	Local $tExtn = DllStructCreate(""wchar Extension["" & StringLen($sDefaultExt) + 1 & ""]"")
	For $i = 1 To $asFilter[0]
		DllStructSetData($tFilter, $i, $asFilter[$i])
	Next

	; Set Data of API structures
	DllStructSetData($tTitle, ""Title"", $sTitle)
	DllStructSetData($tInitialDir, ""InitDir"", $sInitalDir)
	DllStructSetData($tPath, ""Path"", $sDefaultFile)
	DllStructSetData($tExtn, ""Extension"", $sDefaultExt)

	DllStructSetData($tOFN, ""StructSize"", DllStructGetSize($tOFN))
	DllStructSetData($tOFN, ""hwndOwner"", $hwndOwner)
	DllStructSetData($tOFN, ""lpstrFilter"", DllStructGetPtr($tFilter))
	DllStructSetData($tOFN, ""nFilterIndex"", $iFilterIndex)
	DllStructSetData($tOFN, ""lpstrFile"", DllStructGetPtr($tPath))
	DllStructSetData($tOFN, ""nMaxFile"", $iPathLen)
	DllStructSetData($tOFN, ""lpstrInitialDir"", DllStructGetPtr($tInitialDir))
	DllStructSetData($tOFN, ""lpstrTitle"", DllStructGetPtr($tTitle))
	DllStructSetData($tOFN, ""Flags"", $iFlag)
	DllStructSetData($tOFN, ""lpstrDefExt"", DllStructGetPtr($tExtn))
	DllStructSetData($tOFN, ""FlagsEx"", $iFlagsEx)
	Local $iRes = DllCall(""comdlg32.dll"", ""bool"", ""GetSaveFileNameW"", ""struct*"", $tOFN) ; Correction #1 - Added ""Local $iRes =""
	If Not $iRes[0] Then Return SetError(1, _WinAPI_CommDlgExtendedError(), $aFiles) ; Correction #2 - Added whole line
	If @error Then Return SetError(@error, @extended, $aFiles)
	Return __WinAPI_ParseFileDialogPath(DllStructGetData($tPath, ""Path""))
EndFunc   ;==>_WinAPI_GetSaveFileName_Ex
}}}"	Bug	closed	3.3.9.5	Standard UDFs	3.3.8.1	None	Fixed		
