一种Handle结构

     最近看到了这样一篇博客,感觉写的很好。尤其是它其中叙述的这种基于事件的模型。

     博客地址: http://www.ibm.com/developerworks/cn/java/l-niosvr/#icomments

     我也是照猫画虎的写了个示例程序,不知道对不对我斗胆描述一下这个结构:

     1.定义一个接口,定义需要提供的服务。

     2.定义一个抽象类(或者普通的类)实现上述接口,实现接口的所有服务,实现内容都为空的。

     3.接下来,用户可以根据自己的需要通过继承以上的类来重写接口的服务,实现自己想要的服务。想写多少写多少,想写几个写几个。这个属于用户自定义的Handle。

     4.最后一步,需要一个触发器。触发器内部维护一个List以保持那些用户添加进来的自定义Handle。这个触发器采用单例模式,通过提供addListener方法向List中添加Handle。最后再提供对应于1中接口的所有服务的的触发调用函数,大概像这样:

public void fireService1(){
		for(int i=0;i<listeners.size();i++){
			((MyListener)listeners.get(i)).opService1();
		}
	}

 大功告成,神奇的效果出来了:

                                                当用户自定义了几个Handle后,通过addListener方法注册后,在执行fireServiceX的时候,虽然他是将List中的所有Handle的ServiceX都执行了一遍,但实际上由于Handle重写的服务不同,若Handle1没有重写ServiceX,则会执行其父类的ServiceX,但是其父类的ServiceX是空的,也就什么都不执行了。

<think>好的,用户问的是HANDLE是否是一种数据类型,特别是在C++和Windows API中的定义。首先,我需要确认HANDLE在Windows中的定义。根据提供的引用,尤其是引用[1]提到Windows数据类型是由C数据类型重定义得到的,所以HANDLE应该属于这类。 接下来,查找引用中的具体内容。引用[2]中的例子显示Windows API函数参数使用Windows数据类型,比如HWND、LPCTSTR等,但没直接提到HANDLE。不过HWND本身是窗口句柄,而HANDLE可能是一个更通用的句柄类型。 然后,引用[3]的代码示例中有HWND的使用,但HANDLE可能在其他地方定义。通常,HANDLE在Windows头文件中定义为void指针,例如typedef void* HANDLE;。虽然提供的引用中没有直接说明,但结合知识库,HANDLE确实是Windows API中的基础数据类型,用于表示各种对象的句柄,如文件、进程等。 需要解释HANDLE的作用,比如作为资源标识符,不透明性,以及通过API函数操作的重要性。同时,应指出具体句柄类型如HWND是HANDLE的派生类型,确保用户理解层次结构。 最后,生成相关问题时要围绕数据类型、句柄的作用、具体类型区别和使用场景展开,确保覆盖用户可能感兴趣的延伸话题。</think>在Windows API中,**HANDLE**确实是一种基础数据类型,用于表示操作系统资源的抽象引用标识符。其定义和特性如下: ### 定义与实现 1. **底层实现** HANDLE在Windows头文件中通过C/C++的`typedef`重定义实现,常见定义为: $$typedef void* HANDLE;$$ 它本质上是一个指针,但开发者无需关注其具体内存结构,只需通过API函数操作[^1][^2]。 2. **作用与特性** - **资源标识符**:表示窗口、文件、进程等内核对象(如`HWND`是窗口句柄的子类型) - **不透明性**:开发者不能直接操作其内部数据,必须通过`CloseHandle()`等API管理生命周期 - **层级关系**:派生出自定义句柄类型(如`HANDLE` → `HWND` → `HDC`) ### 代码示例 ```cpp #include <windows.h> void ProcessExample() { HANDLE hFile = CreateFile("test.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { // 通过ReadFile等API操作文件 CloseHandle(hFile); // 必须显式释放资源 } } ``` ### 注意事项 - 无效值检测需使用`INVALID_HANDLE_VALUE`宏 - 64位系统中仍为32位值(WoW64兼容设计) - 部分句柄类型(如`HWND`)由系统自动管理释放
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值