Problem mit Windows 8 und 64bit und WinHTTP.au3

  • Das problem ist das system ;)
    wenn ich versuche das untere script als 64bit variante auszuführen, dann funktioniert das ganze nicht (unter Win7 64 komischer weise schon)
    und zwar ist das problem genau hier:
    Local $hRequestWinHttp = _WinHttpOpenRequest($hConnectWinHttp, "POST", $target_URL)
    wenn $hConnectWinHttp eine 64bit langer int ist, crasht es...
    was soll ich nun tun ? den int einfach zurechtpharsen wäre wohl stümperhaft oder ?
    _WinHttpOpenRequest ist keine von mir erstellte funktion. (UDF hängt an)

    Spoiler anzeigen
    [autoit]


    #AutoIt3Wrapper_UseX64=y

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

    #include <WinHTTP.au3>
    #include <base64.au3>

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

    $crypted_file = FileOpenDialog("Select crypted logfile", @ScriptDir, "Logfiles (*.*)", 1)
    $connect_to_server = "xxxxxxserver.de"
    $target_URL = "upload-test.php"

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

    MsgBox(0, "ergebnis", _send_post_binary($connect_to_server, $target_URL, $crypted_file))

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

    func _send_post_binary($connect_to_server, $target_URL, $binaryfiledata, $file_send_to_server = "binary.exe", $sBoundary = "XXX", $encodebase64 = 1 )

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

    ;~ ; Initialize and get session handle
    ;~ Local $hOpenWinHttp = _WinHttpOpen()
    ;~ ; Get connection handle
    ;~ Local $hConnectWinHttp = _WinHttpConnect($hOpenWinHttp, $connect_to_server)
    ;~ ; Specify the reguest
    ;~ Local $hRequestWinHttp = _WinHttpOpenRequest($hConnectWinHttp, "POST", $target_URL)

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

    ; Initialize and get session handle
    Local $hOpenWinHttp = _WinHttpOpen()
    MsgBox(1,"$hOpenWinHttp",$hOpenWinHttp)
    ; Get connection handle
    Local $hConnectWinHttp = _WinHttpConnect($hOpenWinHttp, $connect_to_server)
    MsgBox(1,"$hConnectWinHttp",$hConnectWinHttp)
    ; Specify the reguest
    Local $hRequestWinHttp = _WinHttpOpenRequest($hConnectWinHttp, "POST", $target_URL)
    MsgBox(1,"$hRequestWinHttp",$hRequestWinHttp)

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

    ;~ --------------------------------------------------------
    Local $base64Stuff, $sS
    if $encodebase64 = 1 Then
    $base64Stuff = _Base64Encode(FileRead($binaryfiledata))
    Else
    $base64Stuff = _Base64Encode(FileRead($binaryfiledata))
    EndIf

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

    $sS = @CRLF & "--" & $sBoundary & @CRLF
    $sS &= 'Content-Disposition: multipart/form-data; name="userfile"; filename="' & $file_send_to_server & '"' & @CRLF
    $sS &= 'Content-Transfer-Encoding: base64' & @CRLF
    $sS &= "Content-Type: text/plain" & @CRLF & @CRLF & $base64Stuff & @CRLF
    $sS &= "--" & $sBoundary & "--" & @CRLF

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

    ;MsgBox(0,"SS", $sS)

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

    ; Send request
    Local $hSendRequestWinHttp = _WinHttpSendRequest($hRequestWinHttp, "Content-Type: multipart/form-data; boundary=" & $sBoundary & @CRLF, $sS, StringLen($sS))

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

    ; Wait for the response
    _WinHttpReceiveResponse($hRequestWinHttp)
    Local $recieived_data = _WinHttpReadData($hRequestWinHttp)

    ; Close handles
    _WinHttpCloseHandle($hRequestWinHttp)
    _WinHttpCloseHandle($hConnectWinHttp)
    _WinHttpCloseHandle($hOpenWinHttp)

    ; Check if there is data available...
    If _WinHttpQueryDataAvailable($hRequestWinHttp) Then
    Return $recieived_data
    Else
    Return $recieived_data
    EndIf

    EndFunc

    [/autoit]
  • Frag am besten im englischen Forum im WinHTTP thread nach. Trancexx (die Autorin der UDF) hat sicher einen guten Tipp.

  • Du meinst Sie. Sie kann manchmal etwas kompliziert sein.
    AutoIt unterstützt Windows 8 tatsächlich noch nicht offiziell.
    Hast Du schon mal versucht, das ganze für 32 bit zu kompilieren?

  • okay, dann meine ich sie ;)
    na ja, in 32 bit läuft es auch unter windows 8 ... allerdings brauche ich eine 64 bit kompilierung, und da crasht es an der besagten stelle.
    ich hab versucht das handle per hand um 4 byte zu kürzen und habe gehofft, dass ich den fehler damit vermeiden könne, hat leider nicht funktioniert.... hmmmpf :(

  • Hast du bereits versucht, WinHTTP "direkt" anzusprechen?

    Also ich meine so:

    [autoit]

    $oHTTP = ObjCreate("winhttp.winhttprequest.5.1") ;WinHTTP-Objekt erstellen
    $oHTTP.Open("POST", "http://www.blabla.at", False) ;Seite mit "POST" bzw. "GET" öffnen, wenn nötig "False" mit "HTTP 1.1" ersetzen
    $oHTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 4.0.20506)") ;UserAgent setzen
    $oHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    $oHTTP.Send("blabla") ;An Webserver etwas senden
    $oReceived = $oHTTP.ResponseText ;Rückgabe von Webserver erhalten

    [/autoit]


    Und hier findest du eine Liste mit allen Methoden für das WinHTTP-Objekt: http://msdn.microsoft.com/en-us/library/…29.aspx#methods

    Mfg

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • na ja, in 32 bit läuft es auch unter windows 8 ... allerdings brauche ich eine 64 bit kompilierung, und da crasht es an der besagten stelle.


    Ich hatte mal ein ähnliches Problem mit Office 2007 (32 bit) unter Windows 7 (64 bit). Die 64 bit Version des Scripts crashte irgendwann, erst die 32 bit Version lief fehlerfrei. Das liegt daran, dass die Bitness des kompilierten Skriptes und des aufgerufenen "Interfaces" zusammenpassen muss.
    Wenn es also für WinHTTP kein 64 bit Interface gibt (vermutlich eine DLL), dann funktioniert nur 32 bit.

  • Wenn es also für WinHTTP kein 64 bit Interface gibt (vermutlich eine DLL), dann funktioniert nur 32 bit.

    Klar gibt es eine 64-bittige "winhttp.dll", er hatte ja auch bereits geschrieben, dass das Script unter Windows 7 in beiden Modi funktioniert. Man darf also mal vermuten, dass sich unter Windows 8 ebenfalls eine 32 und 64bit Variante der DLL in den Ordnern SysWOW64 bzw System32 befindet. Mein erster Schritt wäre mal der Vergleich der entsprechenden DLLs mit dennen aus der Windows 7 Umgebung. Sofern sich die DLLs seit Windows 7 verändert haben, wovon ich mal ausgehe, köntest du testweise auch mal die Nutzung der Windows 7 DLLs erzwingen. Sprich die "alten" DLLs mitliefern und die winhttp.au3 entsprechend modifizieren, damit deine mitgelieferten DLLs genutzt werden.

  • danke für die mühe. letztendlich hat es geholfen auf ein update ihrer UDF auf die version von´vor ein paar tagen, meine version war wohl älter, was man mangels einer versionsnummer der udf nicht erkennen konnte.

    Einmal editiert, zuletzt von WhiteLion (3. April 2013 um 08:12)