WinHTTP dieses mal mit dll, kom mit WinHttpOpenRequest nicht voran

  • Also nachdem ich erst versucht habe WinHTTP per com zu lösen bin ich jetzt dabei das mit der Dll zu machen.
    Leider hab ich keine Ahnung wie ich die Funktion WinHttpOpenRequest in AutoIt benutzen kann.

    [autoit]

    #include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    $vDll = DllOpen ("Winhttp.dll")

    [/autoit][autoit][/autoit][autoit]

    $sUserAgent = 'AutoIt'
    $iAccessFlag = 0
    $sProxyName = ''
    $sProxyBypass = ''

    [/autoit][autoit][/autoit][autoit]

    $vRet = DllCall ( $vDLL, "ptr", "WinHttpOpen", "wstr", $sUserAgent, "dword", $iAccessFlag, "wstr", $sProxyName, "wstr", $sProxyBypass, "dword", 0)
    ConsoleWrite ($vRet[0])

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $sServerName = "www.google.com" ; oh mein gott !!!! ohne http://
    $iServerPort = 80

    [/autoit][autoit][/autoit][autoit]

    $vRet = DllCall ( $vDLL, "ptr", "WinHttpConnect", "ptr", $vRet[0], "wstr", $sServerName, "dword", $iServerPort, "dword", 0)
    ConsoleWrite (@lf & $vRet[0])

    [/autoit][autoit][/autoit][autoit]

    ;~ $tagDllStructCreate ( "wstr Verb;wstr ObjectNamen;wstr Version;wstr Referrer;ptr AcceptTypes;dword Flags")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;~ $sVerb = 0 ; 0 = Get; PUT
    ;~ $sObjectName = "/"
    ;~ $sVersion = 0
    ;~ $sReferre = 0
    ;~ $sAcceptTypes = 0
    ;~ $iFlag = 0
    ;~ $vStruct = DllStructCreate ("wstr;wstr;wstr;wstr")
    ;~ DllStructSetData ( $vStruct, 1, $sVerb)
    ;~ DllStructSetData ( $vStruct, 2, $sObjectName )
    ;~ DllStructSetData ( $vStruct, 3, $sVersion)
    ;~ DllStructSetData ( $vStruct, 4, $sRef)

    [/autoit][autoit][/autoit][autoit]

    ;~ $vRequest = DllCall ( $vDLL, "ptr", "WinHttpOpenRequest", "ptr", $vRet[0], "wstr", $sVerb, "wstr", $sObjectName, "wstr", $sVersion, "wstr", $sReferre, "ptr", DllStructGetPtr ($vStruct), "dword", $iFlag)
    ;~ _ArrayDisplay ($vRequest)
    ;~ ConsoleWrite (@lf & @error & @lf)
    ;~ ConsoleWrite (GetLastError())

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    func GetLastError ()
    $vRet = DllCall ("kernel32.dll", "dword", "GetLastError")
    Return $vRet[0]
    EndFunc

    [/autoit]
  • Ok alles bis WinHttpReceiveResponse geht so einiger masen, WinHttpSendRequest ist noch nicht fertig aber klappt und WinHttpReadData klappt nicht da WinHttpReceiveResponse nicht funktioniert.

    [autoit]

    #include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    $vDll = DllOpen ("Winhttp.dll")

    [/autoit][autoit][/autoit][autoit]

    $h = WinHttpOpen ( $vDll )
    ;~ ConsoleWrite ($h & @lf)
    $h2 = WinHttpConnect ($vDLL, $h, "www.google.de")
    ;~ ConsoleWrite ( @lf & WinHttpCheckPlatform ($vDLL))
    $h3 = WinHttpOpenRequest ($vDll, $h2, "GET")
    ;~ ConsoleWrite ($h2 & @lf & $h3 & @lf)
    WinHttpSendRequest ( $vDll, $h3)
    ConsoleWrite (WinHttpReceiveResponse ($vDLL, $h3))
    Sleep ( 500 )
    WinHttpReadData ( $vDll, $h3, 10000)

    [/autoit][autoit][/autoit][autoit]

    Func WinHttpCheckPlatform ( $vDLL )
    $vRet = DllCall ( $vDLL, "int", "WinHttpCheckPlatform")
    if @error Then
    Return SetError (1,0,0)
    EndIf
    Return $vRet[0]
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    func WinHttpOpen ($vDLL, $sUserAgent = Default, $iAccessFlag = 0 , $sProxyName = '', $sProxyBypass = '')
    if $sUserAgent = Default Then
    $sUserAgent = "Mozilla/5.0 (compatible; AutoIt "& @AutoItVersion & "; " & @OSTYPE & " " & @OSVersion & " " & @OSBuild & ")"
    EndIf
    if not IsString ( $sUserAgent ) Then Return SetError (1,0,0)
    if not IsNumber ( $iAccessFlag ) Then Return SetError (2,0,0)
    $vRet = DllCall ( $vDLL, "ptr", "WinHttpOpen", "wstr", $sUserAgent, "dword", $iAccessFlag, "wstr", $sProxyName, "wstr", $sProxyBypass, "dword", 0)
    if @error or not IsArray ($vRet) or $vRet[0] = 0 Then Return SetError (3,0,0)
    Return $vRet[0]
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    func WinHttpConnect ( $vDLL, $hInternetSession, $sServerName, $iServerPort = 80)
    $vRet = DllCall ( $vDLL, "ptr", "WinHttpConnect", "ptr", $hInternetSession, "wstr", $sServerName, "dword", $iServerPort, "dword", 0)
    if @error or not IsArray ($vRet) or $vRet[0] = 0 then Return SetError (1,0,0)
    Return $vRet[0]
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    func WinHttpOpenRequest ( $vDLL, $hInternetConnect, $vVerb = 0, $vObjectName = 0, $vVersion = 0, $vReferrer = 0, $vAcceptTypes = 0 , $iFlag = 0)
    $vRet = DllCall ( $vDLL, "ptr", "WinHttpOpenRequest", "ptr", $hInternetConnect, "wstr", $vVerb, "wstr", $vObjectName, "wstr", $vVersion, "wstr", $vReferrer, "wstr*", $vAcceptTypes, "dword", $iFlag)
    if @error or not IsArray ($vRet) or $vRet[0] = 0 Then Return SetError (1,0,0)
    Return $vRet[0]
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func WinHttpSendRequest ( $vDLL, $hInternetRequest, $vHeaders = 0, $vOptional = 0, $iTotalLength = 0, $vContext = 0 )

    if $vHeaders = 0 then
    $iHeadersLength = 0
    Else
    $iHeadersLength = StringLen ( $vHeaders )
    EndIf

    if $vOptional = 0 then
    $iOptionalLength = 0
    $pOptional = 0
    Else
    $vOptionalStruct = DllStructCreate ( "chr[" & StringLen ($vOptional) & "] ")
    DllStructSetData ( $vOptionalStruct, 1, $vOptional)
    $iOptionalLength = DllStructGetSize ($vOptionalStruct)
    $pOptional = DllStructGetPtr ($vOptionalStruct)
    EndIf
    ;nur übergangs lösung !!!!!!!!!
    ;#######################################
    $vRet = DllCall ( $vDLL, "int", "WinHttpSendRequest", "ptr", $hInternetRequest, "dword", $vHeaders, "dword", $iHeadersLength, "dword", $pOptional, "dword", $iOptionalLength, "dword", $iTotalLength, "dword", $vContext)
    _ArrayDisplay ($vRet)
    ;########################################
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    func WinHttpReceiveResponse ( $vDLL, $hInternetRequest )
    $vRet = DllCall ( $vDLL, "int", "WinHttpReceiveResponse", "ptr", $hInternetRequest, "ptr", 0)
    if @error or not IsArray ($vRet) or $vRet[0] = 0 Then Return SetError (1,0,0)
    Return 1
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func WinHttpReadData ($vDLL, $hInternetRequest , $iNumberOfBytesToRead)

    $tNumberOfBytesRead = DllStructCreate ( "dword")
    $tBuffer = DllStructCreate ("byte[" & $iNumberOfBytesToRead & "]")
    $vRet = DllCall ( $vDLL, "int", "WinHttpReadData", "ptr", $hInternetRequest, "ptr", DllStructGetPtr ($tBuffer), "dword", $iNumberOfBytesToRead, "ptr", DllStructGetPtr ($tNumberOfBytesRead))

    ConsoleWrite (DllStructGetData ($tBuffer,1))
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func GetLastError ()
    $vRet = DllCall ("kernel32.dll", "dword", "GetLastError")
    Return $vRet[0]
    EndFunc

    [/autoit]
  • So, jetzt geht alles :) Ich habe nur ein paar mal 0 mit "" für leeren String getauscht, das String Array umgesetzt, an ein paar stellen error-Handling und so :)

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $vDll = DllOpen ("Winhttp.dll")

    [/autoit] [autoit][/autoit] [autoit]

    $h = WinHttpOpen ( $vDll )
    ;~ ConsoleWrite ($h & @lf)
    $h2 = WinHttpConnect ($vDLL, $h, "www.google.de")
    ;~ ConsoleWrite ( @lf & WinHttpCheckPlatform ($vDLL))
    $h3 = WinHttpOpenRequest ($vDll, $h2, "GET")
    ;~ ConsoleWrite ($h2 & @lf & $h3 & @lf)
    WinHttpSendRequest ( $vDll, $h3)
    ConsoleWrite (WinHttpReceiveResponse ($vDLL, $h3))
    Sleep ( 500 )
    Local $ReturnData
    While 1
    $ReturnData &= WinHttpReadData ( $vDll, $h3, 10000)
    If @error <> 0 Then ExitLoop
    WEnd
    $ReturnData = StringReplace($ReturnData,"0x","")
    $ReturnData = Binary("0x"&$ReturnData)
    MsgBox(0, '', BinaryToString($ReturnData))

    [/autoit] [autoit][/autoit] [autoit]

    Func WinHttpCheckPlatform ( $vDLL )
    $vRet = DllCall ( $vDLL, "int", "WinHttpCheckPlatform")
    if @error Then
    Return SetError (1,0,0)
    EndIf
    Return $vRet[0]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func WinHttpOpen ($vDLL, $sUserAgent = Default, $iAccessFlag = 0 , $sProxyName = '', $sProxyBypass = '')
    if $sUserAgent = Default Then
    $sUserAgent = "Mozilla/5.0 (compatible; AutoIt "& @AutoItVersion & "; " & @OSTYPE & " " & @OSVersion & " " & @OSBuild & ")"
    EndIf
    if not IsString ( $sUserAgent ) Then Return SetError (1,0,0)
    if not IsNumber ( $iAccessFlag ) Then Return SetError (2,0,0)
    $vRet = DllCall ( $vDLL, "ptr", "WinHttpOpen", "wstr", $sUserAgent, "dword", $iAccessFlag, "wstr", $sProxyName, "wstr", $sProxyBypass, "dword", 0)
    if @error or not IsArray ($vRet) or $vRet[0] = 0 Then Return SetError (3,0,0)
    Return $vRet[0]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    func WinHttpConnect ( $vDLL, $hInternetSession, $sServerName, $iServerPort = 80)
    Local $vRet = DllCall ( $vDLL, "ptr", "WinHttpConnect", "ptr", $hInternetSession, "wstr", $sServerName, "dword", $iServerPort, "dword", 0)
    if @error or not IsArray ($vRet) or $vRet[0] = 0 then Return SetError (1,0,0)
    Return $vRet[0]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;Prog@ndy
    Func _WinHTTP_CreateWTextStruct($text)
    Local $s = DllStructCreate("char[" & StringLen($text) + 1 & "]")
    DllStructSetData($s, 1, $text)
    Return $s
    EndFunc ;==>_PrintUDF_CreateTextStruct

    [/autoit] [autoit][/autoit] [autoit]

    ; Return Types as Array or, if only 1 type then as a String
    func WinHttpOpenRequest ( $vDLL, $hInternetConnect, $vVerb = "", $vObjectName = "", $vVersion = "", $vReferrer = "", $aAcceptTypes = "" , $iFlag = "")
    ; By Prog@ndy, the Accpt-Types are created as null-terminated Array
    Local $dllAcceptTypes
    If IsArray($aAcceptTypes) Then
    $dllAcceptTypes = DllStructCreate("ptr[" & (UBound($aAcceptTypes)+1) & "]")
    For $i = 0 To UBound($aAcceptTypes)-1
    $aAcceptTypes[$i] = _WinHTTP_CreateWTextStruct($aAcceptTypes[$i])
    DllStructSetData($dllAcceptTypes,$i+1,DllStructGetPtr($aAcceptTypes[$i]))
    Next
    ElseIf IsString($aAcceptTypes) And StringLen($aAcceptTypes) Then
    $dllAcceptTypes = DllStructCreate("ptr;wchar[" & (StringLen($aAcceptTypes)+1) & "]")
    DllStructSetData($dllAcceptTypes,1,DllStructGetPtr($dllAcceptTypes,2))
    DllStructSetData($dllAcceptTypes,2,$aAcceptTypes)
    EndIf

    Local $vRet = DllCall ( $vDLL, "ptr", "WinHttpOpenRequest", "ptr", $hInternetConnect, "wstr", $vVerb, "wstr", $vObjectName, "wstr", $vVersion, "wstr", $vReferrer, "ptr", DllStructGetPtr($dllAcceptTypes), "dword", $iFlag)
    if @error or not IsArray ($vRet) or $vRet[0] = 0 Then Return SetError (1,0,0)
    Return $vRet[0]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func WinHttpSendRequest ( $vDLL, $hInternetRequest, $vHeaders = "", $vOptional = "", $iTotalLength = 0, $vContext = 0 )

    Local $iHeadersLength = StringLen ( $vHeaders )

    [/autoit] [autoit][/autoit] [autoit]

    Local $iOptionalLength=0, $pOptional=0
    If StringLen($vOptional) Then
    $vOptionalStruct = DllStructCreate ( "char[" & StringLen ($vOptional) & "] ")
    DllStructSetData ( $vOptionalStruct, 1, $vOptional)
    $iOptionalLength = DllStructGetSize ($vOptionalStruct)
    If $iTotalLength < $iOptionalLength Then $iTotalLength = $iOptionalLength
    $pOptional = DllStructGetPtr ($vOptionalStruct)
    EndIf

    Local $vRet = DllCall ( $vDLL, "int", "WinHttpSendRequest", "ptr", $hInternetRequest, "wstr", $vHeaders, "dword", $iHeadersLength, "dword", $pOptional, "dword", $iOptionalLength, "dword", $iTotalLength, "dword", $vContext)
    If @error Then Return SetError(1,0,0)
    If $vRet[0]=0 Then Return SetError(2,0,0)
    Return $vRet[0]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    func WinHttpReceiveResponse ( $vDLL, $hInternetRequest )
    Local $vRet = DllCall ( $vDLL, "int", "WinHttpReceiveResponse", "ptr", $hInternetRequest, "ptr", 0)
    if @error or not IsArray ($vRet) or $vRet[0] = 0 Then Return SetError (1,0,0)
    Return 1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func WinHttpReadData ($vDLL, $hInternetRequest , $iNumberOfBytesToRead)

    Local $tBuffer = DllStructCreate ("byte[" & $iNumberOfBytesToRead & "]")
    Local $vRet = DllCall ( $vDLL, "int", "WinHttpReadData", "ptr", $hInternetRequest, "ptr", DllStructGetPtr ($tBuffer), "dword", $iNumberOfBytesToRead, "dword*", 0)
    If @error Or $vRet[0] = 0 Then
    Return SetError(1,0,0)
    ElseIf $vRet[4] = $iNumberOfBytesToRead Then
    Return DllStructGetData ($tBuffer,1)
    ElseIf $vRet[4] = 0 Then
    Return SetError(-1,0,"")
    EndIf
    Return BinaryMid(DllStructGetData ($tBuffer,1),1,$vRet[4])

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func GetLastError ()
    Local $vRet = DllCall ("kernel32.dll", "dword", "GetLastError")
    Return $vRet[0]
    EndFunc

    [/autoit]


    //Edit: bin nicht sicher, ob es
    $vOptionalStruct = DllStructCreate ( "char[" & StringLen ($vOptional) & "] ")
    oder
    $vOptionalStruct = DllStructCreate ( "wchar[" & StringLen ($vOptional) & "] ")
    sein soll.