微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AutoHotKey - libcurl 突然出现致命错误

如何解决AutoHotKey - libcurl 突然出现致命错误

我一直在使用 curl 从我的网站下载脚本。这已经运行了 5 年以上,没有任何问题。

现在我开始出现错误。查看它,我在 libcurl.ahk 的第 133 行收到“The DllCall requires a prior VarSetCapacity错误

错误的行是这里的 return 行:

CurlEasyPerform( EasyHandle )
{
    global CurlDllName
    return DllCall( CurlDllName "\curl_easy_perform","UInt",EasyHandle,"Cdecl" )
}

有没有人见过这个错误或知道解决它的方法? 我不确定如何使用 VarSetCapacity。

谢谢

这是完整的 libcurl.ahk

CurlGlobalInit( Location = "",flags = 3 )
{
    global hCurlModule := DllCall( "LoadLibrary","str",Location = "" ? "libcurl.dll" : (Location . ".dll") )
    if ( !hCurlModule || ErrorLevel )
        return -1

    global CurlDllName
    if ( Location = "" )
        CurlDllName = libcurl
    else
    {
        StringGetPos,Pos,Location,\,R ; Find the last slash.
        if ( ErrorLevel )
            CurlDllName := Location ; No path specified.
        else
            CurlDllName := SubStr( Location,Pos + 2 )
    }

    ; #define CURL_GLOBAL_SSL (1<<0)
    ; #define CURL_GLOBAL_WIN32 (1<<1)
    ; #define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32)
    ; #define CURL_GLOBAL_nothing 0
    ; #define CURL_GLOBAL_DEFAULT CURL_GLOBAL_ALL
    global CurlShowErrors
    code := DllCall( "libcurl\curl_global_init",flags )
    if ( code != 0 && CurlShowErrors )
        MsgBox,16,Error,% "curl_global_init: " CurlEasyStrError( code ) ;%
    return code
}


CurlFreeLibrary()
{
    global hCurlModule
    return DllCall( "FreeLibrary",hCurlModule )
}


CurlEasyInit()
{
    global CurlDllName
    return DllCall( CurlDllName "\curl_easy_init" )
}


CurlEasyReset( EasyHandle )
{
    global CurlDllName
    DllCall( CurlDllName "\curl_easy_reset",EasyHandle )
}


CurlEasyCleanup( EasyHandle )
{
    global CurlDllName
    DllCall( CurlDllName "\curl_easy_cleanup",EasyHandle )
}


CurlShowErrors( Yes = true )
{
    global CurlShowErrors := Yes
}


CurlEasySetoption( EasyHandle,Option,Parameter )
{
    global CurlDllName
    ; For a list of options,go to http://curl.haxx.se/libcurl/c/curl_easy_setopt.html
    If Parameter is integer
        return DllCall( CurlDllName "\curl_easy_setopt",Parameter,"Cdecl" )
    else
        return DllCall( CurlDllName "\curl_easy_setopt",&Parameter,"Cdecl" )
}


CurlSlistAppend( ByRef pSlist,String )
{
    if ( pSlist = "" )
        pSlist = 0

    global CurlDllName
    pSlist := DllCall( CurlDllName "\curl_slist_append",pSlist,&String,"Cdecl" )
    return pSlist
}


CurlSlistFreeAll( ByRef pSlist )
{
    global CurlDllName
    DllCall( CurlDllName "\curl_slist_free_all","Cdecl" )
    pSlist = 0
}


CurlFormAdd( ByRef pFirstItem,ByRef pLastItem,Option1,Value1,Option2,Value2 = 0,Option3 = 0,Value3 = 0,Option4 = 0,Value4 = 0,Option5 = 0,Value5 = 0,Option6 = 0,Value6 = 0,Option7 = 0,Value7 = 0,Option8 = 0,Value8 = 0 )
{
    if ( pFirstItem = 0 || pLastItem = 0 )
    {
        VarSetCapacity( pFirstItem,4,0 )
        VarSetCapacity( pLastItem,0 )
    }
    Loop,8
    {
        if Value%A_Index% is not integer
        {
            ; Convert strings to string pointers.
            Value%A_Index%string := Value%A_Index%
            Value%A_Index% := &Value%A_Index%string
        }
    }
    global CurlDllName
    ;global CurlShowErrors
    ; No need to omit empty variables here. It is unaware of all parameters after CURLFORM_END.
    RetVal := DllCall( CurlDllName "\curl_formadd",&pFirstItem,&pLastItem,Value2,Option3,Value3,Option4,Value4,Option5,Value5,Option6,Value6,Option7,Value7,Option8,Value8,"Cdecl" )
;   if ( ErrorLevel && CurlShowErrors )
;       MsgBox,%CurlDllName%\curl_formadd() Failed with error level %ErrorLevel%.
        
    return RetVal
}


CurlFormFree( pFirstItem )
{
    global CurlDllName
    DllCall( CurlDllName "\curl_formfree",pFirstItem,"Cdecl" )
}


CurlEasyPerform( EasyHandle )
{
    global CurlDllName
    return DllCall( CurlDllName "\curl_easy_perform","Cdecl" )
}


CurlEasyGetinfo( EasyHandle,information )
{
    global ; May be unneeded Now. I used to use the CURLINFO variables directly.
    local Type := CurlGetInfoType( information )
    
    local Value
    ; Everything but double is 4 bytes.
    VarSetCapacity( Value,Type = 0x300000 ? 8 : 4 ) ; CURLINFO_DOUBLE

    local Error := DllCall( CurlDllName "\curl_easy_getinfo",information,&Value,"Cdecl" )
    if ( ErrorLevel )
        return ""

    if ( Error != 0 )
    {
        if ( CurlShowErrors )
            MsgBox,% "curl_easy_getinfo: " CurlEasyStrError( Error ) ;%
        return ""
    }

    
    if ( information < 0x200000 ) ; CURLINFO_LONG
        return DllCall( "MulDiv","Int",NumGet( Value ),1,"Str" ) ; STRING
    else
    {
        if ( information < 0x300000 ) ; CURLINFO_DOUBLE
            return NumGet( Value ) ; LONG
        else
        {
            if ( information < 0x400000 ) ; CURLINFO_SLIST
                return NumGet( Value,"Double" ) ; DOUBLE
            else
                return NumGet( Value ) ; SLIST
        }
    }
}


CurlEasyStrError( ErrorCode )
{
    global CurlDllName
    return DllCall( CurlDllName "\curl_easy_strerror",ErrorCode,"Cdecl Str" )
}


CurlEasyEscape( EasyHandle,URL )
{
    global CurlDllName
    return CurlFreeGet( DllCall( CurlDllName "\curl_easy_escape","Str",URL,"Cdecl" ) )
    ; "If the length argument is set to 0 (zero),curl_easy_escape() uses strlen() on the input url to find out the size."
}


CurlEasyUnescape( EasyHandle,URL )
{
    global CurlDllName
    return CurlFreeGet( DllCall( CurlDllName "\curl_easy_unescape","Cdecl" ) )
}


CurlVersion()
{
    global CurlDllName
    ; lol?
;   Return DllCall( "MulDiv",DllCall( CurlDllName "\curl_version" ),"str" ) 
    Return DllCall( CurlDllName "\curl_version","Str" )
}


; If the manual says a function must "must curl_free() the returned string when you're done with it,"
; set the call to return as a pointer instead of a string,then wrap this function around it.
CurlFreeGet( pString )
{
    ; AHK needz a string dereferencing operator. Why do I have to trick it with a dllcall?
    Localcopy := DllCall( "MulDiv",pString,"Str" )
    global CurlDllName
    DllCall( CurlDllName "\curl_free",Cdecl )
    return Localcopy
}


MergeDouble( l,h )
{
    VarSetCapacity( Value,8,0 )
    Numput( l,Value,0 ),Numput( h,4 )
    return NumGet( Value,"Double" )
}


CurlGetInfoType( information )
{
    if ( information < 0x200000 ) ; CURLINFO_LONG
        return 0x100000 ; CURLINFO_STRING
    else
    {
        if ( information < 0x300000 ) ; CURLINFO_DOUBLE
            return 0x200000 ; CURLINFO_LONG
        else
        {
            if ( information < 0x400000 ) ; CURLINFO_SLIST
                return 0x300000 ; CURLINFO_DOUBLE
            else
                return 0x400000 ; CURLINFO_SLIST
        }
    }
}


CurlGetInfoDefine( All = true )
{
    global

    CURLINFO_STRING   := 0x100000
    CURLINFO_LONG     := 0x200000
    CURLINFO_DOUBLE   := 0x300000
    CURLINFO_SLIST    := 0x400000

    if ( !All )
        return

    CURLINFO_EFFECTIVE_URL           = 1048577 ; CURLINFO_STRING + 1
    CURLINFO_RESPONSE_CODE           = 2097154 ; CURLINFO_LONG   + 2
    CURLINFO_TOTAL_TIME              = 3145731 ; CURLINFO_DOUBLE + 3
    CURLINFO_NAMELOOKUP_TIME         = 3145732 ; CURLINFO_DOUBLE + 4
    CURLINFO_CONNECT_TIME            = 3145733 ; CURLINFO_DOUBLE + 5
    CURLINFO_PRETRANSFER_TIME        = 3145734 ; CURLINFO_DOUBLE + 6
    CURLINFO_SIZE_UPLOAD             = 3145735 ; CURLINFO_DOUBLE + 7
    CURLINFO_SIZE_DOWNLOAD           = 3145736 ; CURLINFO_DOUBLE + 8
    CURLINFO_SPEED_DOWNLOAD          = 3145737 ; CURLINFO_DOUBLE + 9
    CURLINFO_SPEED_UPLOAD            = 3145738 ; CURLINFO_DOUBLE + 10
    CURLINFO_HEADER_SIZE             = 2097163 ; CURLINFO_LONG  + 11
    CURLINFO_REQUEST_SIZE            = 2097164 ; CURLINFO_LONG  + 12
    CURLINFO_SSL_VERIFYRESULT        = 2097165 ; CURLINFO_LONG  + 13
    CURLINFO_FILETIME                = 2097166 ; CURLINFO_LONG  + 14
    CURLINFO_CONTENT_LENGTH_DOWNLOAD = 3145743 ; CURLINFO_DOUBLE + 15
    CURLINFO_CONTENT_LENGTH_UPLOAD   = 3145744 ; CURLINFO_DOUBLE + 16
    CURLINFO_STARTTRANSFER_TIME      = 3145745 ; CURLINFO_DOUBLE + 17
    CURLINFO_CONTENT_TYPE            = 1048594 ; CURLINFO_STRING + 18
    CURLINFO_REDIRECT_TIME           = 3145747 ; CURLINFO_DOUBLE + 19
    CURLINFO_REDIRECT_COUNT          = 2097172 ; CURLINFO_LONG   + 20
    CURLINFO_PRIVATE                 = 1048597 ; CURLINFO_STRING + 21
    CURLINFO_HTTP_CONNECTCODE        = 2097174 ; CURLINFO_LONG   + 22
    CURLINFO_HTTPAUTH_AVAIL          = 2097175 ; CURLINFO_LONG   + 23
    CURLINFO_PROXYAUTH_AVAIL         = 2097176 ; CURLINFO_LONG   + 24
    CURLINFO_OS_ERRNO                = 2097177 ; CURLINFO_LONG   + 25
    CURLINFO_NUM_CONNECTS            = 2097178 ; CURLINFO_LONG   + 26
    CURLINFO_SSL_ENGInes             = 4194331 ; CURLINFO_SLIST  + 27
    CURLINFO_COOKIELIST              = 4194332 ; CURLINFO_SLIST  + 28
    CURLINFO_LASTSOCKET              = 2097181 ; CURLINFO_LONG   + 29
    CURLINFO_FTP_ENTRY_PATH          = 1048606 ; CURLINFO_STRING + 30
}


CurlEasyGetoptionType( Option )
{
    global
    if ( Option < 10000 ) ; CURLOPTTYPE_OBJECTPOINT
        return 0 ; CURLOPTTYPE_LONG
    else
    {
        if ( Option < 20000 ) ; CURLOPTTYPE_FUNCTIONPOINT
            return 10000 ; CURLOPTTYPE_OBJECTPOINT
        else
        {
            if ( Option < 30000 ) ; CURLOPTTYPE_OFF_T
                return 20000 ; CURLOPTTYPE_FUNCTIONPOINT
            else
                return 30000 ; CURLOPTTYPE_OFF_T
        }
    }
}


CurlEasyDefineOptions( All = true )
{
    global

    CURLOPTTYPE_LONG = 0
    CURLOPTTYPE_OBJECTPOINT = 10000
    CURLOPTTYPE_FUNCTIONPOINT = 20000
    CURLOPTTYPE_OFF_T = 30000
    
    CURL_ERROR_SIZE = 256

    if ( !All )
        return

    CURLFORM_copYNAME       = 1
    CURLFORM_PTRNAME        = 2
    CURLFORM_NAMELENGTH     = 3
    CURLFORM_copYCONTENTS   = 4
    CURLFORM_PTRCONTENTS    = 5
    CURLFORM_CONTENTSLENGTH = 6
    CURLFORM_FILECONTENT    = 7
    CURLFORM_ARRAY          = 8
    CURLFORM_FILE           = 10
    CURLFORM_BUFFER         = 11
    CURLFORM_BUFFERPTR      = 12
    CURLFORM_BUFFERLENGTH   = 13
    CURLFORM_CONTENTTYPE    = 14
    CURLFORM_CONTENTHEADER  = 15
    CURLFORM_FILENAME       = 16
    CURLFORM_END            = 17

    CURLOPT_FILE                       = 10001 ; 1   + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_URL                        = 10002 ; 2   + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_PORT                       = 3     ; 3   + CURLOPTTYPE_LONG
    CURLOPT_PROXY                      = 10004 ; 4   + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_USERPWD                    = 10005 ; 5   + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_PROXYUSERPWD               = 10006 ; 6   + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_RANGE                      = 10007 ; 7   + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_INFILE                     = 10009 ; 9   + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_ERRORBUFFER                = 10010 ; 10  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_WRITEFUNCTION              = 20011 ; 11  + CURLOPTTYPE_FUNCTIONPOINT
    CURLOPT_READFUNCTION               = 20012 ; 12  + CURLOPTTYPE_FUNCTIONPOINT
    CURLOPT_TIMEOUT                    = 13    ; 13  + CURLOPTTYPE_LONG
    CURLOPT_INFILESIZE                 = 14    ; 14  + CURLOPTTYPE_LONG
    CURLOPT_POSTFIELDS                 = 10015 ; 15  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_REFERER                    = 10016 ; 16  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_FTPPORT                    = 10017 ; 17  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_USERAGENT                  = 10018 ; 18  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_LOW_SPEED_LIMIT            = 19    ; 19  + CURLOPTTYPE_LONG
    CURLOPT_LOW_SPEED_TIME             = 20    ; 20  + CURLOPTTYPE_LONG
    CURLOPT_RESUME_FROM                = 21    ; 21  + CURLOPTTYPE_LONG
    CURLOPT_COOKIE                     = 10022 ; 22  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_HTTPHEADER                 = 10023 ; 23  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_HTTPPOST                   = 10024 ; 24  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_SSLCERT                    = 10025 ; 25  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_KEYPASSWD                  = 10026 ; 26  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_CRLF                       = 27    ; 27  + CURLOPTTYPE_LONG
    CURLOPT_QUOTE                      = 10028 ; 28  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_WRITEHEADER                = 10029 ; 29  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_COOKIEFILE                 = 10031 ; 31  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_SSLVERSION                 = 32    ; 32  + CURLOPTTYPE_LONG
    CURLOPT_TIMECONDITION              = 33    ; 33  + CURLOPTTYPE_LONG
    CURLOPT_TIMEVALUE                  = 34    ; 34  + CURLOPTTYPE_LONG
    CURLOPT_CUSTomrEQUEST              = 10036 ; 36  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_STDERR                     = 10037 ; 37  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_POSTQUOTE                  = 10039 ; 39  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_WRITEINFO                  = 10040 ; 40  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_VERBOSE                    = 41    ; 41  + CURLOPTTYPE_LONG
    CURLOPT_HEADER                     = 42    ; 42  + CURLOPTTYPE_LONG
    CURLOPT_nopROGRESS                 = 43    ; 43  + CURLOPTTYPE_LONG
    CURLOPT_NOBODY                     = 44    ; 44  + CURLOPTTYPE_LONG
    CURLOPT_FAILONERROR                = 45    ; 45  + CURLOPTTYPE_LONG
    CURLOPT_UPLOAD                     = 46    ; 46  + CURLOPTTYPE_LONG
    CURLOPT_POST                       = 47    ; 47  + CURLOPTTYPE_LONG
    CURLOPT_DIRLISTONLY                = 48    ; 48  + CURLOPTTYPE_LONG
    CURLOPT_APPEND                     = 50    ; 50  + CURLOPTTYPE_LONG
    CURLOPT_NETRC                      = 51    ; 51  + CURLOPTTYPE_LONG
    CURLOPT_FOLLOWLOCATION             = 52    ; 52  + CURLOPTTYPE_LONG
    CURLOPT_TRANSFERTEXT               = 53    ; 53  + CURLOPTTYPE_LONG
    CURLOPT_PUT                        = 54    ; 54  + CURLOPTTYPE_LONG
    CURLOPT_PROGRESSFUNCTION           = 20056 ; 56  + CURLOPTTYPE_FUNCTIONPOINT
    CURLOPT_PROGRESSDATA               = 10057 ; 57  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_AUTOREFERER                = 58    ; 58  + CURLOPTTYPE_LONG
    CURLOPT_PROXYPORT                  = 59    ; 59  + CURLOPTTYPE_LONG
    CURLOPT_POSTFIELDSIZE              = 60    ; 60  + CURLOPTTYPE_LONG
    CURLOPT_HTTPPROXYTUNNEL            = 61    ; 61  + CURLOPTTYPE_LONG
    CURLOPT_INTERFACE                  = 10062 ; 62  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_KRBLEVEL                   = 10063 ; 63  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_SSL_VERIFYPEER             = 64    ; 64  + CURLOPTTYPE_LONG
    CURLOPT_CAINFO                     = 10065 ; 65  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_MAXREDirs                  = 68    ; 68  + CURLOPTTYPE_LONG
    CURLOPT_FILETIME                   = 69    ; 69  + CURLOPTTYPE_LONG
    CURLOPT_TELNetoPTIONS              = 10070 ; 70  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_MAXCONNECTS                = 71    ; 71  + CURLOPTTYPE_LONG
    CURLOPT_CLOSEPOLICY                = 72    ; 72  + CURLOPTTYPE_LONG
    CURLOPT_FRESH_CONNECT              = 74    ; 74  + CURLOPTTYPE_LONG
    CURLOPT_FORBID_REUSE               = 75    ; 75  + CURLOPTTYPE_LONG
    CURLOPT_RANDOM_FILE                = 10076 ; 76  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_EGDSOCKET                  = 10077 ; 77  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_CONNECTTIMEOUT             = 78    ; 78  + CURLOPTTYPE_LONG
    CURLOPT_HEADERFUNCTION             = 20079 ; 79  + CURLOPTTYPE_FUNCTIONPOINT
    CURLOPT_HTTPGET                    = 80    ; 80  + CURLOPTTYPE_LONG
    CURLOPT_SSL_VERIFYHOST             = 81    ; 81  + CURLOPTTYPE_LONG
    CURLOPT_COOKIEJAR                  = 10082 ; 82  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_SSL_CIPHER_LIST            = 10083 ; 83  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_HTTP_VERSION               = 84    ; 84  + CURLOPTTYPE_LONG
    CURLOPT_FTP_USE_EPSV               = 85    ; 85  + CURLOPTTYPE_LONG
    CURLOPT_SSLCERTTYPE                = 10086 ; 86  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_SSLKEY                     = 10087 ; 87  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_SSLKEYTYPE                 = 10088 ; 88  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_SSLENGINE                  = 10089 ; 89  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_SSLENGINE_DEFAULT          = 90    ; 90  + CURLOPTTYPE_LONG
    CURLOPT_DNS_USE_GLOBAL_CACHE       = 91    ; 91  + CURLOPTTYPE_LONG
    CURLOPT_DNS_CACHE_TIMEOUT          = 92    ; 92  + CURLOPTTYPE_LONG
    CURLOPT_PREQUOTE                   = 10093 ; 93  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_DEBUGFUNCTION              = 20094 ; 94  + CURLOPTTYPE_FUNCTIONPOINT
    CURLOPT_DEBUGDATA                  = 10095 ; 95  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_COOKIESESSION              = 96    ; 96  + CURLOPTTYPE_LONG
    CURLOPT_CAPATH                     = 10097 ; 97  + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_BUFFERSIZE                 = 98    ; 98  + CURLOPTTYPE_LONG
    CURLOPT_NOSIGNAL                   = 99    ; 99  + CURLOPTTYPE_LONG
    CURLOPT_SHARE                      = 10100 ; 100 + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_PROXYTYPE                  = 101   ; 101 + CURLOPTTYPE_LONG
    CURLOPT_ENCODING                   = 10102 ; 102 + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_PRIVATE                    = 10103 ; 103 + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_HTTP200ALIASES             = 10104 ; 104 + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_UNRESTRICTED_AUTH          = 105   ; 105 + CURLOPTTYPE_LONG
    CURLOPT_FTP_USE_EPRT               = 106   ; 106 + CURLOPTTYPE_LONG
    CURLOPT_HTTPAUTH                   = 107   ; 107 + CURLOPTTYPE_LONG
    CURLOPT_SSL_CTX_FUNCTION           = 20108 ; 108 + CURLOPTTYPE_FUNCTIONPOINT
    CURLOPT_SSL_CTX_DATA               = 10109 ; 109 + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_FTP_CREATE_MISSING_Dirs    = 110   ; 110 + CURLOPTTYPE_LONG
    CURLOPT_PROXYAUTH                  = 111   ; 111 + CURLOPTTYPE_LONG
    CURLOPT_FTP_RESPONSE_TIMEOUT       = 112   ; 112 + CURLOPTTYPE_LONG
    CURLOPT_IPRESOLVE                  = 113   ; 113 + CURLOPTTYPE_LONG
    CURLOPT_MAXFILESIZE                = 114   ; 114 + CURLOPTTYPE_LONG
    CURLOPT_INFILESIZE_LARGE           = 30115 ; 115 + CURLOPTTYPE_OFF_T
    CURLOPT_RESUME_FROM_LARGE          = 30116 ; 116 + CURLOPTTYPE_OFF_T
    CURLOPT_MAXFILESIZE_LARGE          = 30117 ; 117 + CURLOPTTYPE_OFF_T
    CURLOPT_NETRC_FILE                 = 10118 ; 118 + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_USE_SSL                    = 119   ; 119 + CURLOPTTYPE_LONG
    CURLOPT_POSTFIELDSIZE_LARGE        = 30120 ; 120 + CURLOPTTYPE_OFF_T
    CURLOPT_TCP_NODELAY                = 121   ; 121 + CURLOPTTYPE_LONG
    CURLOPT_FTPSSLAUTH                 = 129   ; 129 + CURLOPTTYPE_LONG
    CURLOPT_IOCTLFUNCTION              = 20130 ; 130 + CURLOPTTYPE_FUNCTIONPOINT
    CURLOPT_IOCTLDATA                  = 10131 ; 131 + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_FTP_ACCOUNT                = 10134 ; 134 + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_COOKIELIST                 = 10135 ; 135 + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_IGnorE_CONTENT_LENGTH      = 136   ; 136 + CURLOPTTYPE_LONG
    CURLOPT_FTP_SKIP_PASV_IP           = 137   ; 137 + CURLOPTTYPE_LONG
    CURLOPT_FTP_FILEMETHOD             = 138   ; 138 + CURLOPTTYPE_LONG
    CURLOPT_LOCALPORT                  = 139   ; 139 + CURLOPTTYPE_LONG
    CURLOPT_LOCALPORTRANGE             = 140   ; 140 + CURLOPTTYPE_LONG
    CURLOPT_CONNECT_ONLY               = 141   ; 141 + CURLOPTTYPE_LONG
    CURLOPT_CONV_FROM_NETWORK_FUNCTION = 20142 ; 142 + CURLOPTTYPE_FUNCTIONPOINT
    CURLOPT_CONV_TO_NETWORK_FUNCTION   = 20143 ; 143 + CURLOPTTYPE_FUNCTIONPOINT
    CURLOPT_CONV_FROM_UTF8_FUNCTION    = 20144 ; 144 + CURLOPTTYPE_FUNCTIONPOINT
    CURLOPT_MAX_SEND_SPEED_LARGE       = 30145 ; 145 + CURLOPTTYPE_OFF_T
    CURLOPT_MAX_RECV_SPEED_LARGE       = 30146 ; 146 + CURLOPTTYPE_OFF_T
    CURLOPT_FTP_ALTERNATIVE_TO_USER    = 10147 ; 147 + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_SOCKOPTFUNCTION            = 20148 ; 148 + CURLOPTTYPE_FUNCTIONPOINT
    CURLOPT_SOCKOPTDATA                = 10149 ; 149 + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_SSL_SESSIONID_CACHE        = 150   ; 150 + CURLOPTTYPE_LONG
    CURLOPT_SSH_AUTH_TYPES             = 151   ; 151 + CURLOPTTYPE_LONG
    CURLOPT_SSH_PUBLIC_KEYFILE         = 10152 ; 152 + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_SSH_PRIVATE_KEYFILE        = 10153 ; 153 + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_FTP_SSL_CCC                = 154   ; 154 + CURLOPTTYPE_LONG
    CURLOPT_TIMEOUT_MS                 = 155   ; 155 + CURLOPTTYPE_LONG
    CURLOPT_CONNECTTIMEOUT_MS          = 156   ; 156 + CURLOPTTYPE_LONG
    CURLOPT_HTTP_TRANSFER_DECODING     = 157   ; 157 + CURLOPTTYPE_LONG
    CURLOPT_HTTP_CONTENT_DECODING      = 158   ; 158 + CURLOPTTYPE_LONG
    CURLOPT_NEW_FILE_PERMS             = 159   ; 159 + CURLOPTTYPE_LONG
    CURLOPT_NEW_DIRECTORY_PERMS        = 160   ; 160 + CURLOPTTYPE_LONG
    CURLOPT_POST301                    = 161   ; 161 + CURLOPTTYPE_LONG
    CURLOPT_SSH_HOST_PUBLIC_KEY_MD5    = 10162 ; 162 + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_OPENSOCKETFUNCTION         = 20163 ; 163 + CURLOPTTYPE_FUNCTIONPOINT
    CURLOPT_OPENSOCKETDATA             = 10164 ; 164 + CURLOPTTYPE_OBJECTPOINT
    CURLOPT_copYPOSTFIELDS             = 10165 ; 165 + CURLOPTTYPE_OBJECTPOINT
    ; YEA,WUT NAO?
}

这是一个返回错误的示例脚本: 按原样运行时,您会得到一个空的 msgBox,如果您注释掉 VarSetCapacity(CURL_ERROR,CURL_ERROR_SIZE + 1),则会看到错误消息。

;#ErrorStdOut
#SingleInstance force
#include %A_ScriptDir%\libcurl.ahk
SetWorkingDir %A_ScriptDir%


filename = %A_Desktop%/%downloadfile%
URL = https://www.autohotkey.com/download/ahk-install.exe
GUIcontrol,hide,progressbar

if ( CurlGlobalInit( "libcurl" ) != 0 )
ExitApp

hCurlEasy := CurlEasyInit()
CurlEasyDefineOptions()
CurlGetInfoDefine()
CurlShowErrors(yes)
sleep,100

CurlEasySetoption( hCurlEasy,CURLOPT_URL,&URL )
VarSetCapacity(CURL_ERROR,CURL_ERROR_SIZE + 1)

CurlEasySetoption( hCurlEasy,CURLOPT_ERRORBUFFER,&CURL_ERROR )
CurlEasySetoption( hCurlEasy,CURLOPT_nopROGRESS,0 )
pCurlProgressFunction := RegisterCallback("CurlProgressFunction","C F")
CurlEasySetoption( hCurlEasy,CURLOPT_PROGRESSFUNCTION,pCurlProgressFunction )
pCurlWriteFunction := RegisterCallback("CurlWriteFunction",CURLOPT_WRITEFUNCTION,pCurlWriteFunction )

hFile := CreateFile( filename,2 )
Progress,%DownloadFile%
WinSet,Transparent,205,DownloadFile

If ( CurlEasyPerform( hCurlEasy ) )
msgBox %CURL_ERROR%
Progress,Off
CloseHandle(hFile)

CurlEasyCleanup( hCurlEasy )
CurlFreeLibrary()

CurlProgressFunction(clientp,dltotal_l,dltotal_h,dlNow_l,dlNow_h,ultotal_l,ultotal_h,ulNow_l,ulNow_h)
{
global hFile,Url,Backupname
Progress,%DownloadFile%
Return 0
}

CurlWriteFunction(pBuffer,size,nitems,pOutStream)
{
    global hFile
    WriteFile(hFile,pBuffer,size*nitems)
    return size*nitems
}

CreateFile(sFile,nCreate = 3,nAccess = 0x1F01FF,nShare = 7,bFolder = False)
{
    Return DllCall("CreateFile","Uint",&sFile,nAccess,nShare,nCreate,bFolder ? 0x02000000 : 0,0)
}

WriteFile(hFile,nSize = 1024)
{
    DllCall("WriteFile",hFile,nSize,"UintP",0)
    Return nSize
}

ReadFile(hFile,nSize = 1024)
{
    DllCall("ReadFile",0)
    Return nSize
}

CloseHandle(Handle)
{
    Return DllCall("CloseHandle",Handle)
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。