Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi GetProxyInformation unter Delphi 2009 (https://www.delphipraxis.net/131010-getproxyinformation-unter-delphi-2009-a.html)

GPRSNerd 17. Mär 2009 13:54


GetProxyInformation unter Delphi 2009
 
Hi,

bisher habe ich unter Delphi 2007 den Code aus der Codelib zum Auslesen der Proxy-Informationen benutzt.
Unter Delphi 2009 kompiliert das auch ohne Hinweise, Warnungen etc., gibt aber in GetProxyInformation immer nur Leerstrings oder Müll zurück.
Ein Wechsel auf InternetQueryOptionW brachte keine Verbesserung.

Hat irgendjemand damit schon Erfolge bei der Migration nach Delphi 2009 erzielt?

Gruß,
Stefan

RWarnecke 17. Mär 2009 15:44

Re: GetProxyInformation unter Delphi 2009
 
Hast Du auch die anderen Typen im Sourcecode angepasst ? String zu WideString u.s.w.

DeddyH 17. Mär 2009 15:49

Re: GetProxyInformation unter Delphi 2009
 
Und auf InternetQueryOptionW umgestellt?

GPRSNerd 17. Mär 2009 15:52

Re: GetProxyInformation unter Delphi 2009
 
Sorry, my bad.
In ersten Post meinte ich natürlich InternetQueryOptionW und nicht GetProxyInformationW.

In der Kern-Funktion GetProxyInformation ist nicht viel zum Umstellen auf Widestring etc.:
Delphi-Quellcode:
function GetProxyInformation: WideString;
var
  ProxyInfo: PInternetProxyInfo;
  Len: LongWord;
begin
  Result := '';
  Len := 4096;
  GetMem(ProxyInfo, Len);
  try
    if InternetQueryOptionW(nil, INTERNET_OPTION_PROXY, ProxyInfo, Len) then
      if ProxyInfo^.dwAccessType = INTERNET_OPEN_TYPE_PROXY then
      begin
        Result := ProxyInfo^.lpszProxy;
      end;
  finally
    FreeMem(ProxyInfo);
  end;
  //ShowMessage(result);
end;
Der Output mit dem Showmessage am Ende ergibt zig nicht darstellbare Zeichen.

GPRSNerd 17. Mär 2009 16:01

Re: GetProxyInformation unter Delphi 2009
 
Durch ein Outputdebugstring habe ich mir mal das Result in Ascii und Hex ausgeben lassen:

00000000 16:59:34.932 [4040] ????????????????‰???????????????????????????>
00000001 16:59:34.932 [4040] 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F893F3F3F3F3F3F3F3F 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3E

Da kommt also wirklich nur Müll zurück, das Ergebnis der InternetQueryOptionW ist aber true.

DeddyH 17. Mär 2009 16:11

Re: GetProxyInformation unter Delphi 2009
 
Unter Delphi 2007 gibt die Widestring-Variante allerdings einen gültigen String aus.
Zitat:

---------------------------
Projecttest
---------------------------
http=10.20.30.40:1024 ftp=20.30.40.50:8080
---------------------------
OK
---------------------------
So habe ich es zum Testen auch im IE eingetragen.

GPRSNerd 17. Mär 2009 16:16

Re: GetProxyInformation unter Delphi 2009
 
Hmmmmm, seltsam.
Ich habe eine ähnliche Proxy-Konfig auf meinem Firmen-Rechner.
Kannst du mir zur Kontrolle mal deine D2007-Exe schicken oder attachen?

Bernhard Geyer 17. Mär 2009 16:17

Re: GetProxyInformation unter Delphi 2009
 
Schaut euch mal die Übersetzung in WinInet.pas an:

Delphi-Quellcode:
  INTERNET_PROXY_INFO = record
    dwAccessType: DWORD;      { dwAccessType - INTERNET_OPEN_TYPE_DIRECT, INTERNET_OPEN_TYPE_PROXY, or }
    lpszProxy: LPCTSTR;       { lpszProxy - proxy server list }
    lpszProxyBypass: LPCTSTR; { lpszProxyBypass - proxy bypass list }
  end;
und in Windows.pas

Delphi-Quellcode:
LPCTSTR = PAnsiChar;
Vermutlich ist das der Fehler das die übersetzung des Records nicht korrekt ist und noch auf Ansi steht.

GPRSNerd 17. Mär 2009 16:28

Re: GetProxyInformation unter Delphi 2009
 
Das unter D2007 kompilierte Testprogramm gibt bei mir korrekt den http/Proxy aus: 172.20.10.3:8080, danke Detlef!
Dann kann ich mich also auf D2009 als Quelle des Problems konzentrieren.

Ich definiere mir gerade mal ein paar neue Types für die Widechar-Variante aus der Wininet.pas. Mal sehen, ob das was bringt...

GPRSNerd 17. Mär 2009 16:37

Re: GetProxyInformation unter Delphi 2009
 
So, indem ich den Record auf PAnsiChars umstelle funktionierts:

Delphi-Quellcode:
type
  PInternetProxyInfoA = ^INTERNET_PROXY_INFOA;
  INTERNET_PROXY_INFOA = record
    dwAccessType: DWORD;        { dwAccessType - INTERNET_OPEN_TYPE_DIRECT, INTERNET_OPEN_TYPE_PROXY, or }
    lpszProxy: PAnsiChar;       { lpszProxy - proxy server list }
    lpszProxyBypass: PAnsiChar; { lpszProxyBypass - proxy bypass list }
  end;

function GetProxyInformation: AnsiString;
var
  ProxyInfo: PInternetProxyInfoA;
  Len: DWORD;
begin
  Result := '';
  Len := 4096;
  GetMem(ProxyInfo, Len);
  try
    if InternetQueryOptionW(nil, INTERNET_OPTION_PROXY, ProxyInfo, Len) then
    begin
      if ProxyInfo^.dwAccessType = INTERNET_OPEN_TYPE_PROXY then
      begin
        Result := ProxyInfo^.lpszProxy;
      end;
    end;
  finally
    FreeMem(ProxyInfo);
  end;
end;
Danke an Bernhard und Detlef!

DeddyH 17. Mär 2009 16:40

Re: GetProxyInformation unter Delphi 2009
 
Macht es denn dann Sinn, die Unicode-Version von InternetQueryOption aufzurufen, um dann doch Ansi-Strings zurückzubekommen? Dann könnte man auch gleich InternetQueryOptionA verwenden, oder habe ich gerade einen Knick im Hirn?

GPRSNerd 17. Mär 2009 16:45

Re: GetProxyInformation unter Delphi 2009
 
Hast natürlich recht, aber die Variante mit InternetQueryOption funktioniert so nicht, da das standardmäßig die Widestring-Variante ist.
Man muss den Code also explizit auf Ansi umstellen, also nicht nur InternetQueryOptionA, sondern auch PInternetProxyInfoA:

Delphi-Quellcode:
function GetProxyInformation: AnsiString;
var
  ProxyInfo: PInternetProxyInfoA;
  Len: LongWord;
begin
  Result := '';
  Len := 4096;
  GetMem(ProxyInfo, Len);
  try
    if InternetQueryOptionA(nil, INTERNET_OPTION_PROXY, ProxyInfo, Len) then
    begin
      if ProxyInfo^.dwAccessType = INTERNET_OPEN_TYPE_PROXY then
      begin
        Result := ProxyInfo^.lpszProxy;
      end;
    end;
  finally
    FreeMem(ProxyInfo);
  end;
end;

DeddyH 17. Mär 2009 16:46

Re: GetProxyInformation unter Delphi 2009
 
OK, das ist einzusehen.

GPRSNerd 17. Mär 2009 21:01

Re: GetProxyInformation unter Delphi 2009
 
Nochmal zur Vervollständigung:

In meiner Windows.pas (Delphi 2009, Update 2) ist LPCTSTR folgendermaßen definiert:

Delphi-Quellcode:
LPCTSTR = {$IFDEF UNICODE}PWideChar{$ELSE}PAnsiChar{$ENDIF};
Das sollte also eigentlich sowohl mit D2007, als auch mit D2009 funktionieren.
Tuts aber leider nicht, da bei Benutzen von PWideChars und InternetQueryOptionW das oben beschriebene Problem auftritt und unter D2009 nur Müll zurückgegeben wird. Der Fehler muss also noch irgendwo anders sein, aber egal, da mir die Ansi-Variante ausreicht.

GPRSNerd 18. Mär 2009 09:47

Re: GetProxyInformation unter Delphi 2009
 
Ich habe mal einen Report in Quality Central für die UNICODE-Variante unter Delphi 2009 erstellt, zu finden unter:
http://qc.embarcadero.com/wc/qcmain.aspx?d=72305

GPRSNerd 18. Sep 2009 12:31

Re: GetProxyInformation unter Delphi 2009
 
Der Issue wurde (angeblich) in D2010 gefixt:

Resolution Full Name Date Changed Build
Fixed QC<->Raid Replicator Account 8/27/2009 5:14:37 PM 14.0.3448.21948
Comment: Status pulled automatically from the internal system

Muss ich mal ausprobieren, wenn ich auf D2010 upgrade...


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz