错误:“地址”表达式无法转换为“整数”因为“整数”不是委托类型

发布于 2024-11-29 04:10:44 字数 3826 浏览 0 评论 0原文

我在将 VB6 代码升级到 VB.NET 时遇到错误。错误发生在 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

variables:

Dim GWL_WNDPROC As Short = -4  
Dim hWnd As Integer

Code for 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

我收到错误的原因是什么?我该如何解决这个问题?

I faced an error when upgrading VB6 code to VB.NET. The error occurs at
AddressOf WindowProc

AddressOf expression cannot be converted to 'Integer' because 'Integer' is not a delegate type

My declaration for SetWindowLong is:

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

variables:

Dim GWL_WNDPROC As Short = -4  
Dim hWnd As Integer

Code for 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

What is the reason for the error I get? How do I solve the problem?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

暖风昔人 2024-12-06 04:10:44

您是否考虑过覆盖表单的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窗口子类化简单”,例如,如果您不拥有要子类化的窗口,这可能会很有用。不管怎样,不推荐的一种方法是尝试使用 SetWindowLong 覆盖 Window Proc

Rather than trying to use P/Invoke to set the window procedure, have you looked at overriding your Form's WndProc method? It may take a little more work during the re-write, but you'll end up with better code. Example from the previous link:

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

You might also want to look in the System.Net.Sockets namespace for appropriate replacements for your current socket code.


I've also found an article ".NET Makes Window Subclassing Easy", which might be useful if, for instance, you don't own the window you're trying to subclass. Any way around though, the one way that's not recommended is by trying to override the Window Proc using SetWindowLong

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文