关于AddressOf的问题

ShaB 2003-09-11 10:27:51
Private Function NotifyWindowProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = TRAY_CALLBACK Then
If lParam = WM_LBUTTONUP Then
Me.WindowState = 0
ElseIf lParam = WM_RBUTTONUP Then
Me.WindowState = 1
End If
End If
NotifyWindowProc = CallWindowProc(OldWindowProc, Me.hWnd, Msg, wParam, lParam)
End Function

Private Sub Form_Load()
With NotifyData
.uID = 0
.cbSize = Len(NotifyData)
.hIcon = Me.Icon.Handle
.hWnd = Me.hWnd
.szTip = "B哥"
.uCallbackMessage = TRAY_CALLBACK
.uFlags = .uFlags Or NIF_MESSAGE
.cbSize = Len(NotifyData)
End With
Shell_NotifyIcon NIM_ADD, NotifyData
OldWindowProc = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf NotifyWindowProc)
End Sub

上面第一个是函数定义,用来代替旧窗口处理函数,然后在最后面这里,让NotifyWindowProc开始代替旧窗口函数,可是提示AddressOf无效的信息,请高手帮忙解答,感谢!
...全文
118 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenkangli 2003-09-12
  • 打赏
  • 举报
回复

AddressOf 运算符


一个一元运算符,它将其后面的过程的地址传递给一个 API 过程,该 API 过程在参数表对应位置中需要一个函数指针。

语法

AddressOf procedurename

必需的 procedurename 指定要传递的地址是哪一个过程的地址。这个过程必须是发出调用命令的工程中的一个标准模块模块里的一个过程。

说明

当一个过程的名称出现在一个参数列表中时,通常该过程已经被计算,并且该过程返回值的地址也会被传递。AddressOf 允许该过程的地址被传递给动态链接库 (DLL) 中的一个 Windows API 函数,而不是传递该过程的返回值。API 函数然后就可以使用这个地址来调用相应的 Basic 过程,这个过程就是我们所知道的回调。AddressOf 运算符只出现在对 API 过程的调用中。

尽管可以使用 AddressOf 运算符在 Basic 过程之间传递过程指针,却不能通过这样的一个指针从 Basic 内部调用一个函数。这就是说,例如,一个使用 Basic 编写的类 不能使用这样的一个指针来回调自己的控制器。当使用 AddressOf 运算符在 Basic 内的过程之间传递一个过程的指针时,被调用过程的参数类型必须定义为 As Long。

警告 如果不能完全理解函数回调的概念,则使用 AddressOf 运算符可能会导致意想不到的结果。必须理解回调的 Basic 部份是如何工作的,以及接受所传递的函数地址的 DLL 的代码是如何工作的。调试这样的交互操作是非常困难的,因为该程序和开发环境运行在相同的进程中。在某些情况下,系统的调试也许是不可能的。

注意 可以使用 Microsoft Visual C++ (或者类似的工具)编译的 DLLs 来创建自己的回调函数原型。要使用 AddressOf 运算符来工作,您的原型必需使用 __stdcall 调用约定。缺省的调用约定 (__cdecl) 不能与 AddressOf 运算符一起工作。

因为一个回调的调用程序不在用户自己的程序中,所以很重要的一点是要保证回调过程中的错误不被回传到调用者。可以通过把 On Error Resume Next 语句放置于回调过程的起始处来达到这个要求。
danielinbiti 2003-09-12
  • 打赏
  • 举报
回复
去掉private且放在模块里
jlum99 2003-09-11
  • 打赏
  • 举报
回复
NotifyWindowProc 放在模块里
本课程从零开始,以通俗易懂的方式讲解Java技术,手把手教你掌握每一个知识点。真正做到零基础入门学习,最适合初学者的教程!本课程为JavaSE的阶段项目,通过《购物系统》综合训练前面讲过的所有技术点,如:面向对象、集合、异常、IO、线程、反射、设计模式、JDBC等。项目中包含的功能:1.用户管理    1.1 用户注册        用户名不能与已存在的用户名相同        要对密码进行加密处理    1.2 用户登陆        禁用的账户不能登陆    1.3 修改密码    1.4 用户注销2.商品管理    2.1 商品展示        支持分页显示3.购物车管理    3.1 添加商品到购物车    3.2 从购物车删除商品    3.3 修改商品数量    3.4 清空购物车    3.5 查看购物车    3.6 结算4.订单管理    4.1 生成订单    4.2 查看我的订单    4.3 查看订单详情数据库设计:1. 商品表    t_product    id    name    price2. 用户表    t_user    id    username    password    phone    address    status -- 状态,1表示启用,0表示禁用3. 订单表    t_order    id    user_id    no    price    createdate4. 订单明细表    t_item    id    product_id    num    price    order_id教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!讲师介绍

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧