2012-12-11 48 views
1

据我所知,HANDLE只是一个涉及某种“系统资源表”的数字。这个句柄常量是否正确?我想不是因为它只是用来像数组上的索引那样访问表。一个位图的例子:虽然HBITMAP被声明为const,但我可以更改位图的内容吗?是一个const HANDLE真的是const吗?

+2

API函数是否使用'const HBITMAP'或者只是一个'HBITMAP'?这应该回答你的问题。如果是后者,那么不要费神地将其声明为'const'(无论如何,你最终只会抛弃const)。另外,'HANDLE'可能不仅仅是一个数字,它可能是一个不透明的类型指针,它直接指向一些已分配的资源,而没有任何表之间的转换。最好不要对这种不透明类型做出假设。 – Praetorian

+3

一个HANDLE总是指同一个操作系统对象。其状态可能肯定会发生变化,如位图或互斥体。所以它是一个'foo const *',而不是'const foo *'。 –

回答

3

HANDLE is(AFAIR)int的typedef,因此常量HBITMAP与const int相同。

在这个意义上,你可以改变的位图的内容,即使处理位图是常量,因为常量是指手柄不实际的位图(认为它是一个const指针变量的类。)

但是:

  • 句柄是在Win32 API,它是一个C API而不是C++(和创建前的C获得常量)的特点:因为

    你的问题反正没有实际意义。

  • 无论如何您都不能直接更改位图(或由句柄表示的任何其他“对象”)。该句柄是对Win32结构的不透明引用,并且只能通过用于处理(无双关语)对象的相应Win32 API调用进行操作。

我把“对象”加上引号,因为把手指概念对象(概念软件表示),而不是实际的C++对象,又因为Win32的是一个C API。

+0

呼吁对“对象”的引用。在处理句柄时,最好将它们视为具有访问它们的方法的函数的黑盒子。 – RonaldBarzell

+1

'HANDLE'是一个'void *'(尽管它可能在Window历史的某个时刻是某种'int')。其他句柄(如HBITMAP)是指向某些结构类型的指针,如果定义了STRICT,如果STRICT没有被定义,它们只是'HANDLE'的一个typedef。 –

+0

@Michael谢谢,我目前没有SDK。将typedef设置为void *是有意义的,因为int在64位窗口中仍然是32位。 –

相关问题