Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Proxykonfiguration erzwingen (https://www.delphipraxis.net/170068-proxykonfiguration-erzwingen.html)

Chriscode 29. Aug 2012 11:31

Proxykonfiguration erzwingen
 
Hallo zusammen,
ich habe folgendes Problem, welches mich seit Tagen zum verzweifeln bringt:
Bei meinem Programm benötige ich einen Browser mit Proxyunterstützung. Bisher habe ich TWebbrowser und den EmbeddedWb genutzt. Das Problem ist, dass beide je nach Windows Konfiguration bei vielen Nutzern teilweise nicht funktionieren. Daher bin ich auf chromiumembedded umgestiegen.

Dieses Projekt funktioniert insgesamt sehr zuverlässig. Mein Problem: Die Proxyunterstützung ist zwar vorhanden, funktioniert allerdings nicht. Die automatische Übernahme des aktuellen Systemproxys wird unterstützt, das individuelle Setzen eines Proxys funktioniert jedoch nicht. Die vorgesehene Funktion (getproxyforurl) funktioniert nicht und der Programmierer zeigt leider keine Ambitionen dies zu ändern :cry:

Daher sitze ich jetzt seit Tagen vor dem Problem, wie ich es hinbekomme, Chromium über unseren Proxy laufen zu lassen? Am liebsten wäre mir eine Lösung, wodurch nicht das gesamte System beeinflusst wird, sondern nur mein Programm den Proxy nutzt.

Die Prozedur unten wäre dafür perfekt, aber: Sie beeinflusst zwar den TWebbrowser, Chromium ignoriert sie allerdings. Und das, obwohl die Internetverbindung von der Chromiumkomponente bei Monitoringprogrammen als von meinem Programm ausgehend angezeigt wird.

Ich würde mich wirklich sehr über Hilfe und Tipps freuen.

bisher genutzte Prozedur: (Quelle: hier aus dem Forum, keine Eigenentwicklung)
Code:
function TForm1.Proxy(Server: string): Boolean;
type
  INTERNET_PER_CONN_OPTION = record
    dwOption: DWORD;
    Value: record
      case Integer of
        1: (dwValue: DWORD);
        2: (pszValue: {$IFDEF DELPHI2009_UP}PWideChar{$ELSE}PAnsiChar{$ENDIF});
        3: (ftValue: TFileTime);
    end;
  end;
  LPINTERNET_PER_CONN_OPTION = ^INTERNET_PER_CONN_OPTION;
  INTERNET_PER_CONN_OPTION_LIST = record
    dwSize: DWORD;
    pszConnection: LPTSTR;
    dwOptionCount: DWORD;
    dwOptionError: DWORD;
    pOptions: LPINTERNET_PER_CONN_OPTION;
  end;
  LPINTERNET_PER_CONN_OPTION_LIST = ^INTERNET_PER_CONN_OPTION_LIST;
const
  INTERNET_PER_CONN_FLAGS = 1;
  INTERNET_PER_CONN_PROXY_SERVER = 2;
  INTERNET_PER_CONN_PROXY_BYPASS = 3;
  INTERNET_PER_CONN_AUTOCONFIG_URL = 4;
  INTERNET_PER_CONN_AUTODISCOVERY_FLAGS = 5;
  PROXY_TYPE_DIRECT = $00000001;
  PROXY_TYPE_PROXY = $00000002;
  PROXY_TYPE_AUTO_PROXY_URL = $00000004;
  PROXY_TYPE_AUTO_DETECT = $00000008;
  INTERNET_OPTION_REFRESH = 37;
  INTERNET_OPTION_PER_CONNECTION_OPTION = 75;
  INTERNET_OPTION_SETTINGS_CHANGED = 39;
var
  OptionsList: INTERNET_PER_CONN_OPTION_LIST;
  BufSize: DWORD;
  HInternet: Pointer;
  Agent: String;
begin
  Result:=false;
  BufSize:=SizeOf(OptionsList);
  OptionsList.dwSize:=BufSize;
  OptionsList.pszConnection:=nil; //nil -> LAN, sonst Verbindungsname
  OptionsList.dwOptionCount:=3; //3 Optionen werden gesetzt
  OptionsList.pOptions:=AllocMem(3*SizeOf(INTERNET_PER_CONN_OPTION));
  try
    if not assigned(OptionsList.pOptions)
      then Exit;
    OptionsList.pOptions^.dwOption:=INTERNET_PER_CONN_FLAGS;
    OptionsList.pOptions^.Value.dwValue:=PROXY_TYPE_DIRECT or PROXY_TYPE_PROXY;
    inc(OptionsList.pOptions);
    OptionsList.pOptions^.dwOption:=INTERNET_PER_CONN_PROXY_SERVER;
    OptionsList.pOptions^.Value.pszValue:=PAnsiChar(Server);
    inc(OptionsList.pOptions);
    OptionsList.pOptions^.dwOption:=INTERNET_PER_CONN_PROXY_BYPASS;
    OptionsList.pOptions^.Value.pszValue:='local';
    dec(OptionsList.pOptions,2);
    Agent:=ExtractFileName(Application.ExeName);
    hInternet:=InternetOpen({$IFDEF DELPHI2009_UP}PWideChar{$ELSE}PWideChar{$ENDIF}
                            (Agent),INTERNET_OPEN_TYPE_DIRECT,nil,nil,0);
    try //Optionen setzen
      Result:=InternetSetOption(hInternet,INTERNET_OPTION_PER_CONNECTION_OPTION,
                                @OptionsList,BufSize);
      InternetSetOption(hInternet,INTERNET_OPTION_REFRESH,nil,0);
      InternetSetOption(hInternet, INTERNET_OPTION_SETTINGS_CHANGED, nil, 0);
    finally
      InternetCloseHandle(hInternet);
    end;
  finally
    FreeMem(OptionsList.pOptions); //Speicher freigeben
  end;
end;
LG,
Chris

jensw_2000 29. Aug 2012 22:51

AW: Proxykonfiguration erzwingen
 
Das kannst Du glaube ich über einen ganz einfaches ShellExecute lösen ...

Quelle:
http://peter.sh/experiments/chromium...line-switches/

Code:
--host-rules ⊗   
Comma-separated list of rules that control how hostnames are mapped. For example: "MAP * 127.0.0.1" --> Forces all hostnames to be mapped to 127.0.0.1 "MAP *.google.com proxy" --> Forces all google.com subdomains to be resolved to "proxy". "MAP test.com [::1]:77 --> Forces "test.com" to resolve to IPv6 loopback. Will also force the port of the resulting socket address to be 77. "MAP * baz, EXCLUDE www.google.com" --> Remaps everything to "baz", except for "www.google.com". These mappings apply to the endpoint host in a net::URLRequest (the TCP connect and host resolver in a direct connection, and the CONNECT in an http proxy connection, and the endpoint host in a SOCKS proxy connection). ↪

Chriscode 30. Aug 2012 09:22

AW: Proxykonfiguration erzwingen
 
Hallo Jens,
herzlichen Dank für deine Antwort.

Ich frage mich allerdings wie ich deinen Vorschlag verwirklichen kann. Ich nutze ja die delphichromiumembedded Komponente und greife auf keine "externe" Chromium Applikation zurück.

Kann ich trotzdem die von dir vorgeschlagenen Commandlines nutzen? Wenn ja, wie?

Ich hoffe weiterhin auf eure Hilfe. Mein Problem ist einfach, dass mir ein Ansatz fehlt. Das einzige was mir einfällt ist ein Drittprogramm welches mein Programm zwingt einen Proxy zu nutzen (z.B. Proxifier) aber das muss doch auch irgendwie innerhalb des Programms gehen?

LG,
Chris

jensw_2000 30. Aug 2012 15:38

AW: Proxykonfiguration erzwingen
 
Hi,
zieht der chromium embedded denn nicht die Proxy Einstellungen aus dem Chrome Browser, so wie TWebbrowser und TEmbeddedWb die Proxy Einstellungen aus den IE Einstellungen holen?


PS:
gerade entdeckt:

https://groups.google.com/forum/?fro...ed/2rFrrvPiEww

I was able to get custom proxy handling to work by hooking the WinHttpGetIEProxyConfigForCurrentUser() api procedure in winhttp.dll. If you're interested in this technique, I can provide some code.

--Troy

Chriscode 3. Sep 2012 07:34

AW: Proxykonfiguration erzwingen
 
Diese Möglichkeit könne tatsächlich eine Lösung meines Problems sein (danke Jens!)

Hier der Code der Hook Fuktion:
http://pastebin.com/5XR44nxD

Allerdings überfordert mich dieser Hook etwas um ganz ehrlich zu sein. Wie bau ich den Hook in mein Delphi Programm? Muss der Code in eine externe DLL ausgelagert werden?



Zitat:

Zitat von jensw_2000 (Beitrag 1180707)
Hi,
zieht der chromium embedded denn nicht die Proxy Einstellungen aus dem Chrome Browser, so wie TWebbrowser und TEmbeddedWb die Proxy Einstellungen aus den IE Einstellungen holen?

Chrome Browser ist ja garnicht installiert bei jedem Nutzer :wink:

LG,
Chris

jensw_2000 3. Sep 2012 09:38

AW: Proxykonfiguration erzwingen
 
Zitat:

Zitat von Chriscode (Beitrag 1181144)
Wie bastel ich diese Lösung in mein Delphi Programm? Muss der Code in eine externe DLL ausgelagert werden?

Mir fehlt ehrlich gesagt die Zeit, um es für Dich auszutesten.

Wie die Initialisierung des Hooks läuft steht unten in der Unit.

Delphi-Quellcode:
initialization
  if (not ModuleIsPackage) // Wenn die Unit nicht in einem Package eingebunden ist ...
    and (not ModuleIsLib) // und auch nicht in einer DLL eingebunden ist ...
  then // ... also in deiner Applikation hängt ...
  begin
    Hook_WinHttpGetIeProxyConfigForCurrentUser; // dann initialisiere den Hook beim Laden der unit.
  end;

Chriscode 3. Sep 2012 10:01

AW: Proxykonfiguration erzwingen
 
Danke für die Erklärung. Demnach habe ich den Hook direkt in das Programm eingebaut und es funktioniert. Ich musste nur DWORD durch SIZE_T ersetzen bei "NumberOfBytes".

Erlaube mir bitte noch eine letzte Frage: Kann man diesen Hook auch "on the fly" aufrufen? Sprich das ich die Proxysettings nicht nur einmal beim Start über initialization aufrufen sondern während des Betriebs ändern kann?

LG,
Chris

jensw_2000 3. Sep 2012 10:42

AW: Proxykonfiguration erzwingen
 
Ich arbeite nicht mit dem ChromuimEmbedded ...

Die Funktion "My_WinHttpGetIeProxyConfigForCurrentUser" kannst Du sicher auch bei Bedarf ausführen.

Chriscode 3. Sep 2012 10:53

AW: Proxykonfiguration erzwingen
 
Mein Problem ist jetzt einfach, dass mir das Wissen zu Hooks fehlt. Und zusätzlich handelt es sich anscheinend um einen sehr speziellen Hook, ich finde immer nur Anleitungen zu Tastatur / Maus Hooks die völlig anders geladen werden.

Im Prinzip ist der Hook ja voll funktionsfähig. Ich müsste jetzt quasi nur wissen wie ich diesen aktivieren und wieder beenden kann während der Laufzeit.

Sprich ich würde gerne Hook_WinHttpGetIeProxyConfigForCurrentUser nicht über initialization sondern während der Laufzeit aufrufen. Wie kann ich das anstellen?

Edit: Sollte es sinnvoller sein den Hook beim Programmstart zu initialisieren und nur die Funktion My_WinHttpGetIeProxyConfigForCurrentUser während der Laufzeit neu aufzurufen, wäre natürlich auch das möglich. Auch hier weiß ich allerdings nicht wie ich die Funktion aufrufen kann (Funktion ist ja nicht deklariert und daher meinem Programm unbekannt) :(

LG,
Chris


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:49 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