Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 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

Ответить

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

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



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #1
Добавлено: 25.09.05 00:24
начал программить на VB.NET дык учись хоть не писать свой код, а переводить чужой... бывает помогает...

Ответить

Номер ответа: 2
Автор ответа:
 student-uni



Вопросов: 122
Ответов: 257
 Профиль | | #2 Добавлено: 25.09.05 11:30
а я и не сказал что это мой код.

На мой взгляд причина в том, что компилер 6 и дот нетовский по разному "понимают" размер структуры RASCONN

При попытке её инициализировать в tInfo(i должен получиться указатель на структуру, а этого не получается.

Может подскажешь в чём может быть дело ?
Спасибо.

Ответить

Номер ответа: 3
Автор ответа:
 student-uni



Вопросов: 122
Ответов: 257
 Профиль | | #3 Добавлено: 25.09.05 11:54
Меня смущает
tInfo(0).dwSize = Len(tInfo(0))


Дело в том что Len в дот нете даёт число символов
/в ВБ для получения размера структуры используют
LenB /

Логичнее было бы использовыать
tInfo.dwSize = Marshal.SizeOf(tInfo)

я пробовал с ней, но она даёт тоже какое то неправильное значение.

Помогите пожалуйста

Ответить

Номер ответа: 4
Автор ответа:
 student-uni



Вопросов: 122
Ответов: 257
 Профиль | | #4 Добавлено: 25.09.05 12:00
(Перед вызовом RasEnumConnections
надо записать в 1-ый параметр структуры RASCONN
размер самой структуры )

Ответить

Номер ответа: 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 - фальш параметр/

Помогите, кто что может сказать по этому поводу

Ответить

Номер ответа: 7
Автор ответа:
 student-uni



Вопросов: 122
Ответов: 257
 Профиль | | #7 Добавлено: 25.09.05 18:37
По поводу ошибки - вот она:

Eine nicht behandelte Ausnahme des Typs 'System.NullReferenceException' ist in Project1.exe aufgetreten.

Zusatzliche Informationen: Object reference not set to an instance of an object.

Ответить

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



Вопросов: 0
Ответов: 1876


 Профиль | | #8 Добавлено: 25.09.05 18:38
Ещё раз.
Где у тебя атрибут StructLayout?

Ответить

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



Вопросов: 0
Ответов: 1876


 Профиль | | #9 Добавлено: 25.09.05 18:40
Eine nicht behandelte Ausnahme des Typs 'System.NullReferenceException' ist in Project1.exe aufgetreten

Вах! Это круто. Гитлер капут. По-английски, пожалуйста.

Ответить

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



Вопросов: 0
Ответов: 1876


 Профиль | | #10 Добавлено: 25.09.05 18:42
Да, совсем забыл.
Нафига ты все параметры в скобки заключил?

Ответить

Номер ответа: 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.
Ну что за напасть ?

Ответить

Номер ответа: 12
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #12 Добавлено: 25.09.05 20:18
А где pack:=1?
А почему new применяется к структуре?
А почему auto function скомбинирована с alias? Либо auto без alias, либо alias с ansi function.
А почему charset unicode, в то время как функция ansi?

Ответить

Номер ответа: 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.

Может ещё какие замечания найдёте?

Ответить

Номер ответа: 14
Автор ответа:
 student-uni



Вопросов: 122
Ответов: 257
 Профиль | | #14 Добавлено: 25.09.05 23:37
В рабочей версии на ВБ 6 - структура составляет 412 байт.
Я не уверен что в дот нет она должна оставаться такой же а МСДНе никакой инфы по этому поводу нет


RasEnumConnections
This function lists all active RAS connections. It returns each connection's handle and phone book entry name.

DWORD RasEnumConnections(
  LPRASCONN lprasconn,
  LPDWORD lpcb,
  LPDWORD lpcConnections
);
Parameters
lprasconn
Long pointer to a buffer that receives an array of RASCONN structures, one for each RAS connection. Before calling the function, an application must set the dwSize member of the first RASCONN structure in the buffer to sizeof(RASCONN) in order to identify the version of the structure being passed.
lpcb
Long pointer to a variable that that contains the size, in bytes, of the buffer specified by lprasconn. On return, the function sets this variable to the number of bytes required to enumerate the RAS connections.
lpcConnections
Long pointer to a variable that the function sets to the number of RASCONN structures written to the buffer specified by lprasconn.
Return Values
Zero indicates success. A nonzero error value listed in the RAS header file, ERROR_BUFFER_TOO_SMALL, or ERROR_NOT_ENOUGH_MEMORY indicates failure.

Include Raserror.h for definitions of the RAS error codes.


Ответить

Номер ответа: 15
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #15 Добавлено: 25.09.05 23:39
Найдём.

Найдём желание указать книгу тов. Эпплмана под названием "Переход на VB. NET: стратегии, концепции, код". Помимо того, что это лучшая книга по данному вопросу, в ней в качестве примера рассматривается именно указанная функция.

Ответить

Страница: 1 | 2 |

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



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