找回密码
 加入
搜索
查看: 4818|回复: 8

[网络通信] FTP下载碰到的一个怪问题 [已解决]

  [复制链接]
发表于 2011-11-23 17:36:06 | 显示全部楼层 |阅读模式
本帖最后由 z761003 于 2011-11-25 16:37 编辑

下面是一段FTP下载的代码,至于FTP服务器地址及用户名密码我这里就省略掉了。现在问题出在这,第一次遍历下载很成功,它把所有文件都下载下来了,可当服务器新增一些文件时,后面增加的文件 这代码它就不下载了,(我是把这段代码放在一个按钮下面的,每一次点按钮,下载很正常,等服务器上加了文件后,我第二次点下载,新增的下载不了)只有把程序关了重新打开,它开始正常下载了。很晕,不知道少了什么代码
$Open = _FTP_Open('MyFTP')
$Conn = _FTP_Connect($Open,$server,$username,$pass,1,$FTPport) 
_FTP_DirSetCurrent($Conn, $ftppath)
$aFile= _FTP_ListToArrayEx($Conn,0,0,1) 
If IsArray($aFile) Then
for $i = 1 to $aFile[0][0]
If $aFile[$i][0]<>"." And $aFile[$i][0]<>".." Then        
If StringRight($aFile[$i][0],4)=".bmp" Then 
$downinierr=_FTP_FileGet($Conn, "/wwwroot/dgyk/"&$ipadd&"/"&$aFile[$i][0], @ScriptDir&"\bmp"&$aFile[$i][0])
If $downinierr=1 Then $bmpfilenum=$bmpfilenum+1
_FTP_FileDelete($Conn, "/wwwroot/dgyk/"&$ipadd&"/"&$aFile[$i][0])
next
EndIf
$Ftpc = _FTP_Close($Open)
If $bmpfilenum<>0 Then
MsgBox(64,"提示","完成,共接收图片"&$bmpfilenum&"张")
Else
MsgBox(64,'提示','暂时没有接收到图片! ^_^')
EndIf
$aFile=""
发表于 2011-11-23 20:18:51 | 显示全部楼层
见:http://www.autoitx.com/thread-28824-1-2.html
你们遇到了同样的问题啊。
发表于 2011-11-23 20:26:00 | 显示全部楼层
我采取的方法是,coproc(),模拟重新打开程序。。这样就可以了,
但是根本原因我也没有找到
 楼主| 发表于 2011-11-23 20:49:09 | 显示全部楼层
是啊,我也发现那个贴子了,竟然是一样的问题,它的解决方法是把FTP这段代码新编译成一个程序,再在主程序里调用它,问题是得到解决,可是总觉得这样不太,,,总之不爽,哈。。


3楼说的coproc() 方法是什么方法呀??能否细说下
发表于 2011-11-23 21:26:04 | 显示全部楼层
好像FTP服务器没有刷新文件列表
发表于 2011-11-23 21:43:00 | 显示全部楼层
回复 4# z761003
这就是coproc 多进程函数
#cs
        User Calltips:
        _CoProc([$sFunction],[$vParameter]) Starts another Process and Calls $sFunc, Returns PID
        _SuperGlobalSet($sName,[$vValue],[$sRegistryBase]) Sets or Deletes a Superglobal Variable
        _SuperGlobalGet($sName,[$fOption],[$sRegistryBase]) Returns the Value of a Superglobal Variable
        _ProcSuspend($vProcess) Suspends all Threads in $vProcess (PID or Name)
        _ProcResume($vProcess) Resumes all Threads in $vProcess (PID or Name)
        _ProcessGetWinList($vProcess, $sTitle = Default, $iOption = 0) Enumerates Windows of a Process
        _CoProcReciver([$sFunction = ""]) Register/Unregister Reciver Function
        _CoProcSend($vProcess, $vParameter,[$iTimeout = 500],[$fAbortIfHung = True]) Send Message to Process
        _ConsoleForward($iPid1, [$iPid2], [$iPid3], [$iPidn])
        _ProcessEmptyWorkingSet($vPid = @AutoItPID,[$hDll_psapi],[$hDll_kernel32]) Removes as many pages as possible from the working set of the specified process.
        _DuplicateHandle($dwSourcePid, $hSourceHandle, $dwTargetPid = @AutoItPID, $fCloseSource = False) Returns a Duplicate handle
        _CloseHandle($hAny) Close a Handle
        $gs_SuperGlobalRegistryBase
        $gi_CoProcParent
#ce

Global $gs_SuperGlobalRegistryBase = "HKEY_CURRENT_USER\Software\AutoIt v3\CoProc"
Global $gi_CoProcParent = 0
Global $gs_CoProcReciverFunction = ""
Global $gv_CoProcReviverParameter = 0

;===============================================================================
;
; Description:      Starts another Process
; Parameter(s):     $sFunction - Optional, Name of Function to start in the new Process
;                                        $vParameter - Optional, Parameter to pass
; Requirement(s):   3.2.4.9
; Return Value(s):  On Success - Pid of the new Process
;                   On Failure - Set @error to 1
; Author(s):        Florian 'Piccaso' Fida
; Note(s):                        Inside the new Process $gi_CoProcParent holds the PID of the Parent Process.
;                                        $vParameter must not be Binary, an Array or DllStruct.
;                                        If $sFunction is a just a function name Like _CoProc("MyFunc","MyParameter") Then
;                                        Call() will be used to Call the function and optional pass the Parameter (only one).
;                                        If $sFunction is a expression like _CoProc("MyFunc('MyParameter')") Then
;                                        Execute() will be used to evaluate this expression makeing more than one Parameter Possible.
;                                        In the 'Execute()' Case the $vParameter Parameter will be ignored.
;                                        In both cases there are Limitations, Read doc's (for Execute() and Call()) for more detail.
;
;                                        If $sFunction is Empty ("" or Default) $vParameter can be the name of a Reciver function.
;
;
;===============================================================================
Func _CoProc($sFunction = Default, $vParameter = Default)
        Local $iPid
        If IsKeyword($sFunction) Or $sFunction = "" Then $sFunction = "__CoProcDummy"
        EnvSet("CoProc", "0x" & Hex(StringToBinary ($sFunction)))
        EnvSet("CoProcParent", @AutoItPID)
        If Not IsKeyword($vParameter) Then
                EnvSet("CoProcParameterPresent", "True")
                EnvSet("CoProcParameter", StringToBinary ($vParameter))
        Else
                EnvSet("CoProcParameterPresent", "False")
        EndIf
        If @Compiled Then
                $iPid = Run(FileGetShortName(@AutoItExe), @WorkingDir, @SW_HIDE, 1 + 2 + 4)
        Else
                $iPid = Run(FileGetShortName(@AutoItExe) & ' "' & @ScriptFullPath & '"', @WorkingDir, @SW_HIDE, 1 + 2 + 4)
        EndIf
        If @error Then SetError(1)
        Return $iPid
EndFunc   ;==>_CoProc


;===============================================================================
;
; Description:      Set a Superglobal Variable
; Parameter(s):     $sName - Identifyer for the Superglobal Variable
;                                        $vValue - Value to be Stored (optional)
;                                        $sRegistryBase - Registry Base Key (optional)
; Requirement(s):   3.2.4.9
; Return Value(s):  On Success - Returns True
;                   On Failure - Returns False and Set
;                                                                                                @error to:        1 - Wrong Value Type
;                                                                                                                        2 - Registry Problem
; Author(s):        Florian 'Piccaso' Fida
; Note(s):                        $vValue must not be an Array or Struct.
;                                        if $vValue is Omitted the Superglobal Variable will be deleted.
;
;                                        Superglobal Variables are Stored in the Registry.
;                                        $gs_SuperGlobalRegistryBase is holding the Default Base Key
;
;===============================================================================
Func _SuperGlobalSet($sName, $vValue = Default, $sRegistryBase = Default)
        Local $vTmp
        If $sRegistryBase = Default Then $sRegistryBase = $gs_SuperGlobalRegistryBase
        If $vValue = "" Or $vValue = Default Then
                RegDelete($sRegistryBase, $sName)
                If @error Then Return SetError(2, 0, False) ; Registry Problem
        Else
                RegWrite($sRegistryBase, $sName, "REG_BINARY", StringToBinary ($vValue))
                If @error Then Return SetError(2, 0, False) ; Registry Problem
        EndIf
        Return True
EndFunc   ;==>_SuperGlobalSet

;===============================================================================
;
; Description:      Get a Superglobal Variable
; Parameter(s):     $sName - Identifyer for the Superglobal Variable
;                                        $fOption - Optional, if True The Superglobal Variable will be deleted after sucessfully Reading it out
;                                        $sRegistryBase - Registry Base Key (optional)
; Requirement(s):   3.2.4.9
; Return Value(s):  On Success - Returns the Value of the Superglobal Variable
;                   On Failure - Set
;                                                                @error to:        1 - Not Found / Registry Problem
;                                                                                        2 - Error Deleting
; Author(s):        Florian 'Piccaso' Fida
; Note(s):                        $vValue must not be an Array or Struct.
;                                        Superglobal Variables are Stored in the Registry.
;                                        $gs_SuperGlobalRegistryBase is holding the Default Base Key
;
;===============================================================================
Func _SuperGlobalGet($sName, $fOption = Default, $sRegistryBase = Default)
        Local $vTmp
        If $fOption = "" Or $fOption = Default Then $fOption = False
        If $sRegistryBase = Default Then $sRegistryBase = $gs_SuperGlobalRegistryBase
        $vTmp = RegRead($sRegistryBase, $sName)
        If @error Then Return SetError(1, 0, "") ; Registry Problem
        If $fOption Then
                _SuperGlobalSet($sName)
                If @error Then SetError(2)
        EndIf
        Return BinaryToString ("0x" & $vTmp)
EndFunc   ;==>_SuperGlobalGet

;===============================================================================
;
; Description:      Suspend all Threads in a Process
; Parameter(s):     $vProcess - Name or PID of Process
; Requirement(s):   3.1.1.130, Win ME/2k/XP
; Return Value(s):  On Success - Returns Nr. of Threads Suspended and Set @extended to Nr. of Threads Processed
;                   On Failure - Returns False and Set
;                                                                                                @error to:        1 - Process not Found
;                                                                                                                        2 - Error Calling 'CreateToolhelp32Snapshot'
;                                                                                                                        3 - Error Calling 'Thread32First'
;                                                                                                                        4 - Error Calling 'Thread32Next'
;                                                                                                                        5 - Not all Threads Processed
; Author(s):        Florian 'Piccaso' Fida
; Note(s):                        Ported from: http://www.codeproject.com/threads/pausep.asp
;                                        Better read the article (and the warnings!) if you want to use it :)
;
;===============================================================================
Func _ProcSuspend($vProcess, $iReserved = 0)
        Local $iPid, $vTmp, $hThreadSnap, $ThreadEntry32, $iThreadID, $hThread, $iThreadCnt, $iThreadCntSuccess, $sFunction
        Local $TH32CS_SNAPTHREAD = 0x00000004
        Local $INVALID_HANDLE_VALUE = 0xFFFFFFFF
        Local $THREAD_SUSPEND_RESUME = 0x0002
        Local $THREADENTRY32_StructDef = "int;" _; 1 -> dwSize
                         & "int;" _; 2 -> cntUsage
                         & "int;" _; 3 -> th32ThreadID
                         & "int;" _; 4 -> th32OwnerProcessID
                         & "int;" _; 5 -> tpBasePri
                         & "int;" _; 6 -> tpDeltaPri
                         & "int" ; 7 -> dwFlags
        $iPid = ProcessExists($vProcess)
        If Not $iPid Then Return SetError(1, 0, False) ; Process not found.
        $vTmp = DllCall("kernel32.dll", "ptr", "CreateToolhelp32Snapshot", "int", $TH32CS_SNAPTHREAD, "int", 0)
        If @error Then Return SetError(2, 0, False) ; CreateToolhelp32Snapshot Failed
        If $vTmp[0] = $INVALID_HANDLE_VALUE Then Return SetError(2, 0, False) ; CreateToolhelp32Snapshot Failed
        $hThreadSnap = $vTmp[0]
        $ThreadEntry32 = DllStructCreate($THREADENTRY32_StructDef)
        DllStructSetData($ThreadEntry32, 1, DllStructGetSize($ThreadEntry32))
        $vTmp = DllCall("kernel32.dll", "int", "Thread32First", "ptr", $hThreadSnap, "long", DllStructGetPtr($ThreadEntry32))
        If @error Then Return SetError(3, 0, False) ; Thread32First Failed
        If Not $vTmp[0] Then
                DllCall("kernel32.dll", "int", "CloseHandle", "ptr", $hThreadSnap)
                Return SetError(3, 0, False) ; Thread32First Failed
        EndIf
        While 1
                If DllStructGetData($ThreadEntry32, 4) = $iPid Then
                        $iThreadID = DllStructGetData($ThreadEntry32, 3)
                        $vTmp = DllCall("kernel32.dll", "ptr", "OpenThread", "int", $THREAD_SUSPEND_RESUME, "int", False, "int", $iThreadID)
                        If Not @error Then
                                $hThread = $vTmp[0]
                                If $hThread Then
                                        If $iReserved Then
                                                $sFunction = "ResumeThread"
                                        Else
                                                $sFunction = "SuspendThread"
                                        EndIf
                                        $vTmp = DllCall("kernel32.dll", "int", $sFunction, "ptr", $hThread)
                                        If $vTmp[0] <> -1 Then $iThreadCntSuccess += 1
                                        DllCall("kernel32.dll", "int", "CloseHandle", "ptr", $hThread)
                                EndIf
                        EndIf
                        $iThreadCnt += 1
                EndIf
                $vTmp = DllCall("kernel32", "int", "Thread32Next", "ptr", $hThreadSnap, "long", DllStructGetPtr($ThreadEntry32))
                If @error Then Return SetError(4, 0, False) ; Thread32Next Failed
                If Not $vTmp[0] Then ExitLoop
        WEnd
        DllCall("kernel32.dll", "int", "CloseToolhelp32Snapshot", "ptr", $hThreadSnap) ; CloseHandle
        If Not $iThreadCntSuccess Or $iThreadCnt > $iThreadCntSuccess Then Return SetError(5, $iThreadCnt, $iThreadCntSuccess)
        Return SetError(0, $iThreadCnt, $iThreadCntSuccess)
EndFunc   ;==>_ProcSuspend

;===============================================================================
;
; Description:      Resume all Threads in a Process
; Parameter(s):     $vProcess - Name or PID of Process
; Requirement(s):   3.1.1.130, Win ME/2k/XP
; Return Value(s):  On Success - Returns Nr. of Threads Resumed and Set @extended to Nr. of Threads Processed
;                   On Failure - Returns False and Set
;                                                                                                @error to:        1 - Process not Found
;                                                                                                                        2 - Error Calling 'CreateToolhelp32Snapshot'
;                                                                                                                        3 - Error Calling 'Thread32First'
;                                                                                                                        4 - Error Calling 'Thread32Next'
;                                                                                                                        5 - Not all Threads Processed
; Author(s):        Florian 'Piccaso' Fida
; Note(s):                        Ported from: http://www.codeproject.com/threads/pausep.asp
;                                        Better read the article (and the warnings!) if you want to use it :)
;
;===============================================================================
Func _ProcResume($vProcess)
        Local $fRval = _ProcSuspend($vProcess, True)
        Return SetError(@error, @extended, $fRval)
EndFunc   ;==>_ProcResume

;===============================================================================
;
; Description:      Enumerates Windows of a Process
; Parameter(s):     $vProcess - Name or PID of Process
;                                        $sTitle - Optional Title of window to Find
;                                        $iOption - Optional, Can be added together
;                                                                0 - Matches any Window (Default)
;                                                                2 - Matches any Window Created by GuiCreate() (ClassName: AutoIt v3 GUI)
;                                                                4 - Matches AutoIt Main Window (ClassName: AutoIt v3)
;                                                                6 - Matches Any AutoIt Window
;                                                                16 - Return the first Window Handle found (No Array)
; Requirement(s):   3.1.1.130
; Return Value(s):  On Success - Retuns an Array/Handle of Windows found
;                   On Failure - Set @ERROR to:        1 - Process not Found
;                                                                                                2 - Window(s) not Found
;                                                                                                3 - GetClassName Failed
; Author(s):        Florian 'Piccaso' Fida
; Note(s):
;
;===============================================================================
Func _ProcessGetWinList($vProcess, $sTitle = Default, $iOption = 0)
        Local $aWinList, $iCnt, $aTmp, $aResult[1], $iPid, $fMatch, $sClassname
        $iPid = ProcessExists($vProcess)
        If Not $iPid Then Return SetError(1) ; Process not Found
        If $sTitle = "" Or IsKeyword($sTitle) Then
                $aWinList = WinList()
        Else
                $aWinList = WinList($sTitle)
        EndIf
        For $iCnt = 1 To $aWinList[0][0]
                $hWnd = $aWinList[$iCnt][1]
                $iProcessId = WinGetProcess($hWnd)
                If $iProcessId = $iPid Then
                        If $iOption = 0 Or IsKeyword($iOption) Or $iOption = 16 Then
                                $fMatch = True
                        Else
                                $fMatch = False
                                $sClassname = DllCall("user32.dll", "int", "GetClassName", "hwnd", $hWnd, "str", "", "int", 1024)
                                If @error Then Return SetError(3) ; GetClassName
                                If $sClassname[0] = 0 Then Return SetError(3) ; GetClassName
                                $sClassname = $sClassname[2]
                                If BitAND($iOption, 2) Then
                                        If $sClassname = "AutoIt v3 GUI" Then $fMatch = True
                                EndIf
                                If BitAND($iOption, 4) Then
                                        If $sClassname = "AutoIt v3" Then $fMatch = True
                                EndIf
                        EndIf
                        If $fMatch Then
                                If BitAND($iOption, 16) Then Return $hWnd
                                ReDim $aResult[UBound($aResult) + 1]
                                $aResult[UBound($aResult) - 1] = $hWnd
                        EndIf
                EndIf
        Next
        $aResult[0] = UBound($aResult) - 1
        If $aResult[0] < 1 Then Return SetError(2, 0, 0) ; No Window(s) Found
        Return $aResult
EndFunc   ;==>_ProcessGetWinList

;===============================================================================
;
; Description:      Register Reciver Function
; Parameter(s):     $sFunction - Optional, Function name to Register.
;                                                                Omit to Disable/Unregister
; Requirement(s):   3.2.4.9
; Return Value(s):  On Success - Returns True
;                   On Failure - Returns False and Set
;                                                                                                @error to:        1 - Unable to create Reciver Window
;                                                                                                                        2 - Unable to (Un)Register WM_COPYDATA or WM_USER+0x64
; Author(s):        Florian 'Piccaso' Fida
; Note(s):                        If the process doesent have a Window it will be created
;                                        The Reciver Function must accept 1 Parameter
;
;===============================================================================
Func _CoProcReciver($sFunction = Default)
        Local $sHandlerFuction = "__CoProcReciverHandler", $hWnd, $aTmp
        If IsKeyword($sFunction) Then $sFunction = ""
        $hWnd = _ProcessGetWinList(@AutoItPID, "", 16 + 2)
        If Not IsHWnd($hWnd) Then
                $hWnd = GUICreate("CoProcEventReciver")
                If @error Then Return SetError(1, 0, False)
        EndIf
        If $sFunction = "" Or IsKeyword($sFunction) Then $sHandlerFuction = ""
        If Not GUIRegisterMsg(0x4A, $sHandlerFuction) Then Return SetError(2, 0, False) ; WM_COPYDATA
        If Not GUIRegisterMsg(0x400 + 0x64, $sHandlerFuction) Then Return SetError(2, 0, False) ; WM_USER+0x64
        $gs_CoProcReciverFunction = $sFunction
        Return True
EndFunc   ;==>_CoProcReciver
Func __CoProcReciverHandler($hWnd, $iMsg, $WParam, $LParam)
        If $iMsg = 0x4A Then ; WM_COPYDATA
                Local $COPYDATA, $MyData
                $COPYDATA = DllStructCreate("ptr;dword;ptr", $LParam)
                $MyData = DllStructCreate("char[" & DllStructGetData($COPYDATA, 2) & "]", DllStructGetData($COPYDATA, 3))
                $gv_CoProcReviverParameter = DllStructGetData($MyData, 1)
                Return 256
        ElseIf $iMsg = 0x400 + 0x64 Then ; WM_USER+0x64
                If $gv_CoProcReviverParameter Then
                        Call($gs_CoProcReciverFunction, $gv_CoProcReviverParameter)
                        If @error And @Compiled = 0 Then MsgBox(16, "CoProc Error", "Unable to Call: " & $gs_CoProcReciverFunction)
                        $gv_CoProcReviverParameter = 0
                        Return 0
                EndIf
        EndIf
EndFunc   ;==>__CoProcReciverHandler

;===============================================================================
;
; Description:      Send a Message to a CoProcess
; Parameter(s):     $vProcess - Name or PID of Process
;                                        $vParameter - Parameter to pass
;                                        $iTimeout - Optional, Defaults to 500 (msec)
;                                        $fAbortIfHung - Optional, Default is True
; Requirement(s):   3.2.4.9
; Return Value(s):  On Success - Returns True
;                   On Failure - Returns False and Set
;                                                                                                @error to:        1 - Process not found
;                                                                                                                        2 - Window not found
;                                                                                                                        3 - Timeout/Busy/Hung
;                                                                                                                        4 - PostMessage Falied
; Author(s):        Florian 'Piccaso' Fida
; Note(s):
;
;==========================================================================
Func _CoProcSend($vProcess, $vParameter, $iTimeout = 500, $fAbortIfHung = True)
        Local $iPid, $hWndTarget, $MyData, $aTmp, $COPYDATA, $iFuFlags
        $iPid = ProcessExists($vProcess)
        If Not $iPid Then Return SetError(1, 0, False) ; Process not Found
        $hWndTarget = _ProcessGetWinList($vProcess, "", 16 + 2)
        If @error Or (Not $hWndTarget) Then Return SetError(2, 0, False) ; Window not found
        $MyData = DllStructCreate("char[" & StringLen($vParameter) + 1 & "]")
        $COPYDATA = DllStructCreate("ptr;dword;ptr")
        DllStructSetData($MyData, 1, $vParameter)
        DllStructSetData($COPYDATA, 1, 1)
        DllStructSetData($COPYDATA, 2, DllStructGetSize($MyData))
        DllStructSetData($COPYDATA, 3, DllStructGetPtr($MyData))
        If $fAbortIfHung Then
                $iFuFlags = 0x2 ; SMTO_ABORTIFHUNG
        Else
                $iFuFlags = 0x0 ; SMTO_NORMAL
        EndIf
        $aTmp = DllCall("user32.dll", "int", "SendMessageTimeout", "hwnd", $hWndTarget, "int", 0x4A _; WM_COPYDATA
                        , "int", 0, "ptr", DllStructGetPtr($COPYDATA), "int", $iFuFlags, "int", $iTimeout, "long_ptr", 0)
        If @error Then Return SetError(3, 0, False) ; SendMessageTimeout Failed
        If Not $aTmp[0] Then Return SetError(3, 0, False) ; SendMessageTimeout Failed
        $aTmp = DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWndTarget, "int", 0x400 + 0x64, "int", 0, "int", 0)
        If @error Then Return SetError(4, 0, False)
        If Not $aTmp[0] Then Return SetError(4, 0, False)
        Return True
EndFunc   ;==>_CoProcSend

;===============================================================================
;
; Description:      Forwards StdOut and StdErr from specified Processes to Calling process
; Parameter(s):     $iPid1 - Pid of Procces
;                                        $iPidn - Optional, Up to 16 Processes
; Requirement(s):   3.1.1.131
; Return Value(s):  None
; Author(s):        Florian 'Piccaso' Fida
; Note(s):                        Processes must provide StdErr and StdOut Streams (See Run())
;
;==========================================================================
Func _ConsoleForward($iPid1, $iPid2 = Default, $iPid3 = Default, $iPid4 = Default, $iPid5 = Default, $iPid6 = Default, $iPid7 = Default, $iPid8 = Default, $iPid9 = Default, $iPid10 = Default, $iPid11 = Default, $iPid12 = Default, $iPid13 = Default, $iPid14 = Default, $iPid15 = Default, $iPid16 = Default)
        Local $iPid, $i, $iPeek
        For $i = 1 To 16
                $iPid = Eval("iPid" & $i)
                If $iPid = Default Or Not $iPid Then ContinueLoop
                If ProcessExists($iPid) Then
                        $iPeek = StdoutRead($iPeek, 0, True)
                        If Not @error And $iPeek > 0 Then
                                ConsoleWrite(StdoutRead($iPid))
                        EndIf
                        $iPeek = StderrRead($iPeek, 0, True)
                        If Not @error And $iPeek > 0 Then
                                ConsoleWriteError(StderrRead($iPid))
                        EndIf
                EndIf
        Next
EndFunc   ;==>_ConsoleForward

;===============================================================================
;
; Description:      Removes as many pages as possible from the working set of the specified process.
; Parameter(s):     $vPid - Optional, Pid or Process Name
;                                        $hDll_psapi - Optional, Handle to psapi.dll
;                                        $hDll_kernel32 - Optional, Handle to kernel32.dll
; Requirement(s):   3.2.1.12
; Return Value(s):  On Success - nonzero
;                   On Failure - 0 and sets error to
;                                                                                                @error to:        1 - Process Doesent exist
;                                                                                                                        2 - OpenProcess Failed
;                                                                                                                        3 - EmptyWorkingSet Failed
; Author(s):        Florian 'Piccaso' Fida
; Note(s):                        $vPid can be the -1 Pseudo Handle
;
;===============================================================================
Func _ProcessEmptyWorkingSet($vPid = @AutoItPID, $hDll_psapi = "psapi.dll", $hDll_kernel32 = "kernel32.dll")
        Local $av_EWS, $av_OP, $iRval
        If $vPid = -1 Then ; Pseudo Handle
                $av_EWS = DllCall($hDll_psapi, "int", "EmptyWorkingSet", "ptr", -1)
        Else
                $vPid = ProcessExists($vPid)
                If Not $vPid Then Return SetError(1, 0, 0) ; Process Doesent exist
                $av_OP = DllCall($hDll_kernel32, "int", "OpenProcess", "dword", 0x1F0FFF, "int", 0, "dword", $vPid)
                If $av_OP[0] = 0 Then Return SetError(2, 0, 0) ; OpenProcess Failed
                $av_EWS = DllCall($hDll_psapi, "int", "EmptyWorkingSet", "ptr", $av_OP[0])
                DllCall($hDll_kernel32, "int", "CloseHandle", "int", $av_OP[0])
        EndIf
        If $av_EWS[0] Then
                Return $av_EWS[0]
        Else
                Return SetError(3, 0, 0) ; EmptyWorkingSet Failed
        EndIf
EndFunc   ;==>_ProcessEmptyWorkingSet


;===============================================================================
;
; Description:      Duplicates a Handle from or for another process
; Parameter(s):     $dwSourcePid - Pid from Source Process
;                                        $hSourceHandle - The Handle to duplicate
;                                        $dwTargetPid - Optional, Pid from Target Procces - Defaults to current process
;                                        $fCloseSource - Optional, Close the source handle - Defaults to False
; Requirement(s):   3.2.4.9
; Return Value(s):  On Success - Duplicated Handle
;                   On Failure - 0 and sets error to
;                                                                                                @error to:        1 - Api OpenProcess Failed
;                                                                                                                        2 - Api DuplicateHandle Falied
; Author(s):        Florian 'Piccaso' Fida
; Note(s):
;
;===============================================================================
Func _DuplicateHandle($dwSourcePid, $hSourceHandle, $dwTargetPid = @AutoItPID, $fCloseSource = False)
        Local $hTargetHandle, $hPrSource, $hPrTarget, $dwOptions
        $hPrSource = __dh_OpenProcess($dwSourcePid)
        $hPrTarget = __dh_OpenProcess($dwTargetPid)
        If $hPrSource = 0 Or $hPrTarget = 0 Then
                _CloseHandle($hPrSource)
                _CloseHandle($hPrTarget)
                Return SetError(1, 0, 0)
        EndIf
        ; DUPLICATE_CLOSE_SOURCE = 0x00000001
        ; DUPLICATE_SAME_ACCESS = 0x00000002
        If $fCloseSource <> False Then
                $dwOptions = 0x01 + 0x02
        Else
                $dwOptions = 0x02
        EndIf
        $hTargetHandle = DllCall("kernel32.dll", "int", "DuplicateHandle", "ptr", $hPrSource, "ptr", $hSourceHandle, "ptr", $hPrTarget, "long_ptr", 0, "dword", 0, "int", 1, "dword", $dwOptions)
        If @error Then Return SetError(2, 0, 0)
        If $hTargetHandle[0] = 0 Or $hTargetHandle[4] = 0 Then
                _CloseHandle($hPrSource)
                _CloseHandle($hPrTarget)
                Return SetError(2, 0, 0)
        EndIf
        Return $hTargetHandle[4]
EndFunc   ;==>_DuplicateHandle
Func __dh_OpenProcess($dwProcessId)
        ; PROCESS_DUP_HANDLE = 0x40
        Local $hPr = DllCall("kernel32.dll", "ptr", "OpenProcess", "dword", 0x40, "int", 0, "dword", $dwProcessId)
        If @error Then Return SetError(1, 0, 0)
        Return $hPr[0]
EndFunc   ;==>__dh_OpenProcess
Func _CloseHandle($hAny)
        If $hAny = 0 Then Return SetError(1, 0, 0)
        Local $fch = DllCall("kernel32.dll", "int", "CloseHandle", "ptr", $hAny)
        If @error Then Return SetError(1, 0, 0)
        Return $fch[0]
EndFunc   ;==>_CloseHandle



#region Internal Functions
Func __CoProcStartup()
        Local $sCmd = EnvGet("CoProc")
        If StringLeft($sCmd, 2) = "0x" Then
                $sCmd = BinaryToString ($sCmd)
                $gi_CoProcParent = Number(EnvGet("CoProcParent"))
                If StringInStr($sCmd, "(") And StringInStr($sCmd, ")") Then
                        Execute($sCmd)
                        If @error And Not @Compiled Then MsgBox(16, "CoProc Error", "Unable to Execute: " & $sCmd)
                        Exit
                EndIf
                If EnvGet("CoProcParameterPresent") = "True" Then
                        Call($sCmd, BinaryToString (EnvGet("CoProcParameter")))
                        If @error And Not @Compiled Then MsgBox(16, "CoProc Error", "Unable to Call: " & $sCmd & @LF & "Parameter: " & BinaryToString (EnvGet("CoProcParameter")))
                Else
                        Call($sCmd)
                        If @error And Not @Compiled Then MsgBox(16, "CoProc Error", "Unable to Call: " & $sCmd)
                EndIf
                Exit
        EndIf
EndFunc   ;==>__CoProcStartup
Func __CoProcDummy($vPar = Default)
        If Not IsKeyword($vPar) Then _CoProcReciver($vPar)
        While ProcessExists($gi_CoProcParent)
                Sleep(500)
        WEnd
EndFunc   ;==>__CoProcDummy
__CoProcStartup()
#endregion
发表于 2011-11-24 10:14:02 | 显示全部楼层
回复 1# z761003


    反复阅读帮助后,终于找到解决方法了。
   我在 http://www.autoitx.com/thread-28824-1-2.html 这个帖子里回复了,供参考。
 楼主| 发表于 2011-11-25 16:38:15 | 显示全部楼层
这人多怎么力量就这么大尼
发表于 2012-1-1 11:13:12 | 显示全部楼层
不用这么麻烦,
for
下载前再用_FTP_FindFileFirst,_FTP_FindFileNext取文件名,下载后用关_FTP_FindFileClose
next

就是下载,上传之类的会假死不好处理啊!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-1 08:10 , Processed in 0.074294 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表