• 歡迎訪問奇跡の海網站,本站不上傳任何資源,所有資源均來自于網絡,歡迎加入奇跡の海~!奇跡の海-WordPress QQ群
  • 本站下載資源為網絡上收集整理而來,并且以計算機技術研究交流為目的,版權歸原作者所有,僅供大家參考,學習,不存在任何商業目的與商業用途.
  • 本站系統鏡像均來自于官方原版,ed2k可視為P2P下載鏈接。所有操作系統默認均為試用版,如有正版密鑰可以有效激活,本站不提供任何激活和相關服務。

AutoIt3(au3)源碼-帶進度條的軟件下載器

AutoIT3 奇跡の海 2年前 (2017-12-05) 1283次瀏覽 已收錄 0個評論 掃描二維碼

源碼簡介

AutoIt3(au3)源碼-帶進度條的軟件下載器
從指定URL下載文件并校驗hash值(MD5、SHA1),下載進度可使用進度條顯示

#NoTrayIcon
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include "lib.au3"

Opt("MustDeclareVars", 1) ;變量必須先定義,再使用

        Global $Download_Form1 = GUICreate("軟件下載器", 339, 144, -1, -1)
        Global $Download_Group1 = GUICtrlCreateGroup("", 16, 8, 305, 45)
        Global $Download_Label1 = GUICtrlCreateLabel("軟件名稱:", 32, 28, 55, 17)
        Global $Download_Combo1 = GUICtrlCreateCombo("", 96, 24, 209, 25)
        GUICtrlSetData($Download_Combo1, "請選擇要下載的軟件|QQ8.5電腦版|ADSafe5.0電腦版", "請選擇要下載的軟件")
        GUICtrlCreateGroup("", -99, -99, 1, 1)
        Global $Download_Group2 = GUICtrlCreateGroup(" 下載進度 ", 16, 64, 305, 41)
        Global $Download_Progress1 = GUICtrlCreateProgress(24, 80, 289, 17)
        GUICtrlCreateGroup("", -99, -99, 1, 1)
        Global $Download_Button1 = GUICtrlCreateButton("下  載", 128, 114, 65, 25)

_main()
Exit

Func _main()
        GUISetState(@SW_SHOW, $Download_Form1)
        Local $Download_Url
        Local $Download_Path
        Local $nMsg

        While 1
                $nMsg = GUIGetMsg()
                        Switch $nMsg

                                Case $Download_Combo1

                                        If GUICtrlRead($Download_Combo1) = "QQ8.5電腦版" Then
                                                $Download_Url = "https://proxy.now.qq.com/tx_tls_gate=dldir1.qq.com/qqfile/qq/QQ8.5/18600/QQ8.5.exe" ;這里填QQ下載地址
                                                $Download_Path = "QQ8.5.exe"
                                        ElseIf GUICtrlRead($Download_Combo1) = "ADSafe5.0電腦版" Then
                                                $Download_Url = "http://dl.ad-safe.com/adsafe_v4/download/adsafe.v5.0.729.1800.exe" ;這里填ADSafe下載地址
                                                $Download_Path = "adsafe.v5.0.729.1800.exe"
                                        EndIf

                                Case $Download_Button1

                                        DownLoadFile($Download_Url, $Download_Path, -1, -1, $Download_Progress1)

                                Case $GUI_EVENT_CLOSE
                                        Exit

                EndSwitch
        WEnd
EndFunc ;===>_main()

Lib.au3

下面是需要的了

    #include-once

    Global Const $CALG_MD5 = 0x8003
    Global Const $CALG_SHA1 = 0x8004

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: DownLoadFile
    ; Description ...: 從指定URL下載文件并校驗hash值(MD5、SHA1),下載進度可使用進度條顯示
    ; Syntax ........: DownLoadFile($sUrl, $sFilePath[, $sFileMD5 = -1[, $sFileSHA1 = -1[, $idProgress = -1]]])
    ; Parameters ....: $sUrl                - 文件下載的網址
    ;                  $sFilePath           - 保存到本地的路徑
    ;                  $sFileMD5            - 文件MD5值,若$sFileMD5 = -1(默認),則不校驗文件MD5值
    ;                  $sFileSHA1           - 文件SHA1值,若$sFileSHA1 = -1(默認),則不校驗文件SHA1值
    ;                  $idProgress          - 進度條控件ID,若$idProgress = -1(默認)則不使用進度條
    ; Return values .: 成功返回 保存到本地的文件路徑
    ;                                   失敗返回并設置@error的值:
    ;                                        1                                        - 下載文件發生錯誤,可能是下載地址無效
    ;                                        2                                        - 下載時發生錯誤,可能是網絡未連接
    ;                                        3                                        - 文件校驗不成功
    ; ===============================================================================================================================
    Func DownLoadFile($sUrl, $sFilePath, $sFileMD5 = -1, $sFileSHA1 = -1, $idProgress = -1)
            Local $hDownload = InetGet($sUrl, $sFilePath, 1, 1)
            If @error Then Return SetError(1, 1, 1)
            
            Local $sFileSize = InetGetSize($sUrl)
            Local $aDownData
            Do
                    $aDownData = InetGetInfo($hDownload)
                    If @error Then ExitLoop
                    If $aDownData[4] <> 0 Then Return SetError(2, 2, 2)
                   
                    If $idProgress <> -1 Then GUICtrlSetData($idProgress, $aDownData[0] / $sFileSize * 100)
            Until $aDownData[3] = "false"
            InetClose($hDownload)
            
            Sleep(500);實際測試發現進度條顯示比實際下載進度稍慢,所以延遲500ms以平衡時間
            
            ;校驗hash值(MD5、SHA1),若不一致則刪除下載的文件
            If $sFileMD5 = -1 And $sFileSHA1 <> -1 Then
                    Local $sFileHashSHA1 = FileHash($sFilePath, $CALG_SHA1)
                   
                    If $sFileHashSHA1 <> $sFileSHA1 Then
                            FileDelete($sFilePath)
                            Return SetError(3, 3, 3)
                    EndIf
            ElseIf $sFileMD5 <> -1 And $sFileSHA1 = -1 Then
                    Local $sFileHashMD5 = FileHash($sFilePath, $CALG_MD5)
                    If $sFileHashMD5 <> $sFileMD5 Then
                            FileDelete($sFilePath)
                            Return SetError(3, 3, 3)
                    EndIf
            ElseIf $sFileMD5 <> -1 And $sFileSHA1 <> -1 Then
                    Local $sFileHashMD5 = FileHash($sFilePath, $CALG_MD5)
                    Local $sFileHashSHA1 = FileHash($sFilePath, $CALG_SHA1)
                   
                    If $sFileHashMD5 <> $sFileMD5 Or $sFileHashSHA1 <> $sFileSHA1 Then
                            FileDelete($sFilePath)
                            Return SetError(3, 3, 3)
                    EndIf
            EndIf
            
            Return $sFilePath
    EndFunc   ;==>DownLoadFile


    ;$sFile 指定要驗證的文件
    ;$cAlgid 指定驗證方式
    Func FileHash($sFile, $cAlgid = 0x8003)
            ; Win32 API - CryptHashCertificate驗證文件MD5
            ; CryptHashCertificate,定義于Crypt32.dll中,函數原型如下:
            #cs
                    BOOL WINAPI CryptHashCertificate(
                    __in     HCRYPTPROV_LEGACY hCryptProv,
                    __in     ALG_ID Algid,
                    __in     DWORD dwFlags,
                    __in     const BYTE *pbEncoded,
                    __in     DWORD cbEncoded,
                    __out    BYTE *pbComputedHash,
                    __inout  DWORD *pcbComputedHash
                    );
            #ce
            ; 返回值為布爾型,對應au3中的int。
            ; hCryptProv - 沒有用處,留空。
            ; Algid - 指定驗證方式,可以是MD5或者是SHA1或其他驗證方式,如果是MD5,此處添$CALG_MD5 (0x8003)。
            ; dwFlags - 留空。
            ; *pbEncoded - 指針型,指向要驗證的數據。
            ; cbEncoded - 要驗證的數據的長度。
            ; *pbComputedHash - 指向一個緩存區,用于存放驗證結果。
            ; *pcbComputedHash - 輸入輸出型參數,作為輸入時,指定pbComputedHash結構的長度,作為輸出時,此值被設為所需要的緩存區域的長度。
            Local $hFile = FileOpen($sFile, 16)
            Local $bData = FileRead($hFile) ; 讀取文件中的數據。
            Local $iLength = BinaryLen($bData) ; 數據長度
            FileClose($hFile)
            ; NOTE: 此處必須先要用FileOpen以2進制模式打開文件,否則編譯后或者在SCITE中運行得到的結果將不正確。

            Local $tBuffer = DllStructCreate("byte[" & $iLength & "]")
            Local $pBuffer = DllStructGetPtr($tBuffer)
            DllStructSetData($tBuffer, 1, $bData)

            Local $iResult = DllCall("Crypt32.dll", "int", "CryptHashCertificate", _
                            "hWnd", 0, _        ; 留空。
                            "dword", $cAlgid, _        ; 驗證方式。
                            "dword", 0, _        ; 留空。
                            "ptr", $pBuffer, _                ; 要驗證的數據指針。
                            "dword", $iLength, _        ; 數據長度。
                            "ptr", 0, _                        ; 輸出結果,第一次調用傳遞空值,$iResult[7]被設為所需長度。
                            "dword*", 0) ; 此值被設為所需要的結構大小,因為也用作輸出,所以加*。

            Local $tResult = DllStructCreate("byte[" & $iResult[7] & "]") ; 定義一個如此長度的緩沖區,用于存放驗證結果。
            Local $pResult = DllStructGetPtr($tResult)

            $iResult = DllCall("Crypt32.dll", "int", "CryptHashCertificate", _; 第二次調用,函數將結果填充到$tResult中。
                            "hWnd", 0, _
                            "dword", $cAlgid, _
                            "dword", 0, _
                            "ptr", $pBuffer, _
                            "dword", $iLength, _
                            "ptr", $pResult, _
                            "dword*", $iResult[7])
            If $iResult[0] <> 0 Then
                    Local $rResult = StringTrimLeft(DllStructGetData($tResult, 1), 2)
            EndIf
            $tBuffer = 0
            $tResult = 0
            Return $rResult
    EndFunc   ;==>FileHash

版權聲明:本站所有文章和資源使用CC BY-NC-SA 4.0協議授權發布 , 轉載應當以相同方式注明文章來自“SeaOMC.COM->AutoIt3(au3)源碼-帶進度條的軟件下載器!在下邊可以分享本文哦!
喜歡 (0)
[]
分享 (0)
奇跡の海
關于作者:
一個WordPress菜鳥!
發表我的評論
取消評論

表情 貼圖 加粗 刪除線 居中 斜體 簽到

Hi,您需要填寫昵稱和郵箱!

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址
中国福利彩票36选7开奖结果