Ich habe dann mal versucht die Include-Datei auf die Verwendung der in Windows vorhandenen DLL (winhttp.dll) anzupassen:
Code: Alles auswählen
;/ =========================================
;/ WinHTTP - 2009 by mback2k
;/ Lib -> DLL - 2012 by Thorsten Hoeppner
;/ =========================================
;{ Konstanten
#INTERNET_SCHEME_HTTP                   = 1
#INTERNET_SCHEME_HTTPS                  = 2
#INTERNET_DEFAULT_HTTP_PORT             = 80
#INTERNET_DEFAULT_HTTPS_PORT            = 443
  
#WINHTTP_NO_PROXY_NAME                  = 0
#WINHTTP_NO_PROXY_BYPASS                = 0
#WINHTTP_NO_REFERER                     = 0
#WINHTTP_NO_HEADER_INDEX                = 0
#WINHTTP_DEFAULT_ACCEPT_TYPES           = 0
#WINHTTP_ACCESS_TYPE_DEFAULT_PROXY      = 0
#WINHTTP_HEADER_NAME_BY_INDEX           = 0
  
#WINHTTP_AUTH_TARGET_SERVER             = 0
#WINHTTP_AUTH_TARGET_PROXY              = 1
  
#WINHTTP_AUTH_SCHEME_BASIC              = 1
#WINHTTP_AUTH_SCHEME_NTLM               = 2
#WINHTTP_AUTH_SCHEME_PASSPORT           = 4
#WINHTTP_AUTH_SCHEME_DIGEST             = 8
#WINHTTP_AUTH_SCHEME_NEGOTIATE          = 16
  
#WINHTTP_OPTION_REDIRECT_POLICY                         = 88
#WINHTTP_OPTION_REDIRECT_POLICY_NEVER                   = 0
#WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP  = 1
#WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS                  = 2
  
#WINHTTP_QUERY_STATUS_CODE              = 19
#WINHTTP_QUERY_RAW_HEADERS_CRLF         = 22
#WINHTTP_QUERY_CONTENT_ENCODING         = 29
#WINHTTP_QUERY_LOCATION                 = 33
#WINHTTP_QUERY_FLAG_NUMBER              = $20000000
  
#WINHTTP_OPTION_USERNAME                = $1000
#WINHTTP_OPTION_PASSWORD                = $1001
  
#WINHTTP_FLAG_REFRESH                   = $00000100
#WINHTTP_FLAG_SECURE                    = $00800000
  
#WINHTTP_ADDREQ_FLAG_ADD                = $20000000
;}
;{ Prototypes
Prototype  WinHttpAddRequestHeaders(hRequest, pwszHeaders.p-unicode, dwHeadersLength.l, dwModifiers.l)
Prototype  WinHttpCloseHandle(hInternet)
Prototype  WinHttpConnect(hSession, pswzServerName.p-unicode, nServerPort.l, dwReserved.l)
Prototype  WinHttpCrackUrl(pwszUrl.p-unicode, dwUrlLength.l, dwFlags.l, *lpUrlComponents)
Prototype  WinHttpOpen(pwszUserAgent.p-unicode, dwAccessType.l, *pwszProxyName, *pwszProxyBypass, dwFlags.l)
Prototype  WinHttpOpenRequest(hConnect, pwszVerb.p-unicode, pwszObjectName.p-unicode, *pwszVersion, *pwszReferrer, *ppwszAcceptTypes, dwFlags.l)
Prototype  WinHttpQueryDataAvailable(hRequest, *lpdwNumberOfBytesAvailable)
Prototype  WinHttpQueryHeaders(hRequest, dwInfoLevel.l, *pwszName, *lpBuffer, *lpdwBufferLength, *lpdwIndex)
Prototype  WinHttpReadData(hRequest, *lpBuffer, dwNumberOfBytesToRead.l, *lpdwNumberOfBytesRead)
Prototype  WinHttpReceiveResponse(hRequest, *lpReserved)
Prototype  WinHttpSendRequest(hRequest, pwszHeaders.p-unicode, dwHeadersLength.l, *lpOptional, dwOptionalLength.l, dwTotalLength.l, dwContext.l)
Prototype  WinHttpSetCredentials(hInternet, AuthTargets.l, AuthScheme.l, pwszUserName.p-unicode, pwszPassword.p-unicode, *pAuthParams)
Prototype  WinHttpSetOption(hInternet, dwOption.l, *lpBuffer, dwBufferLength.l)
Prototype ReceiveHTTPStart(CallbackID, hRequest)
Prototype ReceiveHTTPProgress(CallbackID, lBytesReceived, lSize, lElapsedTime)
Prototype ReceiveHTTPEnd(CallbackID, lRetVal, lBytesReceived, lSize, lElapsedTime)
;}
;{ Variablen
Global WinHttpAddRequestHeaders.WinHttpAddRequestHeaders
Global WinHttpCloseHandle.WinHttpCloseHandle
Global WinHttpConnect.WinHttpConnect
Global WinHttpCrackUrl.WinHttpCrackUrl
Global WinHttpOpen.WinHttpOpen
Global WinHttpOpenRequest.WinHttpOpenRequest
Global WinHttpQueryDataAvailable.WinHttpQueryDataAvailable
Global WinHttpQueryHeaders.WinHttpQueryHeaders
Global WinHttpReadData.WinHttpReadData
Global WinHttpReceiveResponse.WinHttpReceiveResponse
Global WinHttpSendRequest.WinHttpSendRequest
Global WinHttpSetCredentials.WinHttpSetCredentials
Global WinHttpSetOption.WinHttpSetOption
;}
Procedure.i WinHttp_LoadDLL()
  ; Generated with PureDLLHelper, Copyright ©2012 by Thomas <ts-soft> Schulz
  Protected hDLL.i
  hDLL = OpenLibrary(#PB_Any, "winhttp.dll")
  If hDLL <> 0
    WinHttpAddRequestHeaders = GetFunction(hDLL, "WinHttpAddRequestHeaders")
    WinHttpCloseHandle = GetFunction(hDLL, "WinHttpCloseHandle")
    WinHttpConnect = GetFunction(hDLL, "WinHttpConnect")
    WinHttpCrackUrl = GetFunction(hDLL, "WinHttpCrackUrl")
    WinHttpOpen = GetFunction(hDLL, "WinHttpOpen")
    WinHttpOpenRequest = GetFunction(hDLL, "WinHttpOpenRequest")
    WinHttpQueryDataAvailable = GetFunction(hDLL, "WinHttpQueryDataAvailable")
    WinHttpQueryHeaders = GetFunction(hDLL, "WinHttpQueryHeaders")
    WinHttpReadData = GetFunction(hDLL, "WinHttpReadData")
    WinHttpReceiveResponse = GetFunction(hDLL, "WinHttpReceiveResponse")
    WinHttpSendRequest = GetFunction(hDLL, "WinHttpSendRequest")
    WinHttpSetCredentials = GetFunction(hDLL, "WinHttpSetCredentials")
    WinHttpSetOption = GetFunction(hDLL, "WinHttpSetOption")
    ProcedureReturn hDLL
  EndIf
  ProcedureReturn #False
EndProcedure
Procedure ReceiveHTTPMemory(url$, RequestType$ = "GET", ReturnHeader = #False, Username$ = "", Password$ = "", HeaderData$ = "", OptionalData$ = "", UserAgent$ = "WinHTTP - PureBasic", CallbackID = 0, CallbackStart.ReceiveHTTPStart = 0, CallbackProgress.ReceiveHTTPProgress = 0, CallbackEnd.ReceiveHTTPEnd = 0)
  Protected lpUrlComponents.URL_COMPONENTS\dwStructSize = SizeOf(URL_COMPONENTS)
  Protected lStatusCode.l, lContentLen.l, lRedirectPolicy.l = #WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS, lLongSize.l = SizeOf(Long)
  Protected hInternet, hConnect, hRequest, lRetVal, lBytesRead, lReadUntilNow, lBufSize, lStartTime, lResult
  Protected lPort, lFlags, sDomain$, sPath$, sQuery$, *OptionalBuffer, OptionalLength, *MemoryBuffer, MemoryLength
  Static hSession
  
  lStartTime = ElapsedMilliseconds()
  lpUrlComponents\dwSchemeLength = -1
  lpUrlComponents\dwHostNameLength = -1
  lpUrlComponents\dwUrlPathLength = -1
  lpUrlComponents\dwExtraInfoLength = -1
  
  If WinHttpCrackUrl(URLEncoder(url$), #Null, #Null, @lpUrlComponents)
    Select lpUrlComponents\nScheme
      Case #INTERNET_SCHEME_HTTP
        lPort = #INTERNET_DEFAULT_HTTP_PORT
        lFlags = #WINHTTP_FLAG_REFRESH
      Case #INTERNET_SCHEME_HTTPS
        lPort = #INTERNET_DEFAULT_HTTPS_PORT
        lFlags = #WINHTTP_FLAG_REFRESH | #WINHTTP_FLAG_SECURE
    EndSelect
    
    If lPort And lFlags
      If lpUrlComponents\lpszHostName And lpUrlComponents\dwHostNameLength
        sDomain$ = PeekS(lpUrlComponents\lpszHostName, lpUrlComponents\dwHostNameLength, #PB_Unicode)
      EndIf
      If lpUrlComponents\lpszUrlPath And lpUrlComponents\dwUrlPathLength
        sPath$ = PeekS(lpUrlComponents\lpszUrlPath, lpUrlComponents\dwUrlPathLength, #PB_Unicode)
      EndIf
      If lpUrlComponents\lpszExtraInfo And lpUrlComponents\dwExtraInfoLength
        sQuery$ = PeekS(lpUrlComponents\lpszExtraInfo, lpUrlComponents\dwExtraInfoLength, #PB_Unicode)
      EndIf
      
      If sDomain$ And sPath$
        If Not hSession
          hSession = WinHttpOpen(UserAgent$, #WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, #WINHTTP_NO_PROXY_NAME, #WINHTTP_NO_PROXY_BYPASS, 0)
        EndIf
        If hSession
          hInternet = WinHttpConnect(hSession, sDomain$, lPort, #Null)
          If hInternet
            hRequest = WinHttpOpenRequest(hInternet, RequestType$, sPath$+sQuery$, #Null, #WINHTTP_NO_REFERER, #WINHTTP_DEFAULT_ACCEPT_TYPES, lFlags)
            If hRequest
              If StringByteLength(OptionalData$, #PB_UTF8)
                *OptionalBuffer = AllocateMemory(StringByteLength(OptionalData$, #PB_UTF8)+1)
              EndIf
              If *OptionalBuffer
                OptionalLength = MemorySize(*OptionalBuffer)
                PokeS(*OptionalBuffer, OptionalData$, OptionalLength, #PB_UTF8)
                OptionalLength - 1
              EndIf
              If lpUrlComponents\nScheme = #INTERNET_SCHEME_HTTP
                WinHttpSetOption(hRequest, #WINHTTP_OPTION_REDIRECT_POLICY, @lRedirectPolicy, SizeOf(Long))
              EndIf
              If Len(Username$)
                WinHttpSetCredentials(hRequest, #WINHTTP_AUTH_TARGET_SERVER, #WINHTTP_AUTH_SCHEME_BASIC, Username$, Password$, #Null)
              EndIf
              If WinHttpAddRequestHeaders(hRequest, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"+#CRLF$, -1, #WINHTTP_ADDREQ_FLAG_ADD)
                WinHttpAddRequestHeaders(hRequest, "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"+#CRLF$, -1, #WINHTTP_ADDREQ_FLAG_ADD)
                WinHttpAddRequestHeaders(hRequest, "Accept-Language: en-us,en-gb;q=0.9,en;q=0.8,*;q=0.7"+#CRLF$, -1, #WINHTTP_ADDREQ_FLAG_ADD)
              EndIf
              If RequestType$ = "POST"
                WinHttpAddRequestHeaders(hRequest, "Content-Type: application/x-www-form-urlencoded"+#CRLF$, -1, #WINHTTP_ADDREQ_FLAG_ADD)
              EndIf
              If CallbackStart
                CallbackStart(CallbackID, hRequest)
              EndIf
              If WinHttpSendRequest(hRequest, HeaderData$, Len(HeaderData$), *OptionalBuffer, OptionalLength, OptionalLength, CallbackID)
                If WinHttpReceiveResponse(hRequest, #Null)
                  If WinHttpQueryHeaders(hRequest, #WINHTTP_QUERY_FLAG_NUMBER | #WINHTTP_QUERY_STATUS_CODE, #WINHTTP_HEADER_NAME_BY_INDEX, @lStatusCode, @lLongSize, #WINHTTP_NO_HEADER_INDEX)
                    If lStatusCode = 200
                      lResult = WinHttpQueryDataAvailable(hRequest, @lContentLen)
                    Else
                      lResult = #True
                      lContentLen = 0
                    EndIf
                    If lResult
                      *MemoryBuffer = AllocateMemory(16384)
                      If *MemoryBuffer
                        MemoryLength = MemorySize(*MemoryBuffer)-2
                        If ReturnHeader
                          If WinHttpQueryHeaders(hRequest, #WINHTTP_QUERY_RAW_HEADERS_CRLF, #WINHTTP_HEADER_NAME_BY_INDEX, *MemoryBuffer, @MemoryLength, #WINHTTP_NO_HEADER_INDEX)
                            lRetVal = ReAllocateMemory(*MemoryBuffer, MemoryLength)
                          EndIf
                        ElseIf lContentLen
                          Repeat
                            If MemoryLength-lReadUntilNow <= lContentLen
                              *MemoryBuffer = ReAllocateMemory(*MemoryBuffer, MemoryLength+lContentLen+1)
                              If *MemoryBuffer
                                MemoryLength = MemorySize(*MemoryBuffer)
                              Else
                                Break
                              EndIf
                            EndIf
                            If WinHttpReadData(hRequest, *MemoryBuffer+lReadUntilNow, lContentLen, @lBytesRead)
                              If lBytesRead
                                lReadUntilNow + lBytesRead
                              Else
                                Break
                              EndIf
                              If CallbackProgress
                                CallbackProgress(CallbackID, lReadUntilNow, lContentLen, (ElapsedMilliseconds() - lStartTime) / 1000)
                              EndIf
                            Else
                              Break
                            EndIf
                            If Not WinHttpQueryDataAvailable(hRequest, @lContentLen)
                              Break
                            EndIf
                          ForEver
                          If lReadUntilNow >= lContentLen
                            lRetVal = ReAllocateMemory(*MemoryBuffer, lReadUntilNow)
                          EndIf
                        EndIf
                      EndIf
                    EndIf
                  EndIf
                EndIf
              EndIf
              If *OptionalBuffer
                FreeMemory(*OptionalBuffer)
              EndIf
              If CallbackEnd
                CallbackEnd(CallbackID, lRetVal, lReadUntilNow, lContentLen, (ElapsedMilliseconds() - lStartTime) / 1000)
              EndIf
            EndIf
          EndIf
        EndIf
      EndIf
    EndIf
  EndIf
  
  If hRequest
    WinHttpCloseHandle(hRequest)
  EndIf
  If hInternet
    WinHttpCloseHandle(hInternet)
  EndIf
  ; If hSession
  ;   WinHttpCloseHandle(hSession)
  ; EndIf
  
  ProcedureReturn lRetVal
EndProcedure
Procedure.s ReceiveHTTPString(url$, RequestType$ = "GET", ReturnHeader = #False, Username$ = "", Password$ = "", HeaderData$ = "", OptionalData$ = "", UserAgent$ = "WinHTTP - PureBasic", CallbackID = 0, CallbackStart.ReceiveHTTPStart = 0, CallbackProgress.ReceiveHTTPProgress = 0, CallbackEnd.ReceiveHTTPEnd = 0)
  Protected result$, *MemoryBuffer
  *MemoryBuffer = ReceiveHTTPMemory(url$, RequestType$, ReturnHeader, Username$, Password$, HeaderData$, OptionalData$, UserAgent$, CallbackID, CallbackStart.ReceiveHTTPStart, CallbackProgress.ReceiveHTTPProgress, CallbackEnd.ReceiveHTTPEnd)
  If *MemoryBuffer
    If ReturnHeader
      result$ = PeekS(*MemoryBuffer, MemorySize(*MemoryBuffer), #PB_Unicode)
    Else
      result$ = PeekS(*MemoryBuffer, MemorySize(*MemoryBuffer), #PB_UTF8)
    EndIf
    FreeMemory(*MemoryBuffer)
  EndIf
  ProcedureReturn result$
EndProcedure
Procedure ReceiveHTTPFileEx(url$, filename$, RequestType$ = "GET", Username$ = "", Password$ = "", HeaderData$ = "", OptionalData$ = "", UserAgent$ = "WinHTTP - PureBasic", CallbackID = 0, CallbackStart.ReceiveHTTPStart = 0, CallbackProgress.ReceiveHTTPProgress = 0, CallbackEnd.ReceiveHTTPEnd = 0)
  Protected File, *MemoryBuffer
  *MemoryBuffer = ReceiveHTTPMemory(url$, RequestType$, #False, Username$, Password$, HeaderData$, OptionalData$, UserAgent$, CallbackID, CallbackStart.ReceiveHTTPStart, CallbackProgress.ReceiveHTTPProgress, CallbackEnd.ReceiveHTTPEnd)
  If *MemoryBuffer
    File = CreateFile(#PB_Any, filename$)
    If File
      WriteData(File, *MemoryBuffer, MemorySize(*MemoryBuffer))
      CloseFile(File)
      FreeMemory(*MemoryBuffer)
      ProcedureReturn #True
    EndIf
    FreeMemory(*MemoryBuffer)
  EndIf
  ProcedureReturn #False
EndProcedure