|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
WideChar и проблемы кодировки
Пытаюсь сделать вот что:
Есть такая строка: Код:
proxyserver := proxyinfo^.lpszproxy; Edit5.Text:=proxyserver; Тип proxyserver: string; lpszproxy: widechar. Пытался делать Код:
proxyserver :=AnsiString(proxyinfo^.lpszproxy); Edit5.Text:=proxyserver; Вместо квадратов получаются вопросы. Функцию типа Widechartostr нашел. В примере сказано, что: http://www.delphibasics.co.uk/RTL.as...deCharToString Код:
var wideCharArray : array[0..5] of WideChar; myString : String; begin // Set up our WideChar array wideCharArray[0] := 'H'; wideCharArray[1] := 'e'; wideCharArray[2] := 'l'; wideCharArray[3] := 'l'; wideCharArray[4] := 'o'; wideCharArray[5] := #0; // Terminates WideChar strings // Copy to a normal string myString := WideCharToString(wideCharArray); // Show what the copy gave ShowMessage(myString); end; После попыток что-то сделать оказалось, что на вариант: Код:
Buffer2[0]:=proxyinfo^.lpszproxy; где Buffer2[0]:array[0..5] of WideChar Обьявил Buffer2:PWideChar и присвоил: Код:
var Buffer4:PWideChar; proxyserver:string; . . Buffer4:=proxyinfo^.lpszproxy; proxyserver := WideCharToString(Buffer4); Edit5.Text:=proxyserver; Всё компилируется, но в окне Edit выводится "ㄱ⸴㈱⸷㐲⸶㘳㠺㠰0ㄱ⸴㈱⸷㐲⸶㘳㠺㠰0₰" вместо цифр и букв. Версия Delphi 2009. Помогите, пожалуйста! lmikle: пользуемся тегами!!! Последний раз редактировалось Inqizitor, 04.08.2009 в 18:58. |
#2
|
|||
|
|||
В 2009 тип String - это Unicode-строка. Соответсвенно, тебе надо вообщето конвертировать в Unicode. Кстати, а ты посмотри, что у тебя в данных реально лежит (через watch отладчика).
|
#3
|
|||
|
|||
Цитата:
Buffer4:=proxyinfo^.lpszproxy; и значение Buffer4 после этой операции: '?'#$2E34'?'#$2E37'?'#$2E36'???0?'#$2E34'?'#$2E37' ?'#$2E36'???0'#$20B0'?????????'#$20B8'???????????? ????'#$B00'?????'#$368'?????????'#$C65'??????????? ???'#$A54'??????????????'#$2E74'??????'#$2E74'??'# $606'?????'#$2E74'??'#$B65#$E00'???????'#$608'???? ???????'#$A60'??????'#$600'??????с?????'#$802'???? '#$600'????????? Вместо вопросов - квадраты. Но они сюда не копируются . А должно быть 114.127.246.36:8080 (например). |
#4
|
|||
|
|||
Мда... на первый взгляд чушь какая-то...
А откуда ты получаешь информацию? |
#5
|
|||
|
|||
Цитата:
Прочитал про метод lpszproxy - вот им и сделал и хотел на результат посмотреть, а оно эвон как . |
#6
|
|||
|
|||
Полный код давай. Ты вообще смотришь что тебе функция возвращает. У тебя прокси-то настроен? А то может там и нет никаких данных, а ты пытаешься их читать... DNS это не прокси
|
#7
|
|||
|
|||
Цитата:
Код такой: Код:
procedure TForm2.Button1Click(Sender: TObject); var PIInfo : PInternetProxyInfo; proxyinfo: pinternetproxyinfo; len: longword; proxyserver: string; Buffer2: array[0..5000] of PWideChar; Buffer4: PWideChar; begin Edit5.Text:=''; len := 4096; getmem(proxyinfo, len); try if internetqueryoption(nil, internet_option_proxy, proxyinfo, len) then if proxyinfo^.dwaccesstype = internet_open_type_proxy then begin //proxyserver := proxyinfo^.lpszproxy; //AnsiString(proxyinfo^.lpszproxy) Buffer4:=proxyinfo^.lpszproxy; proxyserver := WideCharToString(Buffer4); Edit5.Text:=proxyserver; end finally freemem(proxyinfo); end; Данные: Адрес 168.0.0.9 Порт 80. |
#8
|
|||
|
|||
У меня вот так работает:
Код:
uses WinInet; procedure TForm1.Button1Click(Sender: TObject); var proxyinfo: pinternetproxyinfo; len: longword; begin Edit5.Text:=''; len := 4096; getmem(proxyinfo, len); try if internetqueryoption(nil, internet_option_proxy, proxyinfo, len) then if proxyinfo^.dwaccesstype = internet_open_type_proxy then begin Edit5.Text := StrPas(proxyinfo^.lpszproxy); end finally freemem(proxyinfo); end; end; правда, это на Д7. |
#9
|
|||
|
|||
Цитата:
М-да, значит в 2009 что-то они намудрили, т.к. у меня с этим кодом выводит 〮㘮㠺㘮㠺0〮㘮〮㘮㠺0〮㘮 |
#10
|
|||
|
|||
Ну выводит другой адрес. Тот, который я указал в настройках...
Посмотри по справке функции конвертирования. StrPas переводит PChar в AnsiString. Найди функцию с правильным целевым типом. Или попробуй конвертнуть сначала в AnsiString, а потом уже ее присвоить Edit'у. |
#11
|
|||
|
|||
Цитата:
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, wininet, StdCtrls; type INTERNETPROXYINFO = record dwAccessType: DWORD; lpszProxy: PAnsiChar; lpszProxyBypass: PAnsiChar; end; PInetProxyInfo = ^INTERNETPROXYINFO; TForm1 = class(TForm) Edit1: TEdit; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure GetProxyData(var ProxyEnabled: boolean; var ProxyServer: ansistring; var ProxyPort: integer); var ProxyInfo: PInetProxyInfo; Len: LongWord; i, j: integer; begin Len := 4096; ProxyEnabled := false; GetMem(ProxyInfo, Len); try if InternetQueryOptionA(nil, INTERNET_OPTION_PROXY, ProxyInfo, Len) then if ProxyInfo^.dwAccessType = INTERNET_OPEN_TYPE_PROXY then begin ProxyEnabled:= True; ProxyServer := ProxyInfo^.lpszProxy; //showmessage('!'); end finally FreeMem(ProxyInfo); end; if ProxyEnabled and (ProxyServer <> '') then begin i := Pos('http=', ProxyServer); if (i > 0) then begin Delete(ProxyServer, 1, i+5); j := Pos(';', ProxyServer); if (j > 0) then ProxyServer := Copy(ProxyServer, 1, j-1); end; i := Pos(':', ProxyServer); if (i > 0) then begin ProxyPort := StrToIntDef(Copy(ProxyServer, i+1, Length(ProxyServer)-i), 0); ProxyServer := Copy(ProxyServer, 1, i-1) end end; end; procedure TForm1.FormCreate(Sender: TObject); var pren: boolean; s: ansistring; p: integer; begin GetProxyData(pren, s, p); edit1.Text:=(s+':'+inttostr(p)); end; end. |
#12
|
|||
|
|||
Во-во. Про то я и говорил, что надо использовать AnsiString.
|