Консультация № 175025
08.12.2009, 16:51
35.00 руб.
0 14 1
Уважаемые эксперты, подскажите код, как находясь в Вордовском документе при
помощи ВБА
Проверить есть ли соединение с интернетом, но только точно, или нет
соединения или нет соединения с локальным диском, имеется ввиду когда
Интернет Эксплойер используется не для интернета, а как средство
соединения по локальной сети
Спасибо Эндрю

Обсуждение

Неизвестный
08.12.2009, 16:59
общий
Ципихович Эндрю:
что значит "IE используется не для Интернета, а как средство соединения по локальной сети"??? и при чем тут локальный диск?
в смысле, что требуется проверка доступа к сетевому ресурсу, вне зависимости от места нахождения - в Интернете или в локальной сети?
если да, то это звучит как "требуется проверка доступности хоста"
и появляется дополнительный вопрос - требуется проверка "физической" связи (например, если хост отвечает на ICMP-пакеты, то достаточно команды ping), или требуется проверка работы сервиса (например, http-сервера, или ftp-сервера)?
Неизвестный
08.12.2009, 17:18
общий
Vasiliy83:
Вот только от Вася узнал, что IE это интернет Эксплоер
Значит так поясню поподробней
У меня есть компьтер, неужели?
У меня он подсоединён к локальной сети
На нём я открываю IE, если физически не подсоединён кабель тогда IE, что выдаст, невозможно открыть страницу
А если кабель подсоединён но связи нет, что выдаст IE, невозможно открыть страницу
Не люблю двухсмысленности или или 1 случай или второй
Вот это надо и узнать
Лучше подскажите проверки всего, я выберу, что мне нужно, лишнее не помешает, да и другие юзеры может этим интерисуются
Подскажите
давно
Профессор
230118
3054
08.12.2009, 17:45
общий
Ципихович Эндрю:
Для программы IE не имеет значения, по какой причине она не может связаться с сайтом. Или она выдает нужную страницу, или заложенную в ней стандартную страницу "cannot load page". Так что узнать именно через VBA вряд ли возможно.
Неизвестный
08.12.2009, 17:51
общий
Ципихович Эндрю:
не совсем Вы правы. Если IE выдает, что невозможно отобразить страницу, то это неоднозначная проблема!
это значит, что проблема вызвана одним из следующего:
1) у Вас выпал кабель, нет сетевой карты вообще, IE настроен на несуществующий прокси-сервер... или любая другая проблема с Вашим ПК или ПО.
2) кабель не выпал, но был перегрызен мышами, провалился под землю самосвал и порвал оптику на канале связи глобального провайдера (реальная ситуация!)... или любая другая проблема на канале связи между сервером (с которого Вы пытаетесь получить содержимое Интернет-страницы) и Вашим ПК.
3) пьяный сисадмин отключил сервер и лег спать, упал Apache, отключили электропитание... или любая другая проблема непосредственно с самим сервером, страницу с которого Вы пытаетесь открыть.
теперь поясню к чему это я... если Вы откроете страницу yandex.ru и получите "невозможно отобразить страницу", это не значит, что вы не откроете страницу google.ru
а если с практической точки зрения - то проверка одного сайта не является избыточной операцией для проверки наличия доступа в Интернет.
это для общего понимания проблемы всех, кто заинтересуется этой темой.
по поводу кода - позже постараюсь предоставить все варианты проверки связи из VBA, которые смогу найти, если конечно никто раньше не ответит на данный вопрос.
Неизвестный
08.12.2009, 17:51
общий
Ashotn:
при использовании API-функций можно все! ну, или почти все
давно
Профессор
230118
3054
08.12.2009, 18:07
общий
Vasiliy83:
Можно разве что написать обработчик NavigateComplete и проверить код ошибки отсюда. http://msdn.microsoft.com/en-us/library/bb268233(VS.85).aspx. Что думаете?
давно
Профессор
230118
3054
08.12.2009, 18:11
общий
Vasiliy83:
"Проверка одного сайта не является избыточной операцией" - может, ВЫ хотели сказать, что является?
Неизвестный
08.12.2009, 18:32
общий
Ashotn:
по поводу обработчика - можно попробовать и так, но я бы лучше нашел код для использования библиотеки - напрямую работать надежнее и быстрее (на мой субъективный непрофессиональный взгляд))

проверка доступности шлюза, dns, и парочки общедоступных сайтов, на которых разрешен ответ на ICMP-пакеты)) это по общему доступу к сети Интернет
или все же поставить вопрос о доступности конкретного хоста или его сервиса, и проверять именно его.
давно
Профессор
230118
3054
08.12.2009, 18:45
общий
Vasiliy83:
Почему же, у Вас очень профессиональный взгляд. Я так понимаю, что требуется также узнать о доступе в локальную сеть(там у него имеется приложение ASP).
Неизвестный
08.12.2009, 18:52
общий
Щепки летят, ответа нет
Все варианты ответа я понял, где код?
у Вас выпал кабель
у Вас нет сетевой карты вообще
у Вас отсутствует IE
у Вас кабель не выпал, но был перегрызен мышами
у Вас любая проблема непосредственно с самим сервером, страницу с которого Вы пытаетесь открыть

Неизвестный
08.12.2009, 19:29
общий
это ответ
Здравствуйте, Ципихович Эндрю.
Нашел пару вариантов для проверки доступности хоста.
Вот первый код:
Код:
Const NETWORK_ALIVE_AOL = &H4
Const NETWORK_ALIVE_LAN = &H1
Const NETWORK_ALIVE_WAN = &H2
Private Type QOCINFO
dwSize As Long
dwFlags As Long
dwInSpeed As Long 'байты в секунду
dwOutSpeed As Long 'байты в секунду
End Type
Private Declare Function IsDestinationReachable Lib "SENSAPI.DLL" Alias "IsDestinationReachableA" (ByVal lpszDestination As String, ByRef lpQOCInfo As QOCINFO) As Long
Private Sub Main()
Dim Ret As QOCINFO
Ret.dwSize = Len(Ret)
If IsDestinationReachable("rfpro.ru", Ret) = 0 Then 'вывод сообщения в зависимости от ответа
MsgBox "Доступа нет!"
Else
MsgBox "Доступ есть!" + vbCrLf + _
"Скорость передачи данных от хоста: " + Format$(Ret.dwInSpeed / 1024, "#.0") + " Кб/с," + vbCrLf + _
"Скорость передачи данных к хосту: " + Format$(Ret.dwOutSpeed / 1024, "#.0") + " Кб/с."
End If
End Sub

этот код проверяет именно связь (отправка ICMP-пакета) с хостом. В случае неудачи функция IsDestinationReachable возвращает 0, в случае успеха - 1.
Проверил на несуществующих хостах - 0, на рабочих - 1. В качестве хоста можно указать IP-адрес компьютера или DNS-имя (т.е. проверить связь как в Интернет-сайтом, так и с локальным ПК).
Изменить данный код под свои задачи не составит труда. Одно "но" - если хост жив, но на нем запрещен ответ на ICMP, то Word виснет! (может проблема только у меня...)
показания скорости какие-то неправильные (видимо не совсем верно используется функция, но оно и не требуется)

второй код такой:
Код:
Sub TestPing()
Dim strComputer As String
strComputer = "rfpro.ru" 'имя хоста, который проверяется
If Not SystemOnline(strComputer) Then
MsgBox "Этот хост мертв: " & strComputer, vbOKOnly, "Статус хоста"
Else
MsgBox "Хост жив!", vbOKOnly, "Статус"
End If
End Sub

Function SystemOnline(ByVal ComputerName As String)
' функция возвращает True если хост пингуется
' имя хоста указывается или IP-адресом или DNS-именем
' Класс Win32_PingStatus использованный в данной функции требует ОС Windows XP или более позднюю

Dim colPingResults As Variant
Dim oPingResult As Variant
Dim strQuery As String

' Define the WMI query
strQuery = "SELECT * FROM Win32_PingStatus WHERE Address = '" & ComputerName & "'"

' запуск проверки через WMI
Set colPingResults = GetObject("winmgmts://./root/cimv2").ExecQuery(strQuery)
' преобразование WMI-результата в True или False
For Each oPingResult In colPingResults
If Not IsObject(oPingResult) Then
SystemOnline = False
ElseIf oPingResult.StatusCode = 0 Then
SystemOnline = True
Else
SystemOnline = False
End If
Next
End Function

код также прост и изменить его не составляет труда. в случае, если хост жив, но запрещен ответ на ICMP - стабильно показывает, что хост неактивен и никаких зависаний.
5
Неизвестный
08.12.2009, 19:31
общий
Ashotn:
а ларчик просто открывался! даже очень)))
главное знать, какую функцию использовать - дальше дело техники.
Неизвестный
08.12.2009, 19:34
общий
Ципихович Эндрю:
а как иначе... "в споре рождается истина"
[offtop]после просмотра фильма "Плесень" на Первом, эта фраза наполняется другим смыслом... Спора Истины... прям Священный Грааль какой-то [/offtop]
давно
Профессор
230118
3054
09.12.2009, 12:58
общий
Ципихович Эндрю:
На вопрос "Я что то не понял, здесь вроде нет проверки подключен ли локальный диск, имеется ввиду когда
Интернет Эксплойер используется не для интернета, а как средство соединения по локальной сети?"
Если Вы имеете в виду локальную сеть, тогда вместо rfpro в функциях Vasiliy83, можно написать IP-адрес локального компьютера, например, "http://10.198.192.10", как помню из Ваших предыдущих вопросов.
Форма ответа