Google Chrome сломал ShellExecute()?
-
02-07-2019 - |
Вопрос
В течение многих лет я использовал 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-адресом в качестве аргумента.Спасибо!
Решение
Вот код, который работает во всех браузерах.Хитрость заключается в вызове 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;
}
Другие советы
Услышав сообщения о сбое ShellExecute в меньшинстве систем, я реализовал функцию, аналогичную примеру, приведенному Сергеем Корниловым.Это было около года назад.Та же предпосылка - выполните прямой поиск HKCR в обработчике файла .HTM.
Однако оказывается, что у некоторых пользователей есть редакторы (напримерUltraEdit), которые регистрируются для "открытия" htm-файлов (вместо "редактирования" их).Таким образом, если Сбой ShellExecute, этот вторичный метод также приведет к сбою в этих случаях.Он открывает редактор, как ошибочно указывает ассоциация оболочки.
Таким образом, пользователь должен использовать HTTP-обработчик вместо этого или, по крайней мере, отдавать предпочтение HTML-обработчику.