Страница: 1 | 2 |
|
Вопрос: от ВБ 6 к дот НЕТ RasEnumConnections
|
Добавлено: 24.09.05 03:21
|
|
Автор вопроса: student-uni
|
Вот код слежения статистики соединения на вб 6 работает
Private Declare Function RasEnumConnections Lib "rasapi32" Alias "RasEnumConnectionsA" (ByVal lprasconn As Long, ByVal lpcb As Long, ByVal lpcConnections As Long) As Long
Private Declare Function RasGetConnectionStatistics Lib "rasapi32" (ByVal hRasConn As Long, ByVal lpStatistics As Long) As Long
Private Type RASCONN
dwSize As Long
hRasConn As Long
szEntryName(0 To 256) As Byte
szDeviceType(0 To 16) As Byte
szDeviceName(0 To 128) As Byte
pad As Byte
End Type
Private Type RAS_STATS
dwSize As Long
dwBytesXmited As Long
dwBytesRcved As Long
dwFramesXmited As Long
dwFramesRcved As Long
dwCrcErr As Long
dwTimeoutErr As Long
dwAlignmentErr As Long
dwHardwareOverrunErr As Long
dwFramingErr As Long
dwBufferOverrunErr As Long
dwCompressionRatioIn As Long
dwCompressionRatioOut As Long
dwBps As Long
dwConnectDuration As Long
End Type
Private Sub Form_Load()
Me.Show
Dim conn As RASCONN
Dim stat As RAS_STATS
Dim y As Long, z As Long
conn.dwSize = Len(conn)
y = conn.dwSize
If RasEnumConnections(VarPtr(conn), VarPtr(y), VarPtr(z)) = 0 Then
stat.dwSize = Len(stat)
If RasGetConnectionStatistics(conn.hRasConn, VarPtr(stat)) = 0 Then
Print "Ñêîðîñòü: " & stat.dwBps
Print "Ïðèíÿòî: " & stat.dwBytesRcved
Print "Îòïðàâëåíî :" & stat.dwBytesXmited
Print "Ñæàòèå (ïðèíÿòî): " & stat.dwCompressionRatioIn
Print "Ñæàòèå (ïîñëåíî): " & stat.dwCompressionRatioOut
Print "Âðåìÿ: " & stat.dwConnectDuration
Print stat.dwBufferOverrunErr
Print stat.dwAlignmentErr
Print stat.dwCrcErr
Print stat.dwFramesRcved
Print stat.dwFramesXmited
Print stat.dwFramingErr
Print stat.dwTimeoutErr
End If
End If
End Sub
Пытаюсь сделать на дот нет - не хочет
помогите хотя бы с декларом RasEnumConnections
вот код деклара RasEnumConnections на дот нете. Даже два
оба матерят
Где может быть ошибка ?
Всем спасибо
Option Strict Off
Option Explicit On
Module Module1
Public Declare Function RasEnumConnections Lib "rasapi32.dll" Alias
"RasEnumConnectionsA"(ByRef lpRasCon As RASCONN, ByRef lpcb As Integer,
ByRef lpNumConnections As Integer) As Integer
Public Declare Function RasHangUp Lib "rasapi32.dll" Alias
"RasHangUpA"(ByVal hRasConn As Integer) As Integer
Public Structure RASCONN
Dim dwSize As Integer
Dim hRasConn As Integer
<VBFixedArray(256)> Dim szEntryName() As Byte
<VBFixedArray(16)> Dim szDeviceType() As Byte
<VBFixedArray(129)> Dim szDeviceName() As Byte
Public Sub Initialize()
ReDim szEntryName(256)
ReDim szDeviceType(16)
ReDim szDeviceName(129)
End Sub
End Structure
Public Sub Main()
Dim tInfo(10) As RASCONN
Dim lSize As Integer
Dim lTotal As Integer
Dim iCurrent As Integer
Dim x As Integer
For x = 0 To 10
tInfo(x).Initialize()
Next
tInfo(0).dwSize = Len(tInfo(0))
lSize = tInfo(0).dwSize * 10
If RasEnumConnections(tInfo(0), lSize, lTotal) <> 0 Then
MsgBox("Error during enumeration atempt")
Else
MsgBox (Str(lTotal) + " active RAS connections were found")
For iCurrent = 0 To lTotal - 1
If RasHangUp(tInfo(iCurrent).hRasConn) Then
MsgBox ("Failed to diconnect one of the
Ras connections")
Else
MsgBox ("One of the RAS connection was
disconnected")
End If
Next
End If
End Sub
End Module
Option Strict Off
Option Explicit On
Module Module1
Public Declare Function RasEnumConnections Lib "rasapi32.dll" Alias "RasEnumConnectionsA"(ByRef lpRasCon As RASCONN, ByRef lpcb As Integer, ByRef lpNumConnections As Integer) As Integer
Public Declare Function RasHangUp Lib "rasapi32.dll" Alias "RasHangUpA"(ByVal hRasConn As Integer) As Integer
Public Structure RASCONN
Dim dwSize As Integer
Dim hRasConn As Integer
<VBFixedArray(256)> Dim szEntryName() As Byte
<VBFixedArray(16)> Dim szDeviceType() As Byte
<VBFixedArray(129)> Dim szDeviceName() As Byte
Public Sub Initialize()
ReDim szEntryName(256)
ReDim szDeviceType(16)
ReDim szDeviceName(129)
End Sub
End Structure
Public Sub Main()
Dim tInfo(10) As RASCONN
Dim lSize As Integer
Dim lTotal As Integer
Dim i As Integer
For i = 0 To 10
tInfo(i).Initialize()
Next
tInfo(0).dwSize = Len(tInfo(0))
lSize = tInfo(0).dwSize * 10
Dim iCurrent As Integer
Try
MsgBox(Str(RasEnumConnections(tInfo(0), lSize, lTotal)))
If RasEnumConnections(tInfo(i), lSize, lTotal) <> 0 Then
MsgBox("Error at enumeration")
Else
MsgBox("Found " & Str(lTotal) & " active RAS connections")
For iCurrent = 0 To lTotal - 1
If RasHangUp(tInfo(iCurrent).hRasConn) Then
MsgBox("Cannot disconnect RAS connection")
Else
MsgBox("RAS connection is disconnect")
End If
Next
End If
Catch Ex As Exception
MsgBox((Ex).ToString())
End Try
End Sub
End Module
Ответить
|
Номер ответа: 5 Автор ответа: GSerg
Вопросов: 0 Ответов: 1876
|
Профиль | | #5
|
Добавлено: 25.09.05 14:54
|
в ВБ для получения размера структуры используют LenB
Глупости.
Если "в ВБ" Len<>LenB, то такую структуру не получится использовать без собственных процедур упаковки и распаковки, потому что её выравнивание будет не то, что нужно. Ну или в tlb её описать.
Поэтому "в ВБ" используют Len.
Что касается VB .NET - RTFM, RTFM и ещё раз RTFM. Тогда узнаешь, что члены структур в .NET располагаются там, где их хочет видеть компилятор, а не там, где их написал ты. Поэтому первый мембер может быть и в середине, и в конце. Поэтому и есть атрибут специальный под названием StructLayout для предотвращения этого поведения, а также для указания способа упаковки структуры.
Ответить
|
Номер ответа: 6 Автор ответа: student-uni
Вопросов: 122 Ответов: 257
|
Профиль | | #6
|
Добавлено: 25.09.05 18:31
|
спасибо всем кто ответил
Перепроверил - даёт он размер структуры верный,
проблема в передаче параметров функции.
я упрощу пример
Итак декларируем апи функцию
Private Declare Auto Function RasEnumConnections Lib "rasapi32" Alias "RasEnumConnectionsA" (ByRef lprasconn As RASCONN, ByRef lpcb As Integer, ByRef lpcConnections As Integer) As Integer
Декларируем структуру
Private Structure RASCONN
Dim dwSize As Integer
Dim hRasConn As Integer
<VBFixedArray(256)> Dim szEntryName() As Byte
<VBFixedArray(16)> Dim szDeviceType() As Byte
<VBFixedArray(128)> Dim szDeviceName() As Byte
Dim pad As Byte
Public Sub Initialize()
ReDim szEntryName(256)
ReDim szDeviceType(16)
ReDim szDeviceName(128)
End Sub
End Structure
Создаём объект типа структура
инициализируем массивы в структуре
получаем размер структуры
Dim conn As New RASCONN
conn.Initialize()
Dim y, z, rr As Integer
conn.dwSize = Len(conn)
y = conn.dwSize
Вызываем функцию и...
rr = RasEnumConnections((conn), (y), (z))
О боги... Null exception
ПРоверяю - conn=структуре, у=412 - правильный размер, а зет - нулю. Всё как при отладке в Вб6
НО
В оригинале на ВБ6 если Вы заметили
АПИ ф-ция задекларирована с ByVal в прототипе
зато при вызове все параметры передаются
через VarPTR
Поскольку его в дот нете нет,
Я в прототипе сделал все ByRef
а при вызове даю сами значения.
Вопрос: Правильно ли это ?
Если да что как бороться с нулль ексепшн
/Пробовал менять в прототипе на ByVal - во всех комбинациях возвращает ошибку 87 - фальш параметр/
Помогите, кто что может сказать по этому поводу
Ответить
|
Номер ответа: 11 Автор ответа: student-uni
Вопросов: 122 Ответов: 257
|
Профиль | | #11
|
Добавлено: 25.09.05 19:40
|
Окей
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> Private Structure RASCONN
rr = RasEnumConnections(conn, y, z)
Должен признать, что теперь в зет появляется число соединений
Но по прежнему
Object reference not set to an instance of an object.
Ну что за напасть ?
Ответить
|
Номер ответа: 13 Автор ответа: student-uni
Вопросов: 122 Ответов: 257
|
Профиль | | #13
|
Добавлено: 25.09.05 23:20
|
Я Вам признателен за помощь, но тут тяжёлый случай
Я внёс следующие изменения и ничего не изменилось:
Ошибка
Object reference not set to an instance of an object. Но количесвто соединений даёт
/по крайней мере я так думаю. В зет возвращается единица./
Private Declare Function RasEnumConnections Lib "rasapi32" Alias "RasEnumConnectionsA" (ByRef lprasconn As RASCONN, ByRef lpcb As Int32, ByRef lpcConnections As Int32) As Int32
далее
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, pack:=1)> Public Structure RASCONN
Public dwSize As Int32
Public hRasConn As Int32
<VBFixedArray(256)> Public szEntryName() As Byte
<VBFixedArray(16)> Public szDeviceType() As Byte
<VBFixedArray(128)> Public szDeviceName() As Byte
Public pad As Byte
Public Sub Initialize()
ReDim szEntryName(256)
ReDim szDeviceType(16)
ReDim szDeviceName(128)
End Sub
End Structure
и
Dim conn As RASCONN
conn.Initialize()
Dim y, z As Int32
Dim rr As Int32
conn.dwSize = Len(conn)
y = conn.dwSize
rr = RasEnumConnections(conn, y, z)
Но во втором варианте прототипа по Вашему совету :
Private Declare Auto Function RasEnumConnections Lib "rasapi32" (ByRef lprasconn As RASCONN, ByRef lpcb As Int32, ByRef lpcConnections As Int32) As Int32
она стала возвращать ошибку 632
по моему это неправильный размер структуры.
И количество соединений в зет уже не возвращает.
По моему в первом варианте ей не нравилась
ссылка на структуру/параметр1/, а вовтором - размер - параметр2.
Может ещё какие замечания найдёте?
Ответить
|
Страница: 1 | 2 |
Поиск по форуму