Frage

Seit Jahren Ich habe mit ShellExecute () API, um den Standard-Webbrowser von innerhalb meiner Anwendungen zu starten. Wie folgt aus:

ShellExecute( hwnd, _T("open"), 
    _T("http://www.winability.com/home/"), 
    NULL, NULL, SW_NORMAL );

Es wird daran gearbeitet, bis ein paar Wochen gut, wenn Google seinen Browser Chrome veröffentlicht. Nun, wenn Chrome auf dem Computer installiert sind, die ShellExecute API nicht mehr öffnet eine Webseite.

Hat jemand noch herausgefunden, wie dieses Problem zu lösen? (Short von Chrome Erkennen und Anzeigen einer Nachricht, die Benutzer sagen, es ist Chrome Schuld?)

EDIT: der Code von Sergey bereitgestellt scheint zu stehen, also habe ich es als „die“ Antwort akzeptiert. Abgesehen davon, dass ich nicht mag, den Anruf zu WinExec: MSDN liest, dass WinExec nur mit 16-Bit-Anwendungen auf Kompatibilität vorgesehen ist. IOW, kann es stoppen mit jedem Service Pack arbeiten. Ich habe es nicht ausprobiert, aber ich wäre nicht überrascht, wenn es bereits aufgehört hat mit Windows x64 arbeiten, da es keine 16-Bit-Anwendungen überhaupt nicht unterstützt. Anstatt also WinExec, ich werde ShellExecute verwenden, mit dem Weg aus der Registrierung genommen wie Sergeys Code der Fall ist, und die URL als Argument. Vielen Dank!

War es hilfreich?

Lösung

Hier ist der Code, der in allen Browsern funktioniert. Der Trick ist, WinExec zu nennen, wenn ShellExecute fehlschlägt.

HINSTANCE GotoURL(LPCTSTR url, int showcmd)
{
    TCHAR key[MAX_PATH + MAX_PATH];

    // First try ShellExecute()
    HINSTANCE result = 0;

    CString strURL = url;

    if ( strURL.Find(".htm") <0 && strURL.Find("http") <0 )
        result = ShellExecute(NULL, _T("open"), url, NULL, NULL, showcmd);

    // If it failed, get the .htm regkey and lookup the program
    if ((UINT)result <= HINSTANCE_ERROR) {

        if (GetRegKey(HKEY_CLASSES_ROOT, _T(".htm"), key) == ERROR_SUCCESS) {
            lstrcat(key, _T("\\shell\\open\\command"));

            if (GetRegKey(HKEY_CLASSES_ROOT,key,key) == ERROR_SUCCESS) {
                TCHAR *pos;
                pos = _tcsstr(key, _T("\"%1\""));
                if (pos == NULL) {                     // No quotes found
                    pos = strstr(key, _T("%1"));       // Check for %1, without quotes
                    if (pos == NULL)                   // No parameter at all...
                        pos = key+lstrlen(key)-1;
                    else
                        *pos = '\0';                   // Remove the parameter
                }
                else
                    *pos = '\0';                       // Remove the parameter

                lstrcat(pos, _T(" \""));
                lstrcat(pos, url);
                lstrcat(pos, _T("\""));
                result = (HINSTANCE) WinExec(key,showcmd);
            }
        }
    }

    return result;
}

Andere Tipps

Nach Anhörung Berichte über ShellExecute auf eine Minderheit von Systemen versagt, implementiert ich eine Funktion ähnlich dem Beispiel von Sergey Kornilov gegeben. Das war vor etwa einem Jahr. Gleiche Prämisse -. Führen Sie eine direkte HKCR Lookup der HTM-Datei-Handler

Es stellt sich jedoch heraus, dass einige Nutzer haben Redakteure (zum Beispiel UltraEdit), die sie ‚offen‘ zu HTM-Dateien zu registrieren (anstelle von ‚Bearbeiten‘ sie). So , wenn ShellExecute fehlschlägt, werden diese sekundären Verfahren auch in diesen Fällen fehlschlagen. Es öffnet sich der Editor, wie die Shell-Verband errantly anweist.

So sollte der Benutzer die HTTP-Handler anstelle oder zumindest in Präferenz der HTML-Handler.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top