Seite 1 von 2

PostToHost mit Unicode-Executable

Verfasst: 21.09.2009 12:05
von MSJones
Hallo.
Hab mir aus dem Beitrag Automatisch einloggen bei Webgadget die PostToHost Procedure kopiert und wollt die in mein Programm einbauen.

Jetzt stellt sich das Problem, wenn ich das Programm als Unicode-Executable kompiliere, beikomm ich nur Blödsinn von der Funktion zurückgeliefert.
Liegt wohl daran, daß die Variablen als normale ASCII Variablen angesehen werden, aber eigentlich Unicode-Variablen erwartet werden.

Kann ich die Variablen entsprechend anders deklarieren?
Bin schon seit Freitag am Suchen und finde leider nichts.

Mein PB Version ist 4.20.
Geht's vielleicht mit 4.31 einfacher?

Re: PostToHost mit Unicode-Executable

Verfasst: 05.11.2009 13:21
von MSJones
So, ich hab mal ein kleines Beispiel gebaut, mit dem jeder mal mein Problem nachvollziehen kann.

Also in der PB-Datei steht:

Code: Alles auswählen

#Window_4 = 4
#Gadget_8 = 8

;Anfang fuer Postuebergabe
#INTERNET_OPEN_TYPE_DIRECT = 1
#HTTP_ADDREQ_FLAG_ADD = $20000000
#HTTP_ADDREQ_FLAG_REPLACE = $80000000
#INTERNET_FLAG_SECURE2 = 0
#INTERNET_SERVICE_HTTP = 3
#INTERNET_DEFAULT_HTTP_PORT = 80
#HTTP_QUERY_COOKIE = 44

Structure HttpPostStructure
  host.s        ;holding the hostname Do Not include http:// Or any other protocol indicator here
  get_url.s     ;Everything after the hostname of the server
  post_data.s   ;the Data that should be posted
  result.s      ;holds the reviced html
EndStructure

Procedure Send_HTTP_Post(*in.HTTPPostStructure)
  Protected open_handle.i,connect_handle.i,request_handle.i,send_handle
  Protected result.s,headers.s
  Protected bytes_read.i,ReturnStatus.i
  Protected total_read.i  = 0   
  Protected UserAgent.s   = "IDOPOST!"     
  Protected buffer.s      = Space(1024)
 
  ;InputStructure
  ; host.s        holding the hostname Do NOT include http:// or any other protocol indicator here
  ; get_url.s     Everything after the hostname of the server
  ; result.s      Holds the result from the CGI/page
  ; post_data.s   the data that should be posted
  ; result.s      holds the reviced html

  Debug *in\get_url
  Debug *in\host
  Debug *in\post_data.s

  If *in
    open_handle = InternetOpen_(UserAgent.s,#INTERNET_OPEN_TYPE_DIRECT,"","",0)
    If open_handle
      Debug "Open_Handle: " + Str(open_handle)
     
      connect_handle = InternetConnect_(open_handle,*in\host,#INTERNET_DEFAULT_HTTP_PORT,"","",#INTERNET_SERVICE_HTTP,0,0)
      If connect_handle
        Debug "Connect_Handle: " + Str(connect_handle)
       
        request_handle = HttpOpenRequest_(connect_handle,"POST",*in\get_url,"","",0,#INTERNET_FLAG_SECURE2,0)
        If request_handle
          Debug "Request_Handle: " + Str(request_handle)
         
          headers.s = "Content-Type: application/x-www-form-urlencoded" +Chr(13)+Chr(10)

          HttpAddRequestHeaders_(request_handle,headers,Len(headers), #HTTP_ADDREQ_FLAG_REPLACE | #HTTP_ADDREQ_FLAG_ADD)
          send_handle = HttpSendRequest_(request_handle,"",0,*in\post_data,Len(*in\post_data))
          Debug "Last Error: " + Str(GetLastError_())
          If send_handle
            Debug "Send_Handle: " + Str(send_handle)
         
            Repeat
             
              InternetReadFile_(request_handle,@buffer,1024,@bytes_read)
              Debug buffer
              result = result + Left(buffer,bytes_read)
              buffer = Space(1024)
             
            Until bytes_read=0
            Debug result
           
            *in\result.s = result.s
           
            ReturnStatus = #True
           
          Else
            ReturnStatus = -3
          EndIf
        Else
          ReturnStatus = -2
        EndIf
      Else
        ReturnStatus = -1
      EndIf
    Else 
      ReturnStatus = 0 
    EndIf
  Else
    ReturnStatus = 0 
  EndIf
 
  If ReturnStatus < 0 Or ReturnStatus = #True
    InternetCloseHandle_(open_handle)
  EndIf
 
  ProcedureReturn ReturnStatus
 
  ;- uncomment the following when you want To get the cookie Data - Not sure If it works Or Not.....
  ;buffer.s = Space(#MAX_PATH)
  ;headernum = 0
  ;length = Len(buffer)
  ;HttpQueryInfo_(request_handle, #HTTP_QUERY_COOKIE, @buffer, @length, @headernum)
  ;Debug buffer

EndProcedure


Procedure.s ShowWebUpdates()   
    ;Seite mit POST-Variablen aufrufen und in Gadget schreiben
    Define post.HttpPostStructure
    post\host.s      = "www.msjones.de"
    post\get_url.s   = "posttest.php";"startak.php"
    post\post_data.s = "language=chinese_simplified"
    Send_HTTP_Post(@post)
     
    OpenWindow(#Window_4, 0, 0, 1024, 768, "Online Updates", #PB_Window_SystemMenu | #PB_Window_SizeGadget |  #PB_Window_ScreenCentered | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget)

    SystemParametersInfo_(#SPI_GETWORKAREA,0,rect.RECT,0) 
    xh=WindowHeight(#Window_4)-20
    xw=WindowWidth(#Window_4)
    x=0
    
    CreateGadgetList(WindowID(#Window_4))
    WebGadget(#Gadget_8, 0, 0, xw, xh, "")
    SetGadgetItemText(#Gadget_8, #PB_Web_HtmlCode, post\result.s)

    Repeat 
      z=WaitWindowEvent()
      If z = #PB_Event_CloseWindow And EventWindow() = #Window_4
        x=1
      EndIf
      If z = #WM_SIZE
        xh=WindowHeight(#Window_4)-20
        xw=WindowWidth(#Window_4)
        ResizeGadget(#Gadget_8,-1,-1,xw,xh)
      EndIf
    Until x=1
    
    CloseWindow(#Window_4)
EndProcedure

ShowWebUpdates()
Die posttest.php sieht so aus:

Code: Alles auswählen

<?PHP
echo "<b>Get:</b><br>";
foreach ($_GET as $key => $value)
{
	echo "&nbsp;&nbsp;".$key.": ".$value."<br>";
}
echo "<br>";
echo "<b>Post:</b><br>";
foreach ($_POST as $key => $value)
{
	echo "&nbsp;&nbsp;".$key.": ".$value."<br>";
}
?>
Wenn ich da Programm jetzt normal kompiliere, funktioniers wunderbar.
Aber als Unicode-Executeable hab ich ungefähr sowas als ausgabe: "????????????????????????›???????".

Das muß doch irgendwie zu machen sein, daß das auch als Unicode-Executable funktioniert.
Kann denn keiner helfen?

Re: PostToHost mit Unicode-Executable

Verfasst: 05.11.2009 13:32
von Josh
schau mal in die hilfe unter PokeS / PeekS. damit kannst du eine umwandlung deiner unicodestrings machen.

Re: PostToHost mit Unicode-Executable

Verfasst: 05.11.2009 13:57
von MSJones
Das war schon mal ein guter Hinweis.
Ich hab jetzt die Zeile

Code: Alles auswählen

result = result + Left(buffer,bytes_read)
wie folgt geändert:

Code: Alles auswählen

              tempBuffer=AllocateMemory(1024)
              PokeS(tempBuffer,Left(buffer,bytes_read))
              result = result + PeekS(tempBuffer,1024, #PB_UTF8)
Die Strings, die fest in der PHP-Datei drinstehen bekomm ich jetzt zumindest mal richtig angezeigt.
Allerdinges bekomm ich von meiner übergebenen Variablen nur den erste Buchstaben des Namens zurückgeliefert.
An den Inhalt der Variablen ist gar nicht erst zu denken.

Re: PostToHost mit Unicode-Executable

Verfasst: 05.11.2009 15:17
von Josh
schau mal mit dem externen debugger was überhaupt im speicher steht. bin mom nicht an einer kiste mit pb, musst dich halt a bisserl spielen.

Re: PostToHost mit Unicode-Executable

Verfasst: 05.11.2009 15:23
von Josh
MSJones hat geschrieben:Allerdinges bekomm ich von meiner übergebenen Variablen nur den erste Buchstaben des Namens zurückgeliefert.
ach so. dann würde ich mal drauf tippen, dass du deine variable als unicode übergibst und die in ascii benötigt wird. du musst umgekehrt genau das gleiche spiel mit der umwandlung machen.

Re: PostToHost mit Unicode-Executable

Verfasst: 05.11.2009 15:39
von MSJones
Josh hat geschrieben:schau mal mit dem externen debugger was überhaupt im speicher steht. bin mom nicht an einer kiste mit pb, musst dich halt a bisserl spielen.
Was wo im Speicher steht?
Wenn ich mir den Buffer in der Watchlist anschaue oder mit dem externen Debugger ausgeben lasse, dann bekomm ich irgendwelche Chinesischen Schriftzeichen, die ich nicht näher deuten oder gar verstehen kann. Sieht dann so aus:
戼䜾瑥㰺戯㰾牢㰾牢㰾㹢潐瑳㰺戯㰾牢☾扮灳☻扮灳氻›挀栀椀渀攀猀攀开猀椀洀瀀氀椀昀椀攀搀㰀牢>

Wenn ich mir den result aus der Struktur nach dem PeekS anschaue, steht da drin:
<b>Get:</b><br><br><b>Post:</b><br>&nbsp;&nbsp;l:

Und selbes Problem immer noch: Es wird scheinbar nur die Variable "l" ohne Inhalt übergeben.

Bin schon fleißig am Spielen.
Glaube inzwischen folgendes herausgefunden zu haben:
Wenn der Poststring kleiner als 16 Stellen ist, wird nicht mal die erste Stelle der Variable ausgegeben.
Verlängerung der Variable auf 64 Stellen hat auch nichts gebracht -> es wird nur die erste Stelle wieder zurückgegeben.

Code: Alles auswählen

send_handle = HttpSendRequest_(request_handle,"",0,PeekS(@*in\post_data,Len(*in\post_data),#PB_Ascii),Len(*in\post_data))
Übergabe der Variablen mit Peek -> kein Erfolg

Re: PostToHost mit Unicode-Executable

Verfasst: 05.11.2009 15:58
von ts-soft
MSJones hat geschrieben: Übergabe der Variablen mit Peek -> kein Erfolg
Ohne mir den Code weiter angesehen zu haben, aber für die Übergabe ist doch wohl eher ein Poke notwendig :)

Re: PostToHost mit Unicode-Executable

Verfasst: 05.11.2009 16:28
von MSJones
ts-soft hat geschrieben:Ohne mir den Code weiter angesehen zu haben, aber für die Übergabe ist doch wohl eher ein Poke notwendig :)
Seh ich nicht so :-)
Die Variable steht ja schon in nem Speicherbereich drin. Nämlich in der Struktur.
Und von dort will ich den Inhalt dann auslesen und an HttpSendRequest weitergeben.
Also würd ich mit PeekS doch genau richtig liegen.
War vielleicht ein wenig falsch formuliert...

Re: PostToHost mit Unicode-Executable

Verfasst: 05.11.2009 16:40
von Josh
ähhh, bin mir da jetzt nicht sicher wie das läuft. aber PeekS liefert dir doch einen string zurück und du brauchst sicher einen pointer. im zweifelsfall einfach probieren. ich mach das lieber auf mehrere zeilen, dann kann man fehler leichter suchen.