Google Chrome сломал ShellExecute ()? - PullRequest
2 голосов
/ 22 сентября 2008

В течение многих лет я использовал ShellExecute () API для запуска веб-браузера по умолчанию из моих приложений. Как это:

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

Он работал нормально, пока пару недель назад Google не выпустил браузер Chrome. Теперь, если на компьютере установлен Chrome, API ShellExecute больше не открывает веб-страницу.

Кто-нибудь еще разобрался, как решить эту проблему? (Если не считать Chrome и вывести сообщение о том, что он виноват в Chrome?)

РЕДАКТИРОВАТЬ: код, предоставленный Сергеем, кажется, работает, поэтому я принял его как "ответ". За исключением того, что мне не нравится вызов WinExec: MSDN читает, что WinExec предоставляется только для совместимости с 16-битными приложениями. Я могу прекратить работу с любым пакетом обновления. Я не пробовал, но не удивлюсь, если он уже перестал работать с Windows x64, поскольку он вообще не поддерживает 16-битные приложения. Поэтому вместо WinExec я собираюсь использовать ShellExecute с путем, взятым из реестра, как это делает код Сергея, и URL-адресом в качестве аргумента. Спасибо!

Ответы [ 2 ]

4 голосов
/ 22 сентября 2008

Вот код, который работает во всех браузерах. Хитрость заключается в том, чтобы вызвать WinExec в случае сбоя 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;
}
0 голосов
/ 14 июля 2012

Услышав сообщения о сбое ShellExecute в меньшинстве систем, я реализовал функцию, аналогичную примеру, приведенному Сергеем Корниловым. Это было около года назад. Та же предпосылка - Выполните прямой HKCR-поиск обработчика файла .HTM.

Однако оказывается, что у некоторых пользователей есть редакторы (например, UltraEdit), которые регистрируют себя для «открытия» файлов .htm (вместо «редактирования» их). Таким образом, , если ShellExecute завершится неудачно, этот вторичный метод также не будет выполнен в этих случаях. Он открывает редактор, как ошибочно указывает ассоциация оболочки.

Таким образом, пользователь должен использовать вместо этого обработчик HTTP или, по крайней мере, в предпочтении обработчика HTML.

...