AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Proxykonfiguration erzwingen
Thema durchsuchen
Ansicht
Themen-Optionen

Proxykonfiguration erzwingen

Ein Thema von Chriscode · begonnen am 29. Aug 2012 · letzter Beitrag vom 3. Sep 2012
Antwort Antwort
Chriscode

Registriert seit: 18. Aug 2009
32 Beiträge
 
#1

Proxykonfiguration erzwingen

  Alt 29. Aug 2012, 11:31
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

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
Chris

Geändert von Chriscode (29. Aug 2012 um 14:52 Uhr)
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#2

AW: Proxykonfiguration erzwingen

  Alt 29. Aug 2012, 22:51
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). ↪
  Mit Zitat antworten Zitat
Chriscode

Registriert seit: 18. Aug 2009
32 Beiträge
 
#3

AW: Proxykonfiguration erzwingen

  Alt 30. Aug 2012, 09:22
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
Chris
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#4

AW: Proxykonfiguration erzwingen

  Alt 30. Aug 2012, 15:38
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

Geändert von jensw_2000 (30. Aug 2012 um 15:46 Uhr)
  Mit Zitat antworten Zitat
Chriscode

Registriert seit: 18. Aug 2009
32 Beiträge
 
#5

AW: Proxykonfiguration erzwingen

  Alt 3. Sep 2012, 07:34
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?



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

LG,
Chris
Chris

Geändert von Chriscode ( 3. Sep 2012 um 09:34 Uhr) Grund: Code hinzugefügt
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#6

AW: Proxykonfiguration erzwingen

  Alt 3. Sep 2012, 09:38
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;

Geändert von jensw_2000 ( 3. Sep 2012 um 10:30 Uhr)
  Mit Zitat antworten Zitat
Chriscode

Registriert seit: 18. Aug 2009
32 Beiträge
 
#7

AW: Proxykonfiguration erzwingen

  Alt 3. Sep 2012, 10:01
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
Chris
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#8

AW: Proxykonfiguration erzwingen

  Alt 3. Sep 2012, 10:42
Ich arbeite nicht mit dem ChromuimEmbedded ...

Die Funktion "My_WinHttpGetIeProxyConfigForCurrentUser" kannst Du sicher auch bei Bedarf ausführen.
  Mit Zitat antworten Zitat
Chriscode

Registriert seit: 18. Aug 2009
32 Beiträge
 
#9

AW: Proxykonfiguration erzwingen

  Alt 3. Sep 2012, 10:53
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
Chris

Geändert von Chriscode ( 3. Sep 2012 um 11:40 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:34 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