Ошибка: выражение «AddressOf» не может быть преобразовано в «Integer», поскольку «Integer» не является типом делегата.

Я столкнулся с ошибкой при обновлении кода VB6 до VB.NET. Ошибка возникает в AddressOf WindowProc

Выражение AddressOf нельзя преобразовать в Integer, поскольку Integer не является типом делегата

Моя декларация для SetWindowLong:

Declare Function SetWindowLong Lib "user32"  Alias "SetWindowLongA"(
                    ByVal hWnd As Integer, 
                    ByVal nIndex As Integer, 
                    ByVal dwNewLong As Integer) As Integer

переменные:

Dim GWL_WNDPROC As Short = -4  
Dim hWnd As Integer

Код для WindowProc:

Function WindowProc(ByVal hw As Integer, ByVal uMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

    Dim x As Integer
    Dim a As String
    Dim wp As Short
    Dim temp As Object
    Dim ReadBuffer(1000) As Byte
    'Debug.Print uMsg, wParam, lParam
    Select Case uMsg
        Case 1025
            Debug.Print(VB6.TabLayout(uMsg, wParam, lParam))
            Debug.Print(uMsg & "  " & wParam & "  " & lParam)

            e_err = WSAGetAsyncError(lParam)
            e_errstr = GetWSAErrorString(e_err)

            If e_err <> 0 Then
                Debug.Print("Error String returned -> " & e_err & " - " & e_errstr)
                Debug.Print("Terminating....")
                do_cancel = True
                'Exit Function
            End If
            Select Case lParam
                Case FD_READ 'lets check for data
                    x = recv(mysock, ReadBuffer(0), 1000, 0) 'try to get some
                    If x > 0 Then 'was there any?
                        'UPGRADE_ISSUE: Constant vbUnicode was not upgraded. Click for more: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="55B59875-9A95-4B71-9D6A-7C294BF7139D"'
                        'default
                        'a = StrConv(System.Text.UnicodeEncoding.Unicode.GetString(ReadBuffer), vbUnicode) 'yep, lets change it to stuff we can understand
                        a = System.Text.UnicodeEncoding.Unicode.GetString(ReadBuffer) 'yep, lets change it to stuff we can understand

                        Debug.Print(a)
                        rtncode = Val(Mid(a, 1, 3))
                        'Debug.Print "Analysing code " & rtncode & "..."
                        Select Case rtncode
                            Case 354, 250

                                Progress = Progress + 1

                                Debug.Print(">>Progress becomes " & Progress)
                            Case 220
                                Debug.Print("Recieved Greenlight")
                                Green_Light = True
                            Case 221

                                Progress = Progress + 1

                                Debug.Print(">>Progress becomes " & Progress)
                            Case 550, 551, 552, 553, 554, 451, 452, 500
                                Debug.Print("There was some error at the server side")
                                Debug.Print("error code is " & rtncode)
                                do_cancel = True
                        End Select
                    End If
                Case FD_CONNECT 'did we connect?
                    mysock = wParam 'yep, we did! yayay
                    'Debug.Print WSAGetAsyncError(lParam) & "error code"
                    'Debug.Print mysock & " - Mysocket Value"

                Case FD_CLOSE 'uh oh. they closed the connection
                    Call closesocket(wp) 'so we need to close
            End Select
    End Select
    'let the msg get through to the form
    WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Function

В чем причина ошибки, которую я получаю? Как решить проблему?


person sozai    schedule 11.08.2011    source источник
comment
В какой строке вы получаете ошибку? И в приведенном выше коде есть несколько ошибок.   -  person chrissie1    schedule 11.08.2011
comment
Как определяются и устанавливаются lpPrevWndProc, hw, uMsg, wParam и lParam?   -  person Hand-E-Food    schedule 11.08.2011
comment
@Hand-E-Food — hw, uMsg, wParam и lParam являются параметрами функции WindowProc. lpPrevWndProc предположительно находится там, где хранится возвращаемое значение из SetWindowLong (но OP, конечно, не показал нам фактическую строку кода, содержащую ошибочную попытку использовать SetWindowLong для переопределения оконного процесса)   -  person Damien_The_Unbeliever    schedule 11.08.2011
comment
@sozai, я исправил для тебя форматирование твоего вопроса. Пожалуйста, ознакомьтесь с синтаксисом Markdown, используемым в Stack Overflow, прежде чем публиковать снова! Благодарю вас! :)   -  person stakx - no longer contributing    schedule 11.08.2011


Ответы (1)


Вместо того, чтобы пытаться использовать P/Invoke для установки оконной процедуры, вы посмотрели на переопределение WndProc? Во время перезаписи может потребоваться немного больше работы, но в итоге вы получите более качественный код. Пример из предыдущей ссылки:

Protected Overrides Sub WndProc(ByRef m As Message)
        ' Listen for operating system messages
        Select Case (m.Msg)
            ' The WM_ACTIVATEAPP message occurs when the application
            ' becomes the active application or becomes inactive.
        Case WM_ACTIVATEAPP

                ' The WParam value identifies what is occurring.
                appActive = (m.WParam.ToInt32() <> 0)

                ' Invalidate to get new text painted.
                Me.Invalidate()

        End Select
        MyBase.WndProc(m)
    End Sub

Вы также можете заглянуть в System.Net .Sockets для подходящей замены текущего кода сокета.


Я также нашел статью .NET Makes Window Subclassing Easy", что может быть полезно, если, например, вы не являетесь владельцем окна, которое пытаетесь создать подклассом. В любом случае, единственный способ, который не рекомендуется, - это попытаться переопределить Window Proc, используя SetWindowLong

person Damien_The_Unbeliever    schedule 11.08.2011