Pregunta

Durante años he estado usando la API ShellExecute() para iniciar el navegador web predeterminado desde mis aplicaciones.Como esto:

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

Ha estado funcionando bien hasta hace un par de semanas, cuando Google lanzó su navegador Chrome.Ahora, si Chrome está instalado en la computadora, la API ShellExecute ya no abre una página web.

¿Alguien ha descubierto ya cómo resolver este problema?(¿A menos que detecte Chrome y muestre un mensaje que le diga al usuario que es culpa de Chrome?)

EDITAR:El código proporcionado por Sergey parece funcionar, así que lo acepté como "la" respuesta.Excepto que no me gusta la llamada a WinExec:MSDN lee que WinExec se proporciona sólo por compatibilidad con aplicaciones de 16 bits.OIA, puede dejar de funcionar con cualquier Service Pack.No lo probé, pero no me sorprendería que ya dejara de funcionar con Windows x64, ya que no admite ninguna aplicación de 16 bits.Entonces, en lugar de WinExec, usaré ShellExecute, con la ruta tomada del registro como lo hace el código de Sergey y la URL como argumento.¡Gracias!

¿Fue útil?

Solución

Aquí está el código que funciona en todos los navegadores.El truco consiste en llamar a WinExec si falla ShellExecute.

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

Otros consejos

Después de escuchar informes de que ShellExecute fallaba en una minoría de sistemas, implementé una función similar al ejemplo dado por Sergey Kornilov.Eso fue hace alrededor de un año.Misma premisa: realice una búsqueda directa de HKCR del controlador de archivos .HTM.

Sin embargo, resulta que algunos usuarios tienen editores (p. ej.UltraEdit) que se registran para "abrir" archivos .htm (en lugar de "editarlos").De este modo, si ShellExecute falla, este método secundario también fallará en esos casos.Abre el editor, como indica erróneamente la asociación de shell.

Por lo tanto, el usuario debería utilizar el controlador HTTP en su lugar, o al menos con preferencia al controlador HTML.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top