PostToHost mit Unicode-Executable
PostToHost mit Unicode-Executable
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?
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
So, ich hab mal ein kleines Beispiel gebaut, mit dem jeder mal mein Problem nachvollziehen kann.
Also in der PB-Datei steht:
Die posttest.php sieht so aus:
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?
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()Code: Alles auswählen
<?PHP
echo "<b>Get:</b><br>";
foreach ($_GET as $key => $value)
{
echo " ".$key.": ".$value."<br>";
}
echo "<br>";
echo "<b>Post:</b><br>";
foreach ($_POST as $key => $value)
{
echo " ".$key.": ".$value."<br>";
}
?>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
schau mal in die hilfe unter PokeS / PeekS. damit kannst du eine umwandlung deiner unicodestrings machen.
Re: PostToHost mit Unicode-Executable
Das war schon mal ein guter Hinweis.
Ich hab jetzt die Zeile wie folgt geändert:
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.
Ich hab jetzt die Zeile
Code: Alles auswählen
result = result + Left(buffer,bytes_read)Code: Alles auswählen
tempBuffer=AllocateMemory(1024)
PokeS(tempBuffer,Left(buffer,bytes_read))
result = result + PeekS(tempBuffer,1024, #PB_UTF8)
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
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
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.MSJones hat geschrieben:Allerdinges bekomm ich von meiner übergebenen Variablen nur den erste Buchstaben des Namens zurückgeliefert.
Re: PostToHost mit Unicode-Executable
Was wo im Speicher steht?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.
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> 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))- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: PostToHost mit Unicode-Executable
Ohne mir den Code weiter angesehen zu haben, aber für die Übergabe ist doch wohl eher ein Poke notwendigMSJones hat geschrieben: Übergabe der Variablen mit Peek -> kein Erfolg
Re: PostToHost mit Unicode-Executable
Seh ich nicht sots-soft hat geschrieben:Ohne mir den Code weiter angesehen zu haben, aber für die Übergabe ist doch wohl eher ein Poke notwendig
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
ä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.