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
У меня работает, а у юзера вываливается. В чем проблема может быть?
Попробуй объявить sConnType локально - она же у тебя глобальная, так? Ret используется непроинициализированная. Это, конечно, мелочи, но лучше перестраховаться и ввести новую переменную flags as long=0.
Приведи описания структур, чтобы я мог попробовать у себя и на виртуальной тачке - не хотца лезть в С++...
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
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
Лично я вообще не использую костантные стринги - предпочитаю маллочить память:
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.
Визардом?
Млин, ну может быть просто хапнуть свою библиотеку подмышку и вперёд?