Страница: 1 |
Страница: 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-сайт:
Профиль | | #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.
Я попробовал таким образом выкрутиться:
 elegate 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.
 im pRapiInit As RAPIINIT
 im a As Integer
Try
With pRapiInit
.cbSize = Len(pRapiInit)
 im 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-сайт:
Профиль | | #3
Добавлено: 12.05.05 14:37
А он никогда и не сможет быть сконвертирован в Integer.
По идее, нужно в декларации функции сменить Integer на
ConnectedRapiDelegate, и передавать сам делегат, вроде такого:
With pRapiInit
.cbSize = Len(pRapiInit)
 im 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. Приходится наугад. Я уж попробовал три варианта сочетаний параметра и возвращаемого значения:
'Used for the init Call.
GetSub = Addr
End Function
'Used for the init Call.
GetSub = Addr
End Function
'Used for the init Call.
GetSub = Addr
End Function
'Used for the init Call.
GetSub = Addr
End Function
Все равно все упирается в невозможность конвертации Delegate to Integer.
Номер ответа: 5
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #5
Добавлено: 12.05.05 16:19
Читайте внимательнее.. Я говорил, что нужно попробовать сменить тип
этого параметра с Integer на тип Вашего делегата. Integer тут не нужен
вовсе.
Номер ответа: 6
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #6
Добавлено: 12.05.05 16:19
Хотя возможно я не прав.
Судя по вышеуказанной статье из MSDN, нужно получать адрес в помощью
оператора AddressOf.
.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 данный оператор
И вытянуть из него указатель наверное невозможно. Необходимо искать другой способ проверки коннекта.
Номер ответа: 8
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #8
Добавлено: 12.05.05 18:02
Поймите одну вещь: вам этот указатель (Int32) вообще не нужен!
Изменить декларацию функции так, чтобы там был делегат, и передавайте
делегат. А уж в преобразованиях делегата в указатель позаботится
система P-Invoke.
Номер ответа: 9
Автор ответа:
Anatoliy
Вопросов: 7
Ответов: 10
Профиль | | #9
Добавлено: 13.05.05 13:45
Прошу прощения, что проморочил голову столько времени. Пересмотрел свой вопрос. Там ведь упущена ключевая функция и структура, вокруг которых и крутится вопрос.
Вот что значит вырывать код из контекста проекта.
Там следующая функция:
pRapiInit As RAPIINIT) As Long
А параметр к ней в виде структуры:
cbSize As Long
heRapiInit As Long
hrRapiInit As Long
End Type
Вся загвоздка в том, чтобы в поле heRapiInit установить указатель на функцию ConnectedRapi
Вот полный код работающего модуля (работающего в VB6!):
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
Ну Павел же всё объяснил... Не надо недооценивать имеющийся механизм абстракции
Структуру объявить:
public cbSize As Integer
public heRapiInit As ConnectedRapiDelegate
public hrRapiInit As integer
End Type
Потом присвоить:
Потом вызвать...