《COM技术内幕》 §6 —— HRESULT、GUID和注册表
没有仔细看(Note:这也是很重要的一章)
《COM技术内幕》 §6 —— HRESULT、GUID和注册表(重新学习)
(1)关于HRESULT
COM组件使用HRESULT来向用户报告各种情况。许多COM接口函数所返回的均是HRESULT值。
NOTE HERE:HRESULT != Handle to RESULT,HRESULT = Here's the RESULT。
常用HRESULT值(其中表示成功的有一个S_前缀,表示失败的前缀为E_)
名称 |
含义 |
S_OK |
函数成功。在某些情况下,它还表示函数返回了一个布尔真值。S_OK被定义为0。 |
NOERROR |
同S_OK相同。 |
S_FALSE |
函数成功并返回一个布尔假值。S_FALSE被定义为1。 |
E_UNEXPECTED |
无法预知的失败。 |
E_NOIMPLE |
成员函数未被实现。 |
E_NOINTERFACE |
组件不支持所请求。此值将由QueryInterface函数返回。 |
E_OUTOFMEMORY |
组件无法分配所需的内存。 |
E_FAIL |
没有指定的失败。 |
NOTE HERE:S_FALSE被定义为1,而S_OK被定义为0。这与C和C++的编程原则正好相反。一般不能使用HRESULT值同某个成功代码(如S_OK),而应使用SUCCEEDED或FAILED。
定义自己的HRESULT的一般规则:
(2)GUID
在VC的安装目录下/COMMON/Tools/GUIDGEN.exe可以生成GUID码。
(3)注册表与CLSID
ProgID的命名约定:<Program>.<Component>.<Version>
?组件类别?
(4)COM库函数
在使用COM库中的其它函数之前(CoBuildVersion除外),进程必须先调用CoInitialize来初始化COM库函数。当进程不再需要使用COM库函数时,必须调用CoUninitialize。函数原型定义如下:
HRESULT CoInitialize(void* reserved); // Argument must be NULL void CoUninitialize(); |