Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: Чем заменить AddressOf из VB6 в VB.NET? Добавлено: 11.05.05 20:58  

Автор вопроса:  Anatoliy
Добрый день.
Попытался перевести на VB.NET модуль по обмену файлами между ПК и КПК.
Вроде бы все сделал, как книга пишет - в API - шных функциях заменил Long на Integer. А вот с AddressOf побороться никак не получается.

На строке .heRapiInit = GetSub(AddressOf ConnectedRapi) ругаеца:
'AddressOf' expression cannot be converted to 'Integer' because 'Integer' is not a delegate type.
Модуль следующий:

Option Explicit

Public Type CEOSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
End Type

Public Declare Function CeGetVersionEx Lib "rapi.dll" ( _
    lpVersionInformation As CEOSVERSIONINFO) As Boolean


Private Function GetSub(Addr As Long) As Long
    'Used for the init Call.
    GetSub = Addr
End Function

Public Function ConnectedRapi()
    'Used for the init Call - Do not remove.
End Function

Public Function RapiConnect() As Boolean
    'Initiates a connection and returns true
    ' if it connected, false if it did not.
    
    Dim pRapiInit As RAPIINIT
    
    On Error GoTo RapiConnect_Err
    
    With pRapiInit
        .cbSize = Len(pRapiInit)
        .heRapiInit = GetSub(AddressOf ConnectedRapi)
    End With
    Call CeRapiInitEx(pRapiInit)
    RapiConnect = RapiGetCEOSVersionString <> ""
    Exit Function
    
RapiConnect_Err:
    RapiConnect = False
End Function

Public Function RapiGetCEOSVersionString() As String
    ' Returns the Major, Minor, and Build number of the OS In a string.
    Dim ceosver As CEOSVERSIONINFO
    
    ceosver.dwOSVersionInfoSize = Len(ceosver)
    
    If CeGetVersionEx(ceosver) Then
        RapiGetCEOSVersionString = ceosver.dwMajorVersion & "." & _
            ceosver.dwMinorVersion & "." & _
            ceosver.dwBuildNumber & " " & _
            Left$(ceosver.szCSDVersion, _
            InStr(ceosver.szCSDVersion, Chr$(0)) - 1)
    Else
        RapiGetCEOSVersionString = ""
    End If
End Function


Вызываю функцию из RapiConnect модуля:
Dim bConnected As Boolean
    bConnected = RapiConnect
Получаю значение - присоединен ли КПК к ПК.

Ответить

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

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



ICQ: 50804884 

Вопросов: 72
Ответов: 642
 Web-сайт: freeloader.folder-pro.net
 Профиль | | #1
Добавлено: 12.05.05 04:35

Насколько я знаю надо делегировать.

Ответить

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



Вопросов: 7
Ответов: 10
 Профиль | | #2 Добавлено: 12.05.05 11:01
Да есть неплохая статья http://msdn.microsoft.com/library/rus/default.asp?url=/library/RUS/vbcon/html/vbup1048.asp как заменить AddressOf.
Я попробовал таким образом выкрутиться:

    ;Delegate Sub ConnectedRapiDelegate()

    Private Function GetSub(ByVal Addr As ConnectedRapiDelegate) As Integer
        'Used for the init Call.
        GetSub = Addr
    End Function

    Public Sub ConnectedRapi()
        'Used for the init Call - Do not remove.
    End Sub

    Public Function RapiConnect() As Boolean
        'Initiates a connection and returns true
        ' if it connected, false if it did not.

        ;Dim pRapiInit As RAPIINIT
        ;Dim a As Integer
        Try
            With pRapiInit
                .cbSize = Len(pRapiInit)
                ;Dim myDlg As ConnectedRapiDelegate
                myDlg = AddressOf ConnectedRapi
                .heRapiInit = GetSub(myDlg) 'AddressOf ConnectedRapi)
            End With
            Call CeRapiInitEx(pRapiInit)
            RapiConnect = RapiGetCEOSVersionString() <> ""
            Exit Function
        Catch ex As Exception
            RapiConnect = False
        End Try
    End Function


Но в данном случае, что-то не стыкуется в строке GetSub = Addr. Выдает ругательство "Value of Type 'ConnectedRapiDelegate' cannot be converted to 'Integer'"

Ответить

Номер ответа: 3
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #3
Добавлено: 12.05.05 14:37
А он никогда и не сможет быть сконвертирован в Integer.

По идее, нужно в декларации функции сменить Integer на
ConnectedRapiDelegate, и передавать сам делегат, вроде такого:

With pRapiInit
    .cbSize = Len(pRapiInit)
    ;Dim myDlg As New ConnectedRapiDelegate (AddressOf ConnectedRapi)
    .heRapiInit = GetSub(myDlg)
End With
Call CeRapiInitEx(pRapiInit)

Ответить

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



Вопросов: 7
Ответов: 10
 Профиль | | #4 Добавлено: 12.05.05 16:06
Жаль, я еще не разобрался с Delegate. Приходится наугад. Я уж попробовал три варианта сочетаний параметра и возвращаемого значения:

    Private Function GetSub(ByVal Addr As ConnectedRapiDelegate) As ConnectedRapiDelegate
        'Used for the init Call.
        GetSub = Addr
    End Function


 
   Private Function GetSub(ByVal Addr As ConnectedRapiDelegate) As Integer
        'Used for the init Call.
        GetSub = Addr
    End Function



    Private Function GetSub(ByVal Addr As ConnectedRapiDelegate) As ConnectedRapiDelegate
        'Used for the init Call.
        GetSub = Addr
    End Function


    Private Function GetSub(ByVal Addr As Integer) As Integer
        'Used for the init Call.
        GetSub = Addr
    End Function


Все равно все упирается в невозможность конвертации Delegate to Integer.

Ответить

Номер ответа: 5
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #5
Добавлено: 12.05.05 16:19
Читайте внимательнее.. Я говорил, что нужно попробовать сменить тип
этого параметра с Integer на тип Вашего делегата. Integer тут не нужен
вовсе.

Ответить

Номер ответа: 6
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #6
Добавлено: 12.05.05 16:19
Хотя возможно я не прав.

Судя по вышеуказанной статье из MSDN, нужно получать адрес в помощью
оператора AddressOf.

With pRapiInit
    .cbSize = Len(pRapiInit)
    .heRapiInit = GetSub(AddressOf ConnectedRapi)
End With
Call CeRapiInitEx(pRapiInit)

Ответить

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



Вопросов: 7
Ответов: 10
 Профиль | | #7 Добавлено: 12.05.05 17:08
Я скорее всего ошибаюсь, но в VB6 оператор AddressOf возвращал указатель на адрес функции в памяти (As Long). Здесь же (в VB.NET данный оператор
Creates a procedure delegate instance that references the specific procedure

И вытянуть из него указатель наверное невозможно. Необходимо искать другой способ проверки коннекта.

Ответить

Номер ответа: 8
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #8
Добавлено: 12.05.05 18:02
Поймите одну вещь: вам этот указатель (Int32) вообще не нужен!
Изменить декларацию функции так, чтобы там был делегат, и передавайте
делегат. А уж в преобразованиях делегата в указатель позаботится
система P-Invoke.

Ответить

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



Вопросов: 7
Ответов: 10
 Профиль | | #9 Добавлено: 13.05.05 13:45
Прошу прощения, что проморочил голову столько времени. Пересмотрел свой вопрос. Там ведь упущена ключевая функция и структура, вокруг которых и крутится вопрос.
Вот что значит вырывать код из контекста проекта.
Там следующая функция:

Public Declare Function CeRapiInitEx Lib "rapi.dll" ( _
    pRapiInit As RAPIINIT) As Long


А параметр к ней в виде структуры:
Public Type RAPIINIT
    cbSize As Long
    heRapiInit As Long
    hrRapiInit As Long
End Type


Вся загвоздка в том, чтобы в поле heRapiInit установить указатель на функцию ConnectedRapi
Вот полный код работающего модуля (работающего в VB6!):

Option Explicit

Public Type CEOSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
End Type

Public Type RAPIINIT
    cbSize As Long
    heRapiInit As Long
    hrRapiInit As Long
End Type

Public Declare Function CeGetVersionEx Lib "rapi.dll" ( _
    lpVersionInformation As CEOSVERSIONINFO) As Boolean

Public Declare Function CeRapiInitEx Lib "rapi.dll" ( _
    pRapiInit As RAPIINIT) As Long

Private Function GetSub(Addr As Long) As Long
    'Used for the init Call.
    GetSub = Addr
End Function

Public Function ConnectedRapi()
    'Used for the init Call - Do not remove.
End Function

Public Function RapiConnect() As Boolean
    'Initiates a connection and returns true
    ' if it connected, false if it did not.
    
    Dim pRapiInit As RAPIINIT
    
    On Error GoTo RapiConnect_Err
    
    With pRapiInit
        .cbSize = Len(pRapiInit)
        .heRapiInit = GetSub(AddressOf ConnectedRapi)
    End With
    Call CeRapiInitEx(pRapiInit)
    RapiConnect = RapiGetCEOSVersionString <> ""
    Exit Function
    
RapiConnect_Err:
    RapiConnect = False
End Function

Public Function RapiGetCEOSVersionString() As String
    ' Returns the Major, Minor, and Build number of the OS In a string.
    Dim ceosver As CEOSVERSIONINFO
    
    ceosver.dwOSVersionInfoSize = Len(ceosver)
    
    If CeGetVersionEx(ceosver) Then
        RapiGetCEOSVersionString = ceosver.dwMajorVersion & "." & _
            ceosver.dwMinorVersion & "." & _
            ceosver.dwBuildNumber & " " & _
            Left$(ceosver.szCSDVersion, _
            InStr(ceosver.szCSDVersion, Chr$(0)) - 1)
    Else
        RapiGetCEOSVersionString = ""
    End If
End Function

Ответить

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



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


 Профиль | | #10 Добавлено: 13.05.05 14:53
Ну Павел же всё объяснил... Не надо недооценивать имеющийся механизм абстракции :)

Структуру объявить:
<runtime.interopservices.structlayout(runtime.interopservices.layoutkind.sequential, pack:=1)>Public Structure RAPIINIT
  public cbSize As Integer
  public heRapiInit As ConnectedRapiDelegate
  public hrRapiInit As integer
End Type


Потом присвоить:
pRapiInit.heRapiInit = addressof ConnectedRapi


Потом вызвать...

Ответить

Страница: 1 |

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



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