程序代码:
Private Sub Form_Click()
dim Result as Long                
If XPMenuClass.GetItemProc(CInt(selectedItem)) <> 0 Then
    Result=CallWindowProc(ItemProc, 0&, 0&, 0&, 0&)
End If
End Sub其中ItemProc是函数地址(通过Addressof 获得),在2000调试和运行到没问题。在98 EXE文件运行没有问题,但是调试的时候,每当运行到Result=CallWindowProc(ItemProc, 0&, 0&, 0&, 0&),会先把地址为ItemProc的函数运行,但光标也听在这一句上说,提示:实时错误:DLL调用约定错误。
我这就CallWindowProc的语句用法有什么错误,如何修改?
另外,这程序能在XP下使用吗?

解决方案 »

  1.   

    建议继续使用addressof 而不是把它提取出来
      

  2.   

    callwindowproc 的第二个参数用0不妥
      

  3.   

    To:JennyVenus()   
       因为这是一个通用自制菜单点击时发生的事件。在代码生成菜单时候同时把点击菜单时要运行的函数地址储存起来。所以就这样来解决。
      

  4.   

    我对CallWindowProc不算太懂,这也是抄回来的能否再详细地解析一下吗?
    比如点击菜单退出,就运行下面的函数
    sub mnuExit()
        if msgbox ("是否退出吗?",vbyesno or vbinformation)=vbyes then    end if
    end sub
    end Sub
    Private Sub Form_Click()
    dim Result as Long                
    If ItemProc <> 0 Then
        Result=CallWindowProc(ItemProc, 0&, 0&, 0&, 0&)
    End If
    End Sub
      

  5.   

    我对CallWindowProc不算太懂,这也是抄回来的能否再详细地解析一下吗?
    比如点击菜单退出,就运行下面的函数
    sub mnuExit()
        if msgbox ("是否退出吗?",vbyesno or vbinformation)=vbyes then
            End 
        end if
    end sub我看过一些例子但是和这个不同,我不知道其他参数应该如何使用。
      

  6.   

    msgbox 提示, 类型 + 图标 + 默认
    类型比如 vbyesno, vbok 等等
    图标比如 vbinformation, vbquestion, vbcritical
    默认只有 vbdefaultbutto(1 - 3)
    需要组合就用or来添加
      

  7.   

    CallWindowProc用来呼叫原来的窗口过程,而一些特殊的消息VB本身是按照默认的方式进行处理的,如果需要改变相应的处理方式,则需要替换窗口过程,典型代码如下模块
    public newproc as long
    public oldproc as long窗体
    load
        oldproc = SetWindowLong(me.hwnd, GWL_WNDPROC, AddressOf newproc)
    unload
        SetWindowLong me.hwnd, GWL_WNDPROC, Oldprocnewproc必须是全局的公用的函数Public Function newproc(ByVal hwnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        Select Case iMsg
        Case WM_SYSCOMMAND     '比如选择了系统菜单的某一项,在这里进行拦截
                '.....
        case WM_COMMAND        '又比如选择了菜单的某一项,而这个菜单不是基本的菜单,而是动态创建出来的菜单
                '.....
        Case Else
            newproc = CallWindowProc(Oldproc, hwnd, iMsg, wParam, lParam)
        End Select
    End Function