Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Что за глюк? Добавлено: 25.04.06 09:57  

Автор вопроса:  gvozd | Web-сайт: www.gvozdsoft.com
Использую функцию для определения инета:
Public Function IsConnected() As String
    Dim Ret As Long
    Dim RAS(255) As RASType, RASStatus As RASStatusType
    Dim lg As Long, lpconnection As Long, Result As Long
    Dim ss As String
    '0 - отключены, 1 - аутентификация, 2 - в сети
    RAS(0).dwSize = 412
    lg = 256 * RAS(0).dwSize
    Result = RasEnumConnections(RAS(0), lg, lpconnection)
    Ret = InternetGetConnectedStateEx(Ret, sConnType, 254, 0)
'Debug.Print sConnType
    ss = sConnType
    ss = Replace(ss, Chr$(0), "", 1, 255)

    If lpconnection = 0 Then
        If Ret = 1 Then
            IsConnected = "2" & ss
        Else
            IsConnected = "0"
        End If
    Else
        RASStatus.dwSize = 160
        Result = RasGetConnectStatus(RAS(0).hRasCon, RASStatus)
        If RASStatus.RasConnState = &H2000& Then
            'Вот тут вываливается
            IsConnected = "2" & ss
        Else
            IsConnected = "1"
        End If
    End If
End Function


У меня работает, а у юзера вываливается. В чем проблема может быть?

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #1
Добавлено: 26.04.06 11:11
Попробуй объявить sConnType локально - она же у тебя глобальная, так? Ret используется непроинициализированная. Это, конечно, мелочи, но лучше перестраховаться и ввести новую переменную flags as long=0.
Приведи описания структур, чтобы я мог попробовать у себя и на виртуальной тачке - не хотца лезть в С++...

Ответить

Номер ответа: 2
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #2 Добавлено: 26.04.06 11:56
Ret используется непроинициализированная. Это, конечно, мелочи, но лучше перестраховаться и ввести новую переменную flags as long=0.

Полный :lol: :)
Neco, это же шестера :)
2gvozd Приведи декларацию своих АПИ. Отладчик все нормально показывает?

Ответить

Номер ответа: 3
Автор ответа:
 gvozd



Разработчик Offline Client

Вопросов: 164
Ответов: 1317


 Web-сайт: www.gvozdsoft.com
 Профиль | | #3
Добавлено: 26.04.06 12:13
Вот:
Private Declare Function InternetGetConnectedStateEx Lib "wininet.dll" (ByRef lpdwFlags As Long, ByVal lpszConnectionName As String, ByVal dwNameLen As Integer, ByVal dwReserved As Long) As Long
Private Declare Function RasEnumEntries Lib "RasApi32.DLL" Alias "RasEnumEntriesA" (ByVal Reserved As String, ByVal lpszPhonebook As String, lprasentryname As Any, lpcb As Long, lpcEntries As Long) As Long
Private Declare Function RasEnumConnections Lib "RasApi32.DLL" _
    Alias "RasEnumConnectionsA" (lpRasCon As Any, lpcb As _
    Long, lpcConnections As Long) As Long

Private Declare Function RasGetConnectStatus Lib "RasApi32.DLL" _
    Alias "RasGetConnectStatusA" (ByVal hRasCon As Long, _
    lpStatus As Any) As Long

Const RAS_MaxEntryName = 256
Const RAS_MaxDeviceType = 16
Const RAS_MaxDeviceName = 32

Private Type RASType
  dwSize As Long
  hRasCon As Long
  szEntryName(RAS_MaxEntryName) As Byte
  szDeviceType(RAS_MaxDeviceType) As Byte
  szDeviceName(RAS_MaxDeviceName) As Byte
End Type

Private Type RASStatusType
  dwSize As Long
  RasConnState As Long
  dwError As Long
  szDeviceType(RAS_MaxDeviceType) As Byte
  szDeviceName(RAS_MaxDeviceName) As Byte
End Type
Private Type RASENTRYNAME95
    dwSize As Long
    szEntryName(256) As Byte
End Type
Private sConnType As String * 255


Да все ок вроде, в отладке.

Ответить

Номер ответа: 4
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #4
Добавлено: 26.04.06 12:52
Neco, это же шестера :)

Меня напрягают кострукции, типа:
Option Explicit

Private Sub Form_Load()
    Dim a As Long
    a = refa(a)
    MsgBox a
End Sub
Function refa(ByRef value As Long)
    refa = 9
    value = 5
End Function

Зачем усложнять читабельность?

Зачем делать так:
    ss = sConnType
    ss = Replace(ss, Chr$(0), "", 1, 255)

Если можно сделать так:
    ss = Replace(sConnType, Chr$(0), "", 1, 255)

Хотя здесь переменная предаётся ByVal и логического конфликта не происходит, не лучше ли сократить количество операций?

Почему sConnType глобальная?

Это мелочи, которые хоть и должны работать, но всё же если есть возможность их избежать - то надо избегать.

Кстати, я проверил у себя код - пашет. Проверил на виртуальной тачке без установленного VB - тоже пашет.

Ответить

Номер ответа: 5
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #5 Добавлено: 26.04.06 14:16
Переменную ss сделай также, как и sConnType - As String*255, чтобы она у тебя была выделена буфером в стеке, а не через SysAllocxxx

Ответить

Номер ответа: 6
Автор ответа:
 Barsik



Разработчик Offline Client

ICQ: 343368641 

Вопросов: 17
Ответов: 686
 Web-сайт: barsik.newmail.ru
 Профиль | | #6
Добавлено: 26.04.06 14:45
имхо велосипед. в примерах есть этот код и работает он не глючно!

Ответить

Номер ответа: 7
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #7
Добавлено: 26.04.06 15:00
имхо велосипед. в примерах есть этот код и работает он не глючно!

Ну и этот работает безглючно - но только не везде...

Ответить

Номер ответа: 8
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #8 Добавлено: 26.04.06 15:05
Попробуй создать дистрибутив. Бывает что и голый ВБшный проект на некоторых машинах глючит.

Ответить

Номер ответа: 9
Автор ответа:
 gvozd



Разработчик Offline Client

Вопросов: 164
Ответов: 1317


 Web-сайт: www.gvozdsoft.com
 Профиль | | #9
Добавлено: 26.04.06 15:47
Почему sConnType глобальная?

Не доглядел.

Переменную ss сделай также, как и sConnType - As String*255, чтобы она у тебя была выделена буфером в стеке, а не через SysAllocxxx

Да я ss эту для того ввел, чтобы она без пустоты была. Кстати, а Len(sConnType) что вернет, реальную длину или 255?

имхо велосипед. в примерах есть этот код и работает он не глючно!

Мне надо, чтобы определялась стадия аутентификации, а это в RAS, но тогда локалка не определятся, тут уже InternetGetConnectedStateEx.

Попробуй создать дистрибутив. Бывает что и голый ВБшный проект на некоторых машинах глючит.

Визардом?

Ответить

Номер ответа: 10
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #10
Добавлено: 26.04.06 16:16
Лично я вообще не использую костантные стринги - предпочитаю маллочить память:

Option Explicit

Private Sub Form_Load()
    Dim stra As String
    stra = String(50, vbNullChar)
    ' ----- some api -------
    Mid$(stra, 1, 10) = "1234567890"
    ' ----------------------
    stra = CutByZero(stra)
    MsgBox stra
    End
End Sub
Private Function CutByZero(ByRef ToCut As String) As String
    CutByZero = ""
    Dim v As Integer
    If Len(ToCut) > 0 Then
        v = InStr(1, ToCut, vbNullChar)
        If v > 0 Then
            CutByZero = Left$(ToCut, v - 1)
        End If
    End If
End Function


Да я ss эту для того ввел, чтобы она без пустоты была. Кстати, а Len(sConnType) что вернет, реальную длину или 255?

Обязательно 255.

Визардом?

Млин, ну может быть просто хапнуть свою библиотеку подмышку и вперёд?

Ответить

Номер ответа: 11
Автор ответа:
 gvozd



Разработчик Offline Client

Вопросов: 164
Ответов: 1317


 Web-сайт: www.gvozdsoft.com
 Профиль | | #11
Добавлено: 26.04.06 18:06
Какую библиотеку, если я только на апи? Сейчас поставил голую Винду СП2 на виртуалку - работает без проблем.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам