Domanda

Da anni utilizzo l'API ShellExecute () per avviare il browser Web predefinito dalle mie applicazioni. In questo modo:

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

Ha funzionato bene fino a un paio di settimane fa, quando Google ha rilasciato il suo browser Chrome. Ora, se Chrome è installato sul computer, l'API ShellExecute non apre più una pagina Web.

Qualcuno ha ancora capito come risolvere questo problema? (A corto di rilevare Chrome e visualizzare un messaggio che dice all'utente che è colpa di Chrome?)

EDIT: il codice fornito da Sergey sembra funzionare, quindi l'ho accettato come " il " risposta. Solo che non mi piace la chiamata a WinExec: MSDN legge che WinExec è fornito solo per la compatibilità con le applicazioni a 16 bit. IOW, potrebbe smettere di funzionare con qualsiasi Service Pack. Non l'ho provato, ma non sarei sorpreso se ha già smesso di funzionare con Windows x64, poiché non supporta affatto le applicazioni a 16 bit. Quindi, invece di WinExec, userò ShellExecute, con il percorso preso dal registro come fa il codice di Sergey e l'URL come argomento. Grazie!

È stato utile?

Soluzione

Ecco il codice che funziona su tutti i browser. Il trucco è chiamare WinExec se ShellExecute fallisce.

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;
}

Altri suggerimenti

Dopo aver ascoltato segnalazioni di errori ShellExecute su una minoranza di sistemi, ho implementato una funzione simile all'esempio fornito da Sergey Kornilov. Questo è successo circa un anno fa. Stessa premessa - Esegui una ricerca HKCR diretta del gestore di file .HTM.

Tuttavia, alcuni utenti hanno editor (ad esempio UltraEdit) che si registrano per aprire i file .htm (invece di "modificarli"). Pertanto, se ShellExecute fallisce, anche in questo caso fallirà questo metodo secondario. Apre l'editor, come indica erroneamente l'associazione della shell.

Pertanto, l'utente dovrebbe utilizzare invece il gestore HTTP, o almeno in preferenza del gestore HTML.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top