Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.08.2009, 17:29
Inqizitor Inqizitor вне форума
Прохожий
 
Регистрация: 04.08.2009
Сообщения: 8
Репутация: 10
По умолчанию WideChar и проблемы кодировки

Пытаюсь сделать вот что:
Есть такая строка:
Код:
proxyserver := proxyinfo^.lpszproxy;
Edit5.Text:=proxyserver;
Тип proxyserver: string; 
lpszproxy: widechar.
Edit присваиваем Widechar. В результате в Edit получаются квадраты. Как сделать так, чтобы отображалось нормально?

Пытался делать

Код:
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
- ругается как "Incompatible types: 'Char' and 'PWideChar'".

Обьявил 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  
Старый 04.08.2009, 18:50
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,053
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

В 2009 тип String - это Unicode-строка. Соответсвенно, тебе надо вообщето конвертировать в Unicode. Кстати, а ты посмотри, что у тебя в данных реально лежит (через watch отладчика).
Ответить с цитированием
  #3  
Старый 04.08.2009, 20:13
Inqizitor Inqizitor вне форума
Прохожий
 
Регистрация: 04.08.2009
Сообщения: 8
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
В 2009 тип String - это Unicode-строка. Соответсвенно, тебе надо вообщето конвертировать в Unicode. Кстати, а ты посмотри, что у тебя в данных реально лежит (через watch отладчика).
Н-да, вообще что-то непонятное:

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  
Старый 04.08.2009, 20:28
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,053
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Мда... на первый взгляд чушь какая-то...
А откуда ты получаешь информацию?
Ответить с цитированием
  #5  
Старый 04.08.2009, 20:35
Inqizitor Inqizitor вне форума
Прохожий
 
Регистрация: 04.08.2009
Сообщения: 8
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Мда... на первый взгляд чушь какая-то...
А откуда ты получаешь информацию?
Просто хочу стандартный прокси IE считать. А потом в строковую забить.
Прочитал про метод lpszproxy - вот им и сделал и хотел на результат посмотреть, а оно эвон как .
Ответить с цитированием
  #6  
Старый 05.08.2009, 00:37
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,053
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Полный код давай. Ты вообще смотришь что тебе функция возвращает. У тебя прокси-то настроен? А то может там и нет никаких данных, а ты пытаешься их читать... DNS это не прокси
Ответить с цитированием
  #7  
Старый 05.08.2009, 12:09
Inqizitor Inqizitor вне форума
Прохожий
 
Регистрация: 04.08.2009
Сообщения: 8
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Полный код давай. Ты вообще смотришь что тебе функция возвращает. У тебя прокси-то настроен? А то может там и нет никаких данных, а ты пытаешься их читать... DNS это не прокси
Данные есть: Адрес и порт. (в connections->lan settings).

Код такой:
Код:
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  
Старый 05.08.2009, 13:30
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,053
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

У меня вот так работает:

Код:
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  
Старый 05.08.2009, 13:46
Inqizitor Inqizitor вне форума
Прохожий
 
Регистрация: 04.08.2009
Сообщения: 8
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
У меня вот так работает:

Код:
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.
А в Edit выводит в виде 168.0.0.9:80?
М-да, значит в 2009 что-то они намудрили, т.к. у меня с этим кодом выводит 〮㘮㠺㘮㠺0〮㘮〮㘮㠺0〮㘮
Ответить с цитированием
  #10  
Старый 05.08.2009, 15:18
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,053
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну выводит другой адрес. Тот, который я указал в настройках...
Посмотри по справке функции конвертирования. StrPas переводит PChar в AnsiString. Найди функцию с правильным целевым типом. Или попробуй конвертнуть сначала в AnsiString, а потом уже ее присвоить Edit'у.
Ответить с цитированием
  #11  
Старый 05.08.2009, 20:35
Inqizitor Inqizitor вне форума
Прохожий
 
Регистрация: 04.08.2009
Сообщения: 8
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Ну выводит другой адрес. Тот, который я указал в настройках...
Посмотри по справке функции конвертирования. StrPas переводит PChar в AnsiString. Найди функцию с правильным целевым типом. Или попробуй конвертнуть сначала в AnsiString, а потом уже ее присвоить Edit'у.
Вот решил проблему - код рабочий:
Код:
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  
Старый 05.08.2009, 21:14
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,053
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Во-во. Про то я и говорил, что надо использовать AnsiString.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:25.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter