第六章:关于HRESULT、GUID、注册表及其他细节

在本章中,我们将会讨论关于前面所未能细说的一些细节问题。
首先就是HRESULT。关于它我们在第3章中讨论QueryInterface时曾有所提及。第二个是GUID。传递给Qnerylnterface的IID结构就是GUID的一个例子。之后,我们将讨论组件如何在Windows的注册表中发布其位置信息,以便客户能够找到并创建它们。最后我们将介绍COM库中的一些有用的函数及实用程序。

HRESULT

COM使用HRESUTL来向其用户报告各种情况。例如 QueryInterface 返回的就是一个HRESULT值。在后面的章节中我们将会看到,许多COM接口函数所返问的均是HRESULT值。
HRESULT这种类型的值并不是一个指向某个结果的句柄。HRESULT值实际上是一个可分成三个域的32位值。图6-1显示了这三个部分的含义。这个名称的形成是有其历史原因的,读者不要将它想成是“结果的句柄”(Handle to RESULT),而应将其当成是“这就是结果”(Here’s the RESULT)。
系统所生成的HRESULT值在Win32的头文件WINERROR.H中有定义。在此文件的前面列出的是Win32的错误代码。HRESULT值同Win32的错误代码有些类似,但读者不应将它们等同起来,也不要将其混淆。
图6-1所示的HRESULT值中最重要的比特位表示函数调用是否成功。这种设计使得函数可以返回多个成功代码及失败代码。HRESULT的低16位包含的就是函数的返回代码,其余的15位包含的是此类型及返回值起源的更详细的信息
在这里插入图片描述表6-1列出了那些最常用的错误代码。其中表示成功返回的代码在其名称前都有一个S_前缀,而表示失败返回的代码其名称前的前缀则是E_。

表6-1 常用HRESULT值

名称含义
S_OK函数成功。在某些情况下,它还表示函数返回了一个布尔真值。S_OK被定义为0。
NOERROR同S_OK相同。
S_ FALSE函数成功并返回一个布尔假值。S_FALSE被定义为1。
E_ UNEXPECTED无法预知的失败。
E_ NOIMPLE成员函数未被实现。
E_ NOINTERFACE组件不支持所请求的接口。此值将由QueryInterface函数返回。
E. OUTOFMEMORY组件无法分配所需的内存。
E_ FAIL没有指定的失败。

注意S_FALSE被定义成1而S_OK被定义成0,这点同C/C++编程原则正好是相反的。因此在使用HRESULT值时,应将返回的值直接同S_FAISE或S_OK进行比较。
HRESULT值中16到30这15个比特位包含的是设备代码。设备代码标识的是可以返回HRESULT中返回代码的操作系统部分。由于Windows操作系统是由Microsoft开发的,因此它保留有定义设备代码的权力。当前所定义的设备代码如表6-2所列。

表6-2 当前所定义的内设备代码

FACILITY_WINDOWS8
FACILITY_STORAGE3
FACILITY_SSPI9
FACILITY_RPC1
FACILITY_WTN327
FACTLITY_CONTROL10
FACILITY_NULL0
FACILITY_ITF4
FACILITY_DISPATCH2
FACILITY_CERT11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值