Question

Pendant des années, j'ai utilisé l'API ShellExecute () pour lancer le navigateur Web par défaut à partir de mes applications. Comme ceci:

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

Cela fonctionnait bien jusqu'à il y a quelques semaines, lorsque Google a publié son navigateur Chrome. Désormais, si Chrome est installé sur l'ordinateur, l'API ShellExecute n'ouvre plus de page Web.

Quelqu'un at-il encore compris comment résoudre ce problème? (Vous ne détectez pas Chrome et affichez un message indiquant à l'utilisateur que c'est la faute de Chrome?)

EDIT: le code fourni par Sergey semble fonctionner, je l’ai donc accepté comme étant "le" réponse. Sauf que je n'aime pas l'appel à WinExec: MSDN lit que WinExec est fourni uniquement pour assurer la compatibilité avec les applications 16 bits. IOW, il peut ne plus fonctionner avec aucun Service Pack. Je ne l'ai pas essayé, mais je ne serais pas surpris qu'il ait déjà cessé de fonctionner avec Windows x64, car il ne prend pas du tout en charge les applications 16 bits. Donc, au lieu de WinExec, je vais utiliser ShellExecute, avec le chemin emprunté dans le registre, comme le code de Sergey, et l'URL comme argument. Merci!

Était-ce utile?

La solution

Voici le code qui fonctionne sur tous les navigateurs. L'astuce consiste à appeler WinExec si ShellExecute échoue.

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

Autres conseils

Après avoir entendu parler de l'échec de ShellExecute sur une minorité de systèmes, j'ai mis en œuvre une fonction similaire à l'exemple de Sergey Kornilov. Il y a environ un an. Même principe - Effectuez une recherche directe HKCR du gestionnaire de fichiers .HTM.

Cependant, il se trouve que certains utilisateurs ont des éditeurs (par exemple, UltraEdit) qui s'enregistrent pour ouvrir les fichiers .htm (au lieu de les "éditer"). Ainsi, si ShellExecute échoue, cette méthode secondaire échouera également dans ces cas. Il ouvre l’éditeur, selon les instructions erronées de l’association de shell.

Par conséquent, l'utilisateur doit utiliser le gestionnaire HTTP à la place, ou du moins de préférence le gestionnaire HTML.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top