据我所知,HANDLE只是一个涉及某种“系统资源表”的数字。这个句柄常量是否正确?我想不是因为它只是用来像数组上的索引那样访问表。一个位图的例子:虽然HBITMAP被声明为const,但我可以更改位图的内容吗?是一个const HANDLE真的是const吗?
回答
HANDLE is(AFAIR)int的typedef,因此常量HBITMAP与const int相同。
在这个意义上,你可以改变的位图的内容,即使处理位图是常量,因为常量是指手柄不实际的位图(认为它是一个const指针变量的类。)
但是:
- 句柄是在Win32 API,它是一个C API而不是C++(和创建前的C获得常量)的特点:因为
你的问题反正没有实际意义。
- 无论如何您都不能直接更改位图(或由句柄表示的任何其他“对象”)。该句柄是对Win32结构的不透明引用,并且只能通过用于处理(无双关语)对象的相应Win32 API调用进行操作。
我把“对象”加上引号,因为把手指概念对象(概念软件表示),而不是实际的C++对象,又因为Win32的是一个C API。
呼吁对“对象”的引用。在处理句柄时,最好将它们视为具有访问它们的方法的函数的黑盒子。 – RonaldBarzell
'HANDLE'是一个'void *'(尽管它可能在Window历史的某个时刻是某种'int')。其他句柄(如HBITMAP)是指向某些结构类型的指针,如果定义了STRICT,如果STRICT没有被定义,它们只是'HANDLE'的一个typedef。 –
@Michael谢谢,我目前没有SDK。将typedef设置为void *是有意义的,因为int在64位窗口中仍然是32位。 –
- 1. const auto &&真的没用吗?
- 2. 'auto const'和'const auto'是否一样?
- 3. const char * classname :: getname()const?什么是第一个const关键字的含义?
- 4. 它只是const char *的第一个字符是常量吗?
- 5. const_cast一个右值const const
- 6. 调用一个const函数而不是它的非const版本
- 7. 'char const * const c =“”''的意思是
- 8. C++ const成员函数返回一个const指针..但是返回的指针是什么类型的const?
- 9. 当const不是一个明确的?
- 10. “const LPVOID”是否等同于“void * const”?
- 11. “int * const const * b”是什么意思?
- 12. const vector <T> *哪部分是const?
- 13. 在C中返回const const成员为非const:好还是坏?
- 14. 应该从const对象返回const值是否为const?
- 15. int * const a = int const * b,对于obj(obj * const a = obj const * b)是否为true?
- 16. const char *不只是一个字符?
- 17. 从const char * +长度构造一个const std :: string便宜吗?
- 18. const func(const scalar&a)const中的三个“const”,为什么?
- 19. 什么是char * const *?
- 20. const指针指向一个const指针
- 21. 传递值时不是“const”冗余吗?
- 22. 将const int指派给一个指向int的const指针是非法的?
- 23. const T {};工程,const T;失败当T是一种非POD,
- 24. static const与extern const不同吗?
- 25. const char * const和const char []之间有区别吗?
- 26. 为什么“const int * p是一个const int指针”是一个错误的解释,但广泛使用?
- 27. 哪一个是正确的:vector <const string> OR const vector <string>?
- 28. 铸造const void * const const *
- 29. 转const const wchar_t *为const char *
- 30. 将const传递给接受const指针的函数不是const正确的?
API函数是否使用'const HBITMAP'或者只是一个'HBITMAP'?这应该回答你的问题。如果是后者,那么不要费神地将其声明为'const'(无论如何,你最终只会抛弃const)。另外,'HANDLE'可能不仅仅是一个数字,它可能是一个不透明的类型指针,它直接指向一些已分配的资源,而没有任何表之间的转换。最好不要对这种不透明类型做出假设。 – Praetorian
一个HANDLE总是指同一个操作系统对象。其状态可能肯定会发生变化,如位图或互斥体。所以它是一个'foo const *',而不是'const foo *'。 –