Pergunta

Por anos eu venho usando ShellExecute () API para iniciar o navegador padrão web de dentro de minhas aplicações. Como esta:

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

Tem sido funcionando bem até que um par de semanas atrás, quando o Google lançou seu navegador Chrome. Agora, se o Chrome está instalado no computador, o API ShellExecute não abre uma página web.

Alguém já descobriu ainda como resolver este problema? (Short de detectar Chrome e exibir uma mensagem informando ao usuário a culpa é do Chrome?)

EDIT: o código fornecido pelo Sergey parece trabalho, então eu aceitei-o como "a" resposta. Só que eu não gosto a chamada para WinExec: MSDN lê que WinExec é fornecido apenas para compatibilidade com aplicativos de 16 bits. IOW, ele pode parar de trabalhar com qualquer Service Pack. Eu não tentei isso, mas eu não ficaria surpreso se ele já parou de funcionar com o Windows x64, uma vez que não suporta aplicativos de 16 bits em tudo. Assim, em vez de WinExec, eu vou usar ShellExecute, com o caminho tomado a partir do registro como o código de Sergey faz, e o URL como argumento. Obrigado!

Foi útil?

Solução

Aqui está o código que funciona em todos os navegadores. O truque é chamar WinExec se ShellExecute falhar.

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

Outras dicas

Depois de relatos de ShellExecute falhar em uma minoria de aparelhos auditivos, eu implementada uma função semelhante ao exemplo dado por Sergey Kornilov. Este foi cerca de um ano atrás. Mesma premissa -. Faça uma pesquisa HKCR direta do manipulador de arquivo HTM

No entanto, verifica-se que alguns usuários têm editores (por exemplo UltraEdit) que se registram para ficheiros.htm 'abertas' (em vez de 'editar'-los). Assim, se ShellExecute falhar, este método secundário também falhará nesses casos. Ele abre o editor, como a associação shell instrui errantly.

Assim, o usuário deve usar o manipulador de HTTP em vez disso, ou pelo menos na preferência do manipulador HTML.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top