ShellExecute зависает, открывая новое окно браузера, если по умолчанию Chrome или IE

Я использовал этот код (из MSDN), чтобы открыть браузер по умолчанию.

Private Declare Function ShellExecute _
                            Lib "shell32.dll" _
                            Alias "ShellExecuteA"( _
                            ByVal hwnd As Long, _
                            ByVal lpOperation As String, _
                            ByVal lpFile As String, _
                            ByVal lpParameters As String, _
                            ByVal lpDirectory As String, _
                            ByVal nShowCmd As Long) _
                            As Long

Private Sub Command1_Click()
   Dim r As Long
   r = ShellExecute(0, "open", "http://www.microsoft.com", 0, 0, 1)
End Sub

Он отлично работает для IE и Chrome, только если экземпляр уже открыт, затем он просто рекламирует вкладку и возвращает запрошенную страницу.

Если экземпляр еще не открыт, создается новый, но страница не загружается и время ожидания истекает.

Кажется, только firefox работает нормально в обоих сценариях.

Затем я попробовал методику (подробно здесь), где я создал временный htm-файл, чтобы найти связанное приложение с целью последующего использования с помощью одного из вызовов оболочки ниже:

Shell "C:\Program Files\Internet Explorer\iexplore.exe https://www.google.co.uk/", vbNormalFocus

 Shell "C:\Program Files\Mozilla Firefox\firefox.exe https://www.google.co.uk/", vbNormalFocus

 Shell "C:\Users\Kjack\AppData\Local\Google\Chrome\Application\chrome.exe https://www.google.co.uk/", vbNormalFocus

На этот раз FF и IE работали, но у Chrome все еще была та же проблема.

Кто-нибудь знает решение этой проблемы?

РЕДАКТИРОВАТЬ, чтобы добавить информацию о ОС и версиях браузера:

ОС: Windows Vista Home Basic 32-разрядная

FireFox 20.0.1

IE 9.0.8112.16421

Опера 12.15 Сборка 1748

Хром 26.0.1410.64 м

3 ответа

С тех пор, как появилась Win2k & Me, у вас также есть чистый COM-интерфейс для этого. Он предлагает поддержку Unicode без вращения:

Shell.ShellExecute метод

    With CreateObject("Shell.Application")
        .ShellExecute "http://www.microsoft.com"
    End With

Этот пример позволяет всем необязательным параметрам (включая глагол) по умолчанию. Как уже указывалось в ответе Кена Уайта, в этом случае вы хотите, чтобы глагол использовался по умолчанию.

Ваш код предполагает, что существует open глагол, присвоенный http: протокол, и нет никаких гарантий, что это было сделано при установке браузера.

Вместо этого просто оставьте глагол пустым. Если вы не укажете один из них, Windows будет использовать любое действие по умолчанию для протокола или ассоциации файлов.

Private Sub Command1_Click()
   Dim r As Long
   r = ShellExecute(0, "", "http://www.microsoft.com", 0, 0, 1)
End Sub

Подсказка. Чтобы узнать, какое действие по умолчанию применяется к файлу, щелкните его правой кнопкой мыши в проводнике Windows. Действие по умолчанию - это то, что вверху контекстного меню отображается жирным шрифтом.

Откроется браузер по умолчанию (например, Chrome) без зависания:

VB6:

Call Shell("explorer """ & sURL & """", vbNormalFocus)

Или попробуйте это:

Dim objShell As Object
Set objShell = CreateObject("WScript.Shell")
Call objShell.Run("explorer """ & sURL & """", vbNormalFocus)
Другие вопросы по тегам