wydssx 发表于 2016-10-19 19:29:38

关于用户提供的ftp头文件中,有一个疑惑请高手解疑

本帖最后由 wydssx 于 2016-10-19 19:35 编辑

#include-once

#include "Date.au3"
#include "FileConstants.au3"
#include "StructureConstants.au3"
#include "WinAPIError.au3"

Global $__g_hWinInet_FTP = -1


Func _FTP_Close($l_InternetSession)
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)
        Local $aDone = DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $l_InternetSession)
        If @error Or $aDone = 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0)

        If $__g_bCallback_FTP = True Then DllCallbackFree($__g_hCallback_FTP)

        Return $aDone
EndFunc   ;==>_FTP_Close


Global $__g_hWinInet_FTP = -1
DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $l_InternetSession)
DllCall第一个参数不是dll文件名吗,这个位置用“-1”表示是什么用途?不懂
这个文件是Include\FTPEx.au3中的内容。

tubaba 发表于 2016-10-19 19:45:48

回复 1# wydssx


    这个头文件你一定没有看完,一般会在载入的时候运行初始化函数.然后这个变量就变成dllopen的句柄了

-1 在指针中一般代表空指针,也是用来初始化的意思

wydssx 发表于 2016-10-19 20:16:44

本帖最后由 wydssx 于 2016-10-19 20:19 编辑

这个文件中和这个变量关联的都看了。并没有初始化的动作。在调用ftp函数时,我向它传递相关参数,例如
Func _FTP_Open($s_Agent, $l_AccessType = $INTERNET_OPEN_TYPE_DIRECT, $s_ProxyName = '', $s_ProxyBypass = '', $l_Flags = 0)
        If $__g_hWinInet_FTP = -1 Then __FTP_Init()
        Local $ai_InternetOpen = DllCall($__g_hWinInet_FTP, 'handle', 'InternetOpenW', 'wstr', $s_Agent, 'dword', $l_AccessType, _
                        'wstr', $s_ProxyName, 'wstr', $s_ProxyBypass, 'dword', $l_Flags)
        If @error Or $ai_InternetOpen = 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0)
        Return $ai_InternetOpen
EndFunc   ;==>_FTP_Open
在调用执行到上面代码时,DllCall这个位置,按你说的是dllopen反回的句柄,整个过程都没有我要使用的dll文件名称,对于那么它是怎么知道要调用哪个ftp相关的dll文件呢。
附上真个文件的代码:
#include-once

#include "Date.au3"
#include "FileConstants.au3"
#include "StructureConstants.au3"
#include "WinAPIError.au3"

; #INDEX# =======================================================================================================================
; Title .........: FTP
; AutoIt Version : 3.3.13.12
; Language ......: English
; Description ...: Functions that assist with FTP.
; Author(s) .....: Wouter, Prog@ndy, jpm, Beege
; Notes .........: based on FTP_Ex.au3 16/02/2009 http://www.autoit.de/index.php?page=Thread&postID=48393
; ===============================================================================================================================

; #VARIABLES# ===================================================================================================================
Global $__g_hWinInet_FTP = -1
Global $__g_hCallback_FTP, $__g_bCallback_FTP = False
; ===============================================================================================================================

; #CONSTANTS# ===================================================================================================================
Global Const $INTERNET_OPEN_TYPE_DIRECT = 1
Global Const $INTERNET_OPEN_TYPE_PRECONFIG = 0
Global Const $INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY = 4
Global Const $INTERNET_OPEN_TYPE_PROXY = 3

Global Const $FTP_TRANSFER_TYPE_UNKNOWN = 0 ;Defaults to FTP_TRANSFER_TYPE_BINARY.
Global Const $FTP_TRANSFER_TYPE_ASCII = 1 ;Type A transfer method. Control and formatting information is converted to local equivalents.
Global Const $FTP_TRANSFER_TYPE_BINARY = 2 ;Type I transfer method. The file is transferred exactly as it exists with no changes.

Global Const $INTERNET_FLAG_PASSIVE = 0x08000000
Global Const $INTERNET_FLAG_TRANSFER_ASCII = $FTP_TRANSFER_TYPE_ASCII
Global Const $INTERNET_FLAG_TRANSFER_BINARY = $FTP_TRANSFER_TYPE_BINARY

Global Const $INTERNET_DEFAULT_FTP_PORT = 21
Global Const $INTERNET_SERVICE_FTP = 1

; _FTP_FindFileFirst flags
Global Const $INTERNET_FLAG_HYPERLINK = 0x00000400
Global Const $INTERNET_FLAG_NEED_FILE = 0x00000010
Global Const $INTERNET_FLAG_NO_CACHE_WRITE = 0x04000000
Global Const $INTERNET_FLAG_RELOAD = 0x80000000
Global Const $INTERNET_FLAG_RESYNCHRONIZE = 0x00000800

; _FTP_Open flags
Global Const $INTERNET_FLAG_ASYNC = 0x10000000
Global Const $INTERNET_FLAG_FROM_CACHE = 0x01000000
Global Const $INTERNET_FLAG_OFFLINE = $INTERNET_FLAG_FROM_CACHE

; _FTP_...() Status
Global Const $INTERNET_STATUS_CLOSING_CONNECTION = 50
Global Const $INTERNET_STATUS_CONNECTION_CLOSED = 51
Global Const $INTERNET_STATUS_CONNECTING_TO_SERVER = 20
Global Const $INTERNET_STATUS_CONNECTED_TO_SERVER = 21
Global Const $INTERNET_STATUS_CTL_RESPONSE_RECEIVED = 42
Global Const $INTERNET_STATUS_INTERMEDIATE_RESPONSE = 120
Global Const $INTERNET_STATUS_PREFETCH = 43
Global Const $INTERNET_STATUS_REDIRECT = 110
Global Const $INTERNET_STATUS_REQUEST_COMPLETE = 100
Global Const $INTERNET_STATUS_HANDLE_CREATED = 60
Global Const $INTERNET_STATUS_HANDLE_CLOSING = 70
Global Const $INTERNET_STATUS_SENDING_REQUEST = 30
Global Const $INTERNET_STATUS_REQUEST_SENT = 31
Global Const $INTERNET_STATUS_RECEIVING_RESPONSE = 40
Global Const $INTERNET_STATUS_RESPONSE_RECEIVED = 41
Global Const $INTERNET_STATUS_STATE_CHANGE = 200
Global Const $INTERNET_STATUS_RESOLVING_NAME = 10
Global Const $INTERNET_STATUS_NAME_RESOLVED = 11
; ===============================================================================================================================

; #CURRENT# =====================================================================================================================
; _FTP_Close
; _FTP_Command
; _FTP_Connect
; _FTP_DecodeInternetStatus
; _FTP_DirCreate
; _FTP_DirDelete
; _FTP_DirGetCurrent
; _FTP_DirPutContents
; _FTP_DirSetCurrent
; _FTP_FileClose
; _FTP_FileDelete
; _FTP_FileGet
; _FTP_FileGetSize
; _FTP_FileOpen
; _FTP_FilePut
; _FTP_FileRead
; _FTP_FileRename
; _FTP_FileTimeLoHiToStr
; _FTP_FindFileClose
; _FTP_FindFileFirst
; _FTP_FindFileNext
; _FTP_GetLastResponseInfo
; _FTP_ListToArray
; _FTP_ListToArray2D
; _FTP_ListToArrayEx
; _FTP_Open
; _FTP_ProgressDownload
; _FTP_ProgressUpload
; _FTP_SetStatusCallback
; ===============================================================================================================================

; #INTERNAL_USE_ONLY#============================================================================================================
; __FTP_ListToArray
; __FTP_Init
; ===============================================================================================================================

; #FUNCTION# ====================================================================================================================
; Author ........: Wouter van Kesteren
; Modified.......: Beege
; ===============================================================================================================================
Func _FTP_Close($l_InternetSession)
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)
        Local $aDone = DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $l_InternetSession)
        If @error Or $aDone = 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0)

        If $__g_bCallback_FTP = True Then DllCallbackFree($__g_hCallback_FTP)

        Return $aDone
EndFunc   ;==>_FTP_Close

; #FUNCTION# ====================================================================================================================
; Author ........: Bill Mezian
; Modified.......:
; ===============================================================================================================================
Func _FTP_Command($l_FTPSession, $s_FTPCommand, $l_Flags = $FTP_TRANSFER_TYPE_ASCII, $l_ExpectResponse = 0, $iContext = 0)
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)
        Local $ai_FTPCommand = DllCall($__g_hWinInet_FTP, 'bool', 'FtpCommandW', 'handle', $l_FTPSession, 'bool', $l_ExpectResponse, 'dword', $l_Flags, 'wstr', $s_FTPCommand, 'dword_ptr', $iContext, 'ptr*', 0)
        If @error Or $ai_FTPCommand = 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0)

        Return SetError(0, $ai_FTPCommand, $ai_FTPCommand)
EndFunc   ;==>_FTP_Command

; #FUNCTION# ====================================================================================================================
; Author ........: Wouter van Kesteren
; Modified.......:
; ===============================================================================================================================
Func _FTP_Connect($l_InternetSession, $s_ServerName, $s_Username, $s_Password, $i_Passive = 0, $i_ServerPort = 0, $l_Service = $INTERNET_SERVICE_FTP, $l_Flags = 0, $iContext = 0)
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)
        If $i_Passive == 1 Then $l_Flags = BitOR($l_Flags, $INTERNET_FLAG_PASSIVE)
        Local $ai_InternetConnect = DllCall($__g_hWinInet_FTP, 'hwnd', 'InternetConnectW', 'handle', $l_InternetSession, 'wstr', $s_ServerName, 'ushort', $i_ServerPort, 'wstr', $s_Username, 'wstr', $s_Password, 'dword', $l_Service, 'dword', $l_Flags, 'dword_ptr', $iContext)
        If @error Or $ai_InternetConnect = 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0)

        Return $ai_InternetConnect
EndFunc   ;==>_FTP_Connect

; #FUNCTION# ====================================================================================================================
; Author ........: Beege
; Modified.......: jpm
; ===============================================================================================================================
Func _FTP_DecodeInternetStatus($iInternetStatus)
        Switch $iInternetStatus
                Case $INTERNET_STATUS_CLOSING_CONNECTION
                        Return 'Closing connection ...'

                Case $INTERNET_STATUS_CONNECTION_CLOSED
                        Return 'Connection closed'

                Case $INTERNET_STATUS_CONNECTING_TO_SERVER
                        Return 'Connecting to server ...'

                Case $INTERNET_STATUS_CONNECTED_TO_SERVER
                        Return 'Connected to server'

                Case $INTERNET_STATUS_CTL_RESPONSE_RECEIVED
                        Return 'CTL esponse received'

                Case $INTERNET_STATUS_INTERMEDIATE_RESPONSE
                        Return 'Intermediate response'

                Case $INTERNET_STATUS_PREFETCH
                        Return 'Prefetch'

                Case $INTERNET_STATUS_REDIRECT
                        Return 'Redirect'

                Case $INTERNET_STATUS_REQUEST_COMPLETE
                        Return 'Request complete'

                Case $INTERNET_STATUS_HANDLE_CREATED
                        Return 'Handle created'

                Case $INTERNET_STATUS_HANDLE_CLOSING
                        Return 'Handle closing ...'

                Case $INTERNET_STATUS_SENDING_REQUEST
                        Return 'Sending request ...'

                Case $INTERNET_STATUS_REQUEST_SENT
                        Return 'Request sent'

                Case $INTERNET_STATUS_RECEIVING_RESPONSE
                        Return 'Receiving response ...'

                Case $INTERNET_STATUS_RESPONSE_RECEIVED
                        Return 'Response received'

                Case $INTERNET_STATUS_STATE_CHANGE
                        Return 'State change'

                Case $INTERNET_STATUS_RESOLVING_NAME
                        Return 'Resolving name ...'

                Case $INTERNET_STATUS_NAME_RESOLVED
                        Return 'Name resolved'
                Case Else
                        Return 'UNKNOWN status = ' & $iInternetStatus
        EndSwitch
EndFunc   ;==>_FTP_DecodeInternetStatus

; #FUNCTION# ====================================================================================================================
; Author ........: Wouter van Kesteren
; Modified.......:
; ===============================================================================================================================
Func _FTP_DirCreate($l_FTPSession, $s_Remote)
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)
        Local $ai_FTPMakeDir = DllCall($__g_hWinInet_FTP, 'bool', 'FtpCreateDirectoryW', 'handle', $l_FTPSession, 'wstr', $s_Remote)
        If @error Or $ai_FTPMakeDir = 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0)

        Return $ai_FTPMakeDir
EndFunc   ;==>_FTP_DirCreate

; #FUNCTION# ====================================================================================================================
; Author ........: Wouter van Kesteren
; Modified.......:
; ===============================================================================================================================
Func _FTP_DirDelete($l_FTPSession, $s_Remote)
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)
        Local $ai_FTPDelDir = DllCall($__g_hWinInet_FTP, 'bool', 'FtpRemoveDirectoryW', 'handle', $l_FTPSession, 'wstr', $s_Remote)
        If @error Or $ai_FTPDelDir = 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0)

        Return $ai_FTPDelDir
EndFunc   ;==>_FTP_DirDelete

; #FUNCTION# ====================================================================================================================
; Author ........: Beast
; Modified.......:
; ===============================================================================================================================
Func _FTP_DirGetCurrent($l_FTPSession)
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)
        Local $ai_FTPGetCurrentDir = DllCall($__g_hWinInet_FTP, 'bool', 'FtpGetCurrentDirectoryW', 'handle', $l_FTPSession, 'wstr', "", 'dword*', 260)
        If @error Or $ai_FTPGetCurrentDir = 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0)

        Return $ai_FTPGetCurrentDir
EndFunc   ;==>_FTP_DirGetCurrent

; #FUNCTION# ====================================================================================================================
; Author ........: Stumpii
; Modified.......:
; ===============================================================================================================================
Func _FTP_DirPutContents($l_InternetSession, $s_LocalFolder, $s_RemoteFolder, $b_RecursivePut, $iContext = 0)
        If StringRight($s_LocalFolder, 1) == "\" Then $s_LocalFolder = StringTrimRight($s_LocalFolder, 1)
        ; Shows the filenames of all files in the current directory.
        Local $hSearch = FileFindFirstFile($s_LocalFolder & "\*.*")

        ; Check if the search was successful
        If $hSearch = -1 Then Return SetError(1, 0, 0)

        Local $sFile
        While 1
                $sFile = FileFindNextFile($hSearch)
                If @error Then ExitLoop
                If StringInStr(FileGetAttrib($s_LocalFolder & "\" & $sFile), "D") Then
                        _FTP_DirCreate($l_InternetSession, $s_RemoteFolder & "/" & $sFile)
                        If $b_RecursivePut Then
                                _FTP_DirPutContents($l_InternetSession, $s_LocalFolder & "\" & $sFile, $s_RemoteFolder & "/" & $sFile, $b_RecursivePut, $iContext)
                        EndIf
                Else
                        _FTP_FilePut($l_InternetSession, $s_LocalFolder & "\" & $sFile, $s_RemoteFolder & "/" & $sFile, 0, $iContext)
                EndIf
        WEnd

        ; Close the search handle
        FileClose($hSearch)
        Return 1
EndFunc   ;==>_FTP_DirPutContents

; #FUNCTION# ====================================================================================================================
; Author ........: Beast
; Modified.......:
; ===============================================================================================================================
Func _FTP_DirSetCurrent($l_FTPSession, $s_Remote)
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)
        Local $ai_FTPSetCurrentDir = DllCall($__g_hWinInet_FTP, 'bool', 'FtpSetCurrentDirectoryW', 'handle', $l_FTPSession, 'wstr', $s_Remote)
        If @error Or $ai_FTPSetCurrentDir = 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0)

        Return $ai_FTPSetCurrentDir
EndFunc   ;==>_FTP_DirSetCurrent

; #FUNCTION# ====================================================================================================================
; Author ........: joeyb1275
; Modified.......: Prog@ndy
; ===============================================================================================================================
Func _FTP_FileClose($l_InternetSession)
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)
        Local $aDone = DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $l_InternetSession)
        If @error Or $aDone = 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0)

        Return $aDone
EndFunc   ;==>_FTP_FileClose

; #FUNCTION# ====================================================================================================================
; Author ........: Wouter van Kesteren
; Modified.......:
; ===============================================================================================================================
Func _FTP_FileDelete($l_FTPSession, $s_RemoteFile)
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)
        Local $ai_FTPPutFile = DllCall($__g_hWinInet_FTP, 'bool', 'FtpDeleteFileW', 'handle', $l_FTPSession, 'wstr', $s_RemoteFile)
        If @error Or $ai_FTPPutFile = 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0)

        Return $ai_FTPPutFile
EndFunc   ;==>_FTP_FileDelete

; #FUNCTION# ====================================================================================================================
; Author ........: Wouter van Kesteren
; Modified.......:
; ===============================================================================================================================
Func _FTP_FileGet($l_FTPSession, $s_RemoteFile, $s_LocalFile, $bFailIfExists = False, $iFlagsAndAttributes = 0, $l_Flags = $FTP_TRANSFER_TYPE_UNKNOWN, $iContext = 0)
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)
        Local $ai_FTPGetFile = DllCall($__g_hWinInet_FTP, 'bool', 'FtpGetFileW', 'handle', $l_FTPSession, 'wstr', $s_RemoteFile, 'wstr', $s_LocalFile, 'bool', $bFailIfExists, 'dword', $iFlagsAndAttributes, 'dword', $l_Flags, 'dword_ptr', $iContext)
        If @error Or $ai_FTPGetFile = 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0)

        Return $ai_FTPGetFile
EndFunc   ;==>_FTP_FileGet

; #FUNCTION# ====================================================================================================================
; Author ........: Joachim de Koning
; Modified.......: jpm
; ===============================================================================================================================
Func _FTP_FileGetSize($l_FTPSession, $s_FileName)
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)
        Local $ai_FTPGetSizeHandle = DllCall($__g_hWinInet_FTP, 'handle', 'FtpOpenFileW', 'handle', $l_FTPSession, 'wstr', $s_FileName, 'dword', $GENERIC_READ, 'dword', $INTERNET_FLAG_NO_CACHE_WRITE + $INTERNET_FLAG_TRANSFER_BINARY, 'dword_ptr', 0)
        If @error Or $ai_FTPGetSizeHandle = 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0)

        Local $ai_FTPGetFileSize = DllCall($__g_hWinInet_FTP, 'dword', 'FtpGetFileSize', 'handle', $ai_FTPGetSizeHandle, 'dword*', 0)
        If @error Or $ai_FTPGetFileSize = 0 Then
                Local $iLasterror = _WinAPI_GetLastError()
                DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_FTPGetSizeHandle)
                ; No need to test @error.

                Return SetError(-1, $iLasterror, 0)
        EndIf

        DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_FTPGetSizeHandle)
        ; No need to test @error.

        Return _WinAPI_MakeQWord($ai_FTPGetFileSize, $ai_FTPGetFileSize)
EndFunc   ;==>_FTP_FileGetSize

; #FUNCTION# ====================================================================================================================
; Author ........: joeyb1275
; Modified.......: Prog@ndy
; ===============================================================================================================================
Func _FTP_FileOpen($hConnect, $sFileName, $iAccess = $GENERIC_READ, $iFlags = $INTERNET_FLAG_TRANSFER_BINARY, $iContext = 0)
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)
        Local $ai_FtpOpenfile = DllCall($__g_hWinInet_FTP, 'handle', 'FtpOpenFileW', 'handle', $hConnect, 'wstr', $sFileName, 'dword', $iAccess, 'dword', $iFlags, 'dword_ptr', $iContext)
        If @error Or $ai_FtpOpenfile == 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0)

        Return $ai_FtpOpenfile
EndFunc   ;==>_FTP_FileOpen

; #FUNCTION# ====================================================================================================================
; Author ........: Wouter van Kesteren
; Modified.......:
; ===============================================================================================================================
Func _FTP_FilePut($l_FTPSession, $s_LocalFile, $s_RemoteFile, $l_Flags = 0, $iContext = 0)
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)
        Local $ai_FTPPutFile = DllCall($__g_hWinInet_FTP, 'bool', 'FtpPutFileW', 'handle', $l_FTPSession, 'wstr', $s_LocalFile, 'wstr', $s_RemoteFile, 'dword', $l_Flags, 'dword_ptr', $iContext)
        If @error Or $ai_FTPPutFile = 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0)

        Return $ai_FTPPutFile
EndFunc   ;==>_FTP_FilePut

; #FUNCTION# ====================================================================================================================
; Author ........: joeyb1275
; Modified.......: Prog@ndy
; ===============================================================================================================================
Func _FTP_FileRead($h_File, $iNumberOfBytesToRead)
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)
        Local $tBuffer = DllStructCreate("byte[" & $iNumberOfBytesToRead & "]")

        Local $ai_FTPReadFile = DllCall($__g_hWinInet_FTP, 'bool', 'InternetReadFile', 'handle', $h_File, 'struct*', $tBuffer, 'dword', $iNumberOfBytesToRead, 'dword*', 0) ;LPDWORD lpdwNumberOfBytesRead
        If @error Then Return SetError(1, _WinAPI_GetLastError(), 0)

        Local $iNumberOfBytesRead = $ai_FTPReadFile
        If $iNumberOfBytesRead == 0 And $ai_FTPReadFile == 1 Then
                Return SetError(-1, 0, 0)
        ElseIf $ai_FTPReadFile == 0 Then
                Return SetError(2, _WinAPI_GetLastError(), 0)
        EndIf

        Local $s_FileRead
        If $iNumberOfBytesToRead > $iNumberOfBytesRead Then
                $s_FileRead = BinaryMid(DllStructGetData($tBuffer, 1), 1, $iNumberOfBytesRead) ;index is omitted so the entire array is written into $s_FileRead as a BinaryString
        Else
                $s_FileRead = DllStructGetData($tBuffer, 1) ;index is omitted so the entire array is written into $s_FileRead as a BinaryString
        EndIf

        Return SetError(0, $iNumberOfBytesRead, $s_FileRead)
EndFunc   ;==>_FTP_FileRead

; #FUNCTION# ====================================================================================================================
; Author ........: Wouter van Kesteren
; Modified.......:
; ===============================================================================================================================
Func _FTP_FileRename($l_FTPSession, $s_Existing, $s_New)
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)
        Local $ai_FTPRenameFile = DllCall($__g_hWinInet_FTP, 'bool', 'FtpRenameFileW', 'handle', $l_FTPSession, 'wstr', $s_Existing, 'wstr', $s_New)
        If @error Or $ai_FTPRenameFile = 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0)

        Return $ai_FTPRenameFile
EndFunc   ;==>_FTP_FileRename

; #FUNCTION# ====================================================================================================================
; Author ........: Prog@ndy
; Modified.......:
; ===============================================================================================================================
Func _FTP_FileTimeLoHiToStr($iLoDWORD, $iHiDWORD, $bFmt = 0)
        Local $tFileTime = DllStructCreate($tagFILETIME)
        If Not $iLoDWORD And Not $iHiDWORD Then Return SetError(1, 0, "")
        DllStructSetData($tFileTime, 1, $iLoDWORD)
        DllStructSetData($tFileTime, 2, $iHiDWORD)
        Local $sDate = _Date_Time_FileTimeToStr($tFileTime, $bFmt)
        Return SetError(@error, @extended, $sDate)
EndFunc   ;==>_FTP_FileTimeLoHiToStr

; #FUNCTION# ====================================================================================================================
; Author ........: Dick Bronsdijk
; Modified.......: Prog@ndy, jpm
; ===============================================================================================================================
Func _FTP_FindFileClose($h_Handle)
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)
        Local $ai_FTPPutFile = DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $h_Handle)
        If @error Or $ai_FTPPutFile = 0 Then Return SetError(-1, _WinAPI_GetLastError(), "")

        Return $ai_FTPPutFile
EndFunc   ;==>_FTP_FindFileClose

; #FUNCTION# ====================================================================================================================
; Author ........: Dick Bronsdijk
; Modified.......: Prog@ndy, jpm
; ===============================================================================================================================
Func _FTP_FindFileFirst($l_FTPSession, $s_RemotePath, ByRef $h_Handle, $l_Flags = 0, $iContext = 0)
        ;flags = 0 changed to $INTERNET_FLAG_TRANSFER_BINARY to see if stops hanging
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)
        Local $t_DllStruct = DllStructCreate($tagWIN32_FIND_DATA)
        If @error Then Return SetError(-3, 0, "")

        Local $a_FTPFileList
        $a_FTPFileList = 0

        Local $ai_FTPFirstFile = DllCall($__g_hWinInet_FTP, 'handle', 'FtpFindFirstFileW', 'handle', $l_FTPSession, 'wstr', $s_RemotePath, 'struct*', $t_DllStruct, 'dword', $l_Flags, 'dword_ptr', $iContext)
        If @error Or $ai_FTPFirstFile = 0 Then Return SetError(-1, _WinAPI_GetLastError(), $ai_FTPFirstFile)

        $h_Handle = $ai_FTPFirstFile

        Local $a_FTPFileList
        $a_FTPFileList = 11
        $a_FTPFileList = DllStructGetData($t_DllStruct, "dwFileAttributes")
        $a_FTPFileList = DllStructGetData($t_DllStruct, "ftCreationTime", 1)
        $a_FTPFileList = DllStructGetData($t_DllStruct, "ftCreationTime", 2)
        $a_FTPFileList = DllStructGetData($t_DllStruct, "ftLastAccessTime", 1)
        $a_FTPFileList = DllStructGetData($t_DllStruct, "ftLastAccessTime", 2)
        $a_FTPFileList = DllStructGetData($t_DllStruct, "ftLastWriteTime", 1)
        $a_FTPFileList = DllStructGetData($t_DllStruct, "ftLastWriteTime", 2)
        $a_FTPFileList = DllStructGetData($t_DllStruct, "nFileSizeHigh")
        $a_FTPFileList = DllStructGetData($t_DllStruct, "nFileSizeLow")
        $a_FTPFileList = DllStructGetData($t_DllStruct, "cFileName")
        $a_FTPFileList = DllStructGetData($t_DllStruct, "cAlternateFileName")

        Return $a_FTPFileList
EndFunc   ;==>_FTP_FindFileFirst

; #FUNCTION# ====================================================================================================================
; Author ........: Dick Bronsdijk
; Modified.......: Prog@ndy, jpm
; ===============================================================================================================================
Func _FTP_FindFileNext($h_Handle)
        Local $t_DllStruct = DllStructCreate($tagWIN32_FIND_DATA)

        Local $a_FTPFileList
        $a_FTPFileList = 0

        Local $ai_FTPPutFile = DllCall($__g_hWinInet_FTP, 'bool', 'InternetFindNextFileW', 'handle', $h_Handle, 'struct*', $t_DllStruct)
        If @error Or $ai_FTPPutFile = 0 Then Return SetError(-1, _WinAPI_GetLastError(), $a_FTPFileList)

        Local $a_FTPFileList
        $a_FTPFileList = 11
        $a_FTPFileList = DllStructGetData($t_DllStruct, "dwFileAttributes")
        $a_FTPFileList = DllStructGetData($t_DllStruct, "ftCreationTime", 1)
        $a_FTPFileList = DllStructGetData($t_DllStruct, "ftCreationTime", 2)
        $a_FTPFileList = DllStructGetData($t_DllStruct, "ftLastAccessTime", 1)
        $a_FTPFileList = DllStructGetData($t_DllStruct, "ftLastAccessTime", 2)
        $a_FTPFileList = DllStructGetData($t_DllStruct, "ftLastWriteTime", 1)
        $a_FTPFileList = DllStructGetData($t_DllStruct, "ftLastWriteTime", 2)
        $a_FTPFileList = DllStructGetData($t_DllStruct, "nFileSizeHigh")
        $a_FTPFileList = DllStructGetData($t_DllStruct, "nFileSizeLow")
        $a_FTPFileList = DllStructGetData($t_DllStruct, "cFileName")
        $a_FTPFileList = DllStructGetData($t_DllStruct, "cAlternateFileName")

        Return $a_FTPFileList
EndFunc   ;==>_FTP_FindFileNext

; #FUNCTION# ====================================================================================================================
; Author ........: jpm
; Modified.......:
; ===============================================================================================================================
Func _FTP_GetLastResponseInfo(ByRef $iError, ByRef $sMessage)
        Local $ai_LastResponseInfo = DllCall($__g_hWinInet_FTP, 'bool', 'InternetGetLastResponseInfoW', 'dword*', 0, 'wstr', "", 'dword*', 4096)
        If @error Or $ai_LastResponseInfo = 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0)
        $iError = $ai_LastResponseInfo
        $sMessage = $ai_LastResponseInfo
        Return $ai_LastResponseInfo
EndFunc   ;==>_FTP_GetLastResponseInfo

; #FUNCTION# ====================================================================================================================
; Author ........: Beast, Prog@ndy
; Modified.......:
; ===============================================================================================================================
Func _FTP_ListToArray($l_FTPSession, $iReturn_Type = 0, $l_Flags = $INTERNET_FLAG_NO_CACHE_WRITE, $iContext = 0)
        Local $aArray
        $aArray = 0
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, $aArray)
        $aArray = __FTP_ListToArray($l_FTPSession, $iReturn_Type, $l_Flags, 0, 1, $iContext)
        Return SetError(@error, @extended, $aArray)
EndFunc   ;==>_FTP_ListToArray

; #FUNCTION# ====================================================================================================================
; Author ........: Prog@ndy
; Modified.......: jpm
; ===============================================================================================================================
Func _FTP_ListToArray2D($l_FTPSession, $iReturn_Type = 0, $l_Flags = $INTERNET_FLAG_NO_CACHE_WRITE, $iContext = 0)
        Local $aArray
        $aArray = 0
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, $aArray)
        $aArray = __FTP_ListToArray($l_FTPSession, $iReturn_Type, $l_Flags, 0, 2, $iContext)
        Return SetError(@error, @extended, $aArray)
EndFunc   ;==>_FTP_ListToArray2D

; #FUNCTION# ====================================================================================================================
; Author ........: Beast, Prog@ndy
; Modified.......: jpm
; ===============================================================================================================================
Func _FTP_ListToArrayEx($l_FTPSession, $iReturn_Type = 0, $l_Flags = $INTERNET_FLAG_NO_CACHE_WRITE, $b_Fmt = 1, $iContext = 0)
        Local $aArray
        $aArray = 0
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, $aArray)
        $aArray = __FTP_ListToArray($l_FTPSession, $iReturn_Type, $l_Flags, $b_Fmt, 6, $iContext)
        Return SetError(@error, @extended, $aArray)
EndFunc   ;==>_FTP_ListToArrayEx

; #FUNCTION# ====================================================================================================================
; Author ........: Wouter van Kesteren
; Modified.......:
; ===============================================================================================================================
Func _FTP_Open($s_Agent, $l_AccessType = $INTERNET_OPEN_TYPE_DIRECT, $s_ProxyName = '', $s_ProxyBypass = '', $l_Flags = 0)
        If $__g_hWinInet_FTP = -1 Then __FTP_Init()
        Local $ai_InternetOpen = DllCall($__g_hWinInet_FTP, 'handle', 'InternetOpenW', 'wstr', $s_Agent, 'dword', $l_AccessType, _
                        'wstr', $s_ProxyName, 'wstr', $s_ProxyBypass, 'dword', $l_Flags)
        If @error Or $ai_InternetOpen = 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0)

        Return $ai_InternetOpen
EndFunc   ;==>_FTP_Open

; #FUNCTION# ====================================================================================================================
; Author ........: limette, Prog@ndy
; Modified.......: jchd
; ===============================================================================================================================
Func _FTP_ProgressDownload($l_FTPSession, $s_LocalFile, $s_RemoteFile, $hFunctionCall = 0)
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)

        Local $hFile = FileOpen($s_LocalFile, $FO_OVERWRITE + $FO_BINARY)
        If $hFile < 0 Then Return SetError(-1, 0, 0)

        Local $ai_FtpOpenfile = DllCall($__g_hWinInet_FTP, 'handle', 'FtpOpenFileW', 'handle', $l_FTPSession, 'wstr', $s_RemoteFile, 'dword', $GENERIC_READ, 'dword', $FTP_TRANSFER_TYPE_BINARY, 'dword_ptr', 0)
        If @error Or $ai_FtpOpenfile = 0 Then Return SetError(-3, _WinAPI_GetLastError(), 0)

        Local $ai_FTPGetFileSize = DllCall($__g_hWinInet_FTP, 'dword', 'FtpGetFileSize', 'handle', $ai_FtpOpenfile, 'dword*', 0)
        If @error Then Return SetError(-2, _WinAPI_GetLastError(), 0)

        If Not IsFunc($hFunctionCall) Then ProgressOn("FTP Download", "Downloading " & $s_LocalFile)

        Local $iLen = _WinAPI_MakeQWord($ai_FTPGetFileSize, $ai_FTPGetFileSize) ;FileGetSize($s_RemoteFile)
        Local Const $iChunkSize = 256 * 1024
        Local $iLast = Mod($iLen, $iChunkSize)

        Local $iParts = Ceiling($iLen / $iChunkSize)
        Local $tBuffer = DllStructCreate("byte[" & $iChunkSize & "]")

        Local $aDone, $ai_FTPread, $iOut, $iRet, $iLasterror
        Local $x = $iChunkSize
        Local $iDone = 0
        For $i = 1 To $iParts
                If $i = $iParts And $iLast > 0 Then
                        $x = $iLast
                EndIf

                $ai_FTPread = DllCall($__g_hWinInet_FTP, 'bool', 'InternetReadFile', 'handle', $ai_FtpOpenfile, 'struct*', $tBuffer, 'dword', $x, 'dword*', $iOut)
                If @error Or $ai_FTPread = 0 Then
                        $iLasterror = _WinAPI_GetLastError()
                        $aDone = DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_FtpOpenfile)
                        ; No need to test @error.
                        FileClose($hFile)
                        If Not IsFunc($hFunctionCall) Then ProgressOff()
                        Return SetError(-4, $iLasterror, 0)
                EndIf
                $iRet = FileWrite($hFile, BinaryMid(DllStructGetData($tBuffer, 1), 1, $ai_FTPread))
                If Not $iRet Then
                        $iLasterror = _WinAPI_GetLastError()
                        $aDone = DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_FtpOpenfile)
                        ; No need to test @error.
                        FileClose($hFile)
                        FileDelete($s_LocalFile)
                        If Not IsFunc($hFunctionCall) Then ProgressOff()
                        Return SetError(-7, $iLasterror, 0)
                EndIf
                $iDone += $ai_FTPread

                If Not IsFunc($hFunctionCall) Then
                        ProgressSet(($iDone / $iLen) * 100)
                Else
                        $iRet = $hFunctionCall(($iDone / $iLen) * 100)
                        If $iRet <= 0 Then
                                $iLasterror = @error
                                $aDone = DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_FtpOpenfile)
                                ; No need to test @error.
                                FileClose($hFile)
                                FileDelete($s_LocalFile)
                                If Not IsFunc($hFunctionCall) Then ProgressOff()
                                Return SetError(-6, $iLasterror, $iRet)
                        EndIf
                EndIf
                Sleep(10)
        Next

        FileClose($hFile)

        If Not IsFunc($hFunctionCall) Then ProgressOff()

        $aDone = DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_FtpOpenfile)
        If @error Or $aDone = 0 Then
                Return SetError(-5, _WinAPI_GetLastError(), 0)
        EndIf

        Return 1
EndFunc   ;==>_FTP_ProgressDownload

; #FUNCTION# ====================================================================================================================
; Author ........: limette, Prog@ndy
; Modified.......: jchd
; ===============================================================================================================================
Func _FTP_ProgressUpload($l_FTPSession, $s_LocalFile, $s_RemoteFile, $hFunctionCall = 0)
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)

        Local $hFile = FileOpen($s_LocalFile, $FO_BINARY)
        If @error Then Return SetError(-1, _WinAPI_GetLastError(), 0)

        Local $ai_FtpOpenfile = DllCall($__g_hWinInet_FTP, 'handle', 'FtpOpenFileW', 'handle', $l_FTPSession, 'wstr', $s_RemoteFile, 'dword', $GENERIC_WRITE, 'dword', $FTP_TRANSFER_TYPE_BINARY, 'dword_ptr', 0)
        If @error Or $ai_FtpOpenfile = 0 Then Return SetError(-3, _WinAPI_GetLastError(), 0)

        If Not IsFunc($hFunctionCall) Then ProgressOn("FTP Upload", "Uploading " & $s_LocalFile)

        Local $iLen = FileGetSize($s_LocalFile)
        Local Const $iChunkSize = 256 * 1024
        Local $iLast = Mod($iLen, $iChunkSize)

        Local $iParts = Ceiling($iLen / $iChunkSize)
        Local $tBuffer = DllStructCreate("byte[" & $iChunkSize & "]")

        Local $aDone, $ai_FtpWrite, $iOut, $iRet, $iLasterror
        Local $x = $iChunkSize
        Local $iDone = 0
        For $i = 1 To $iParts
                If $i = $iParts And $iLast > 0 Then
                        $x = $iLast
                EndIf
                DllStructSetData($tBuffer, 1, FileRead($hFile, $x))

                $ai_FtpWrite = DllCall($__g_hWinInet_FTP, 'bool', 'InternetWriteFile', 'handle', $ai_FtpOpenfile, 'struct*', $tBuffer, 'dword', $x, 'dword*', $iOut)
                If @error Or $ai_FtpWrite = 0 Then
                        $iLasterror = _WinAPI_GetLastError()
                        $aDone = DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_FtpOpenfile)
                        ; No need to test @error.
                        FileClose($hFile)

                        If Not IsFunc($hFunctionCall) Then ProgressOff()
                        Return SetError(-4, $iLasterror, 0)
                EndIf
                $iDone += $x

                If Not IsFunc($hFunctionCall) Then
                        ProgressSet(($iDone / $iLen) * 100)
                Else
                        $iRet = $hFunctionCall(($iDone / $iLen) * 100)
                        If $iRet <= 0 Then
                                $iLasterror = @error
                                $aDone = DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_FtpOpenfile)
                                ; No need to test @error.
                                DllCall($__g_hWinInet_FTP, 'bool', 'FtpDeleteFileW', 'handle', $l_FTPSession, 'wstr', $s_RemoteFile)
                                ; No need to test @error.
                                FileClose($hFile)
                                If Not IsFunc($hFunctionCall) Then ProgressOff()
                                Return SetError(-6, $iLasterror, $iRet)
                        EndIf
                EndIf
                Sleep(10)
        Next

        FileClose($hFile)

        If Not IsFunc($hFunctionCall) Then ProgressOff()

        $aDone = DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_FtpOpenfile)
        ; No need to test @error.
        If @error Or $aDone = 0 Then Return SetError(-5, _WinAPI_GetLastError(), 0)

        Return 1
EndFunc   ;==>_FTP_ProgressUpload

; FUNCTION# ====================================================================================================================
; Name...........: _FTP_SetStatusCallback
; Description ...: Registers callback function that WinINet functions can call as progress is made during an operation.
; Syntax.........: _InternetSetStatusCallback ($l_InternetSession, $sFunctionName )
; Parameters ....: $l_InternetSession   - as returned by _FTP_Open().
;                  $sFunctionName       - The name of the User Defined Function to call
; Return values .: Success      - Pointer to callback function
;                  Failure      - 0 and Set @error
; Author ........: Beege
; Modified.......: jpm
; Remarks .......:
; Related .......: _FTP_DecodeInternetStatus
; Link ..........: @@MsdnLink@@ InternetSetStatusCallback
; Example .......: Yes
; ===============================================================================================================================
Func _FTP_SetStatusCallback($l_InternetSession, $sFunctionName)
        If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)

        Local $hCallBack_Register = DllCallbackRegister($sFunctionName, "none", "ptr;ptr;dword;ptr;dword")
        If Not $hCallBack_Register Then Return SetError(-1, 0, 0)

        Local $ah_CallBackFunction = DllCall('wininet.dll', "ptr", "InternetSetStatusCallback", "ptr", $l_InternetSession, "ulong_ptr", DllCallbackGetPtr($hCallBack_Register))
        If @error Then Return SetError(-3, 0, 0)
        If $ah_CallBackFunction = Ptr(-1) Then Return SetError(-4, 0, 0) ; INTERNET_INVALID_STATUS_CALLBACK

        $__g_bCallback_FTP = True
        $__g_hCallback_FTP = $hCallBack_Register
        Return $ah_CallBackFunction
EndFunc   ;==>_FTP_SetStatusCallback

; #INTERNAL_USE_ONLY# ===========================================================================================================
; Name...........: __FTP_ListToArray
; Description ...:
; Syntax.........: __FTP_ListToArray ( $l_FTPSession [, $iReturn_Type = 0 [, $l_Flags = 0 [, $bFmt = 1 [, $iArrayCount = 6 [, $iContext = 0 ]]]]] )
; Parameters ....:
; Return values .: an 2D array with the requested info defined by $iArrayCount
;                   Filename
;                   Filesize
;                   FileAttribute
;                   File Modification time
;                   File Creation time
;                   File Access time
; Author ........: Beast, Prog@ndy
; Modified.......: jpm (to be use by external UDFs)
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......:
; ===============================================================================================================================
Func __FTP_ListToArray($l_FTPSession, $iReturn_Type, $l_Flags, $bFmt, $iArrayCount, $iContext)
        If $iArrayCount = 1 Then
                Local $asFileArray, $aDirectoryArray
                $asFileArray = 0
        Else
                Local $asFileArray[$iArrayCount], $aDirectoryArray[$iArrayCount]
                $asFileArray = 0
        EndIf

        If $iReturn_Type < 0 Or $iReturn_Type > 2 Then Return SetError(3, 0, $asFileArray)

        ; Global Const $tagWIN32_FIND_DATA = "DWORD dwFileAttributes; dword ftCreationTime; dword ftLastAccessTime; dword ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; dword dwReserved0; dword dwReserved1; WCHAR cFileName; WCHAR cAlternateFileName;"
        Local $tWIN32_FIND_DATA = DllStructCreate($tagWIN32_FIND_DATA)
        Local $iLasterror
        Local $aCallFindFirst = DllCall($__g_hWinInet_FTP, 'handle', 'FtpFindFirstFileW', 'handle', $l_FTPSession, 'wstr', "", 'struct*', $tWIN32_FIND_DATA, 'dword', $l_Flags, 'dword_ptr', $iContext)
        If @error Or Not $aCallFindFirst Then
                $iLasterror = _WinAPI_GetLastError()
                If $iLasterror = 12003 Then ; ERROR_INTERNET_EXTENDED_ERROR
                        Local $iError, $sMessage
                        _FTP_GetLastResponseInfo($iError, $sMessage)
                        $iLasterror = $iError
                EndIf
                Return SetError(1, $iLasterror, $asFileArray)
        EndIf

        Local $iDirectoryIndex = 0, $sFileIndex = 0
        Local $tFileTime, $bIsDir, $aCallFindNext
        Do
                $bIsDir = BitAND(DllStructGetData($tWIN32_FIND_DATA, "dwFileAttributes"), $FILE_ATTRIBUTE_DIRECTORY) = $FILE_ATTRIBUTE_DIRECTORY
                If $bIsDir And ($iReturn_Type <> 2) Then
                        $iDirectoryIndex += 1
                        If $iArrayCount = 1 Then
                                If UBound($aDirectoryArray) < $iDirectoryIndex + 1 Then ReDim $aDirectoryArray[$iDirectoryIndex * 2]
                                $aDirectoryArray[$iDirectoryIndex] = DllStructGetData($tWIN32_FIND_DATA, "cFileName")
                        Else
                                If UBound($aDirectoryArray) < $iDirectoryIndex + 1 Then ReDim $aDirectoryArray[$iDirectoryIndex * 2][$iArrayCount]
                                $aDirectoryArray[$iDirectoryIndex] = DllStructGetData($tWIN32_FIND_DATA, "cFileName")

                                $aDirectoryArray[$iDirectoryIndex] = _WinAPI_MakeQWord(DllStructGetData($tWIN32_FIND_DATA, "nFileSizeLow"), DllStructGetData($tWIN32_FIND_DATA, "nFileSizeHigh"))
                                If $iArrayCount = 6 Then
                                        $aDirectoryArray[$iDirectoryIndex] = DllStructGetData($tWIN32_FIND_DATA, "dwFileAttributes")

                                        $tFileTime = DllStructCreate($tagFILETIME, DllStructGetPtr($tWIN32_FIND_DATA, "ftLastWriteTime"))
                                        $aDirectoryArray[$iDirectoryIndex] = _Date_Time_FileTimeToStr($tFileTime, $bFmt)
                                        $tFileTime = DllStructCreate($tagFILETIME, DllStructGetPtr($tWIN32_FIND_DATA, "ftCreationTime"))
                                        $aDirectoryArray[$iDirectoryIndex] = _Date_Time_FileTimeToStr($tFileTime, $bFmt)
                                        $tFileTime = DllStructCreate($tagFILETIME, DllStructGetPtr($tWIN32_FIND_DATA, "ftLastAccessTime"))
                                        $aDirectoryArray[$iDirectoryIndex] = _Date_Time_FileTimeToStr($tFileTime, $bFmt)
                                EndIf
                        EndIf
                ElseIf Not $bIsDir And $iReturn_Type <> 1 Then
                        $sFileIndex += 1
                        If $iArrayCount = 1 Then
                                If UBound($asFileArray) < $sFileIndex + 1 Then ReDim $asFileArray[$sFileIndex * 2]
                                $asFileArray[$sFileIndex] = DllStructGetData($tWIN32_FIND_DATA, "cFileName")
                        Else
                                If UBound($asFileArray) < $sFileIndex + 1 Then ReDim $asFileArray[$sFileIndex * 2][$iArrayCount]
                                $asFileArray[$sFileIndex] = DllStructGetData($tWIN32_FIND_DATA, "cFileName")

                                $asFileArray[$sFileIndex] = _WinAPI_MakeQWord(DllStructGetData($tWIN32_FIND_DATA, "nFileSizeLow"), DllStructGetData($tWIN32_FIND_DATA, "nFileSizeHigh"))
                                If $iArrayCount = 6 Then
                                        $asFileArray[$sFileIndex] = DllStructGetData($tWIN32_FIND_DATA, "dwFileAttributes")

                                        $tFileTime = DllStructCreate($tagFILETIME, DllStructGetPtr($tWIN32_FIND_DATA, "ftLastWriteTime"))
                                        $asFileArray[$sFileIndex] = _Date_Time_FileTimeToStr($tFileTime, $bFmt)
                                        $tFileTime = DllStructCreate($tagFILETIME, DllStructGetPtr($tWIN32_FIND_DATA, "ftCreationTime"))
                                        $asFileArray[$sFileIndex] = _Date_Time_FileTimeToStr($tFileTime, $bFmt)
                                        $tFileTime = DllStructCreate($tagFILETIME, DllStructGetPtr($tWIN32_FIND_DATA, "ftLastAccessTime"))
                                        $asFileArray[$sFileIndex] = _Date_Time_FileTimeToStr($tFileTime, $bFmt)
                                EndIf
                        EndIf
                EndIf

                $aCallFindNext = DllCall($__g_hWinInet_FTP, 'bool', 'InternetFindNextFileW', 'handle', $aCallFindFirst, 'struct*', $tWIN32_FIND_DATA)
                If @error Then
                        $iLasterror = _WinAPI_GetLastError()
                        DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $aCallFindFirst)
                        Return SetError(2, $iLasterror, $asFileArray)
                EndIf
        Until Not $aCallFindNext

        DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $aCallFindFirst)
        ; No need to test @error.

        If $iArrayCount = 1 Then
                $aDirectoryArray = $iDirectoryIndex
                $asFileArray = $sFileIndex
        Else
                $aDirectoryArray = $iDirectoryIndex
                $asFileArray = $sFileIndex
        EndIf

        Switch $iReturn_Type
                Case 0
                        If $iArrayCount = 1 Then
                                ReDim $aDirectoryArray[$aDirectoryArray + $asFileArray + 1]
                                For $i = 1 To $sFileIndex
                                        $aDirectoryArray[$aDirectoryArray + $i] = $asFileArray[$i]
                                Next
                                $aDirectoryArray += $asFileArray
                        Else
                                ReDim $aDirectoryArray[$aDirectoryArray + $asFileArray + 1][$iArrayCount]
                                For $i = 1 To $sFileIndex
                                        For $j = 0 To $iArrayCount - 1
                                                $aDirectoryArray[$aDirectoryArray + $i][$j] = $asFileArray[$i][$j]
                                        Next
                                Next
                                $aDirectoryArray += $asFileArray
                        EndIf
                        Return $aDirectoryArray
                Case 1
                        If $iArrayCount = 1 Then
                                ReDim $aDirectoryArray[$iDirectoryIndex + 1]
                        Else
                                ReDim $aDirectoryArray[$iDirectoryIndex + 1][$iArrayCount]
                        EndIf
                        Return $aDirectoryArray
                Case 2
                        If $iArrayCount = 1 Then
                                ReDim $asFileArray[$sFileIndex + 1]
                        Else
                                ReDim $asFileArray[$sFileIndex + 1][$iArrayCount]
                        EndIf
                        Return $asFileArray
        EndSwitch
EndFunc   ;==>__FTP_ListToArray

; #INTERNAL_USE_ONLY# ===========================================================================================================
; Name...........: __FTP_Init
; Description ...: DllOpen wininet.dll
; Syntax.........: __FTP_Init ( )
; Parameters ....:
; Return values .:
; Author ........:
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......:
; ===============================================================================================================================
Func __FTP_Init()
        $__g_hWinInet_FTP = DllOpen('wininet.dll')
EndFunc   ;==>__FTP_Init


Func _FTPGetFile($l_FTPSession, $s_RemoteFile, $s_LocalFile,$s_failifexist=0, $l_fflags=0, $l_Flags = 2, $l_Context = 0)

   Local $ai_FTPGetFile = DllCall('wininet.dll', 'int', 'FtpGetFile', 'long', $l_FTPSession, 'str', $s_LocalFile, 'str', $s_RemoteFile,'long',$s_failifexist,'long',$l_fflags, 'long', $l_Flags, 'long', $l_Context)
   If @error OR $ai_FTPGetFile = 0 Then
         SetError(-1)
      Return 0
   EndIf
   
    Return $ai_FTPGetFile
   
EndFunc;==> _FTPGetFile()

nmgwddj 发表于 2016-10-19 22:02:56


Func __FTP_Init()
      $__g_hWinInet_FTP = DllOpen('wininet.dll')
EndFunc   ;==>__FTP_Init


这个就是初始化的代码,在使用 FTP 函数之前,要调用 FTP_Init() 来初始化。
如果你没有初始化直接调用了 FTP_Open ,那么这个函数内部也会帮你再调用一次FTP_Init()。

仔细一点。

nmgwddj 发表于 2016-10-19 22:05:07

文件开头给 $__g_hWinInet_FTP 赋值是为了初始化一个用于判断的值, $__g_hWinInet_FTP,而真正在使用的时候会调用 FTP_Init() 来初始化的。注意加红的逻辑判断。

Func _FTP_Open($s_Agent, $l_AccessType = $INTERNET_OPEN_TYPE_DIRECT, $s_ProxyName = '', $s_ProxyBypass = '', $l_Flags = 0)
      If $__g_hWinInet_FTP = -1 Then __FTP_Init()
      Local $ai_InternetOpen = DllCall($__g_hWinInet_FTP, 'handle', 'InternetOpenW', 'wstr', $s_Agent, 'dword', $l_AccessType, _
                        'wstr', $s_ProxyName, 'wstr', $s_ProxyBypass, 'dword', $l_Flags)
      If @error Or $ai_InternetOpen = 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0)
      Return $ai_InternetOpen
EndFunc   ;==>_FTP_Open

zghwelcome 发表于 2016-10-20 16:57:32

回复 5# nmgwddj


    学习了。分解的很好,很容易理解

wydssx 发表于 2016-10-21 15:45:22

谢谢,分析的很透彻。
页: [1]
查看完整版本: 关于用户提供的ftp头文件中,有一个疑惑请高手解疑