Standard Browser des Systems herausfinden
-
Hi
Ich ich suche nach einer zuverlässigen Möglichkeit den Standardbrowser eines Windows Systems zu öffnen.
Problem ist dabei folgendes:
ShellExecuteA (NULL, "open", "http://www.google.at", NULL, NULL, SW_HIDE);
Das funktioniert super für URLs, aber bei Files funktioniert das nicht mehr zuverlässig.
ShellExecuteA (NULL, "open", "C:\\index.html", NULL, NULL, SW_HIDE);
Wenn nun Frontpage oder whatever für *.html files festgelegt ist wird eben diese Programm geöffnet und nicht der Browser.
Erster Gedanke war nun das muss doch in der Registry zu finden sein:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.html\UserChoice HKEY_CLASSES_ROOT\http\shell\open\command HKEY_CLASSES_ROOT\htmlfile\shell\open\command ...
Die sind alle unbrauchbar. Zumindest stimmen sie nicht bei mir (Win Vista Business 64bit)
Letzte Idee die mir dann noch kam war "FindExecutableA"
FindExecutableA ("http://www.google.at", NULL, temp);
Die Funktion scheint aber für URLs nicht zu funktionieren, zumindest bekomme ich nen leeren string zurück
Im IRC wurde ich dann noch auf folgenden Beitrag gestoßen:
http://forum.fachinformatiker.de/basic/86346-standard-browser-dos-aufrufen.htmlHier wird
rundll32 url.dll,FileProtocolHandler "http://www.irgendwas.de"
als Lösung angepriesen. Leider habe ich 0 Plan wie ich das verwenden soll. Wenn mir da wer weiterhelfen könnte wäre das super
Wenn wer einen anderen Weg kennt wie ich den Standardbrowser herausfinde/geöffnet bekomme nehm ich das auch gern
yogg
-
Probiers einfach mal mit:
ShellExecuteA (NULL, "open", "file:///C:/index.html", NULL, NULL, SW_HIDE);
-
Das klappt leider auch nicht. Wenn *.html auf ein anderes Programm gelinkt (in meinem fall Notepad++) ist, dann macht er es weiterhin mit diesem auf
yogg
-
Der Standardbrowser wird in der Registry eingetragen.
Unter: HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\(Default-Wert) findet man den System-weiten Standardbrowser (z.B. "iexplore.exe")
Unter HKEY_CURRENT_USER\Software\Clients\StartMenuInternet\(Default-Wert)
findet man den Standardbrowser des aktuellen Benutzers (z.B. "firefox.exe")Wo der Browser ("firefox.exe" / "iexplore.exe" / ...) nun genau sitzt, findet man in dem entsprechenden Eintrag unter:
HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\XXX\shell\open\command
...wobei XXX dann "firefox.exe" bzw. "iexplore.exe" ist.Vorgehensweise ist also:
- Wert unter HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\(Default-Wert) auslesen
- Anschließend prüfen ob HKEY_CURRENT_USER\Software\Clients\StartMenuInternet\(Default-Wert) nicht leer ist und in dem Falle diesen Wert als Default-Browser nehmen
- Unter HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\XXX\shell\open\command nachschauen wie man den entsprechenden Browser aufrufen soll...
-
Man könnte den IE oder anderen Brwoser auch an seiner Verknüfung mit .html Dateien ermitteln.
Dazu kann man AssocQueryString verwenden.
Dazu sind keine Kenntnisse der Registry notwendig.
http://msdn.microsoft.com/en-us/library/bb773471(VS.85).aspx
-
Danke für die hilfe
@ Martin Richter
DWORD dwsize = 255; char buffer[255]; memset (buffer, 0, sizeof (buffer)); HRESULT result = AssocQueryStringA (ASSOCF_INIT_DEFAULTTOSTAR, ASSOCSTR_COMMAND, ".html", NULL, buffer, &dwsize); printf ("Result: %X\n", result); printf ("Laenge: %d\n", dwsize); printf ("Rueckgabe: %s\n", buffer);
Das funktioniert zwar fein, löst mein Problem nur leider nicht. Wenn Frontpage an *.html dateien gebunden ist, dann liefert mir die funktion Frontpage zurück.
@ geeky
Die Einträge sind fein bis auf einen kleinen Schönheitsfehler.
HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet*IEXPLORE.EXE*\shell\open\command
ist vorhandenHKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet*FIREFOX.EXE*
den Schlüssel gibt es nicht (bei mir)Aber über
HKEY_CURRENT_USER\Software\Clients\StartMenuInternet\
bekomm ich jetzt wenigstens raus was der Standardbrowser ist. Jetzt muss ich nur noch die zugehörige *.exe finden, und hoffe das der KEY auf allen maschinen ab 2000\XP existiert und auch stimmt.Ich teste das mal
yogg
-
TCHAR szApp[MAX_PATH]; DWORD cch = _countof(szApp); AssocQueryString(0, ASSOCSTR_EXECUTABLE, TEXT("http"), TEXT("open"), szApp, &cch);
-
Danke Mox das haut einwandfrei hin
yogg