COM技术内幕--关于HRESULT、GUID、注册表及其他细节

HRESULT
这就是结果:Here's the RESULT
HRESULT 结构如下 :

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

HRESULT的使用
成功的代码有多个,失败的代码也有多个
失败代码可能发生变化
1)多状态代码
一个函数在各种情况下返回的状态代码通常包含多个成功代码及多个失败代码。这就是我们为什么要使用SUCCEEDED及FAILED宏的原因。一般不能直接将HRESULT值同某个成功代码进行比较以决定某个函数是否成功,也不能直接将其同某个失败代码进行比较决定函数是否调用失败。
2)错误可能会发生变化

HRESULT的一些一般性规则:
1)不要将0x0000及0x1FF范围内的值作为返回代码。这些值是为COM所定义的FACILITY_ITF代码而保留的。
2)不要传播FACILITY_ITF错误代码
3)尽可能地使用通用的COM成功及失败代码。
4)避免定义自己的HRESULT,而可以在函数中使用一个输出函数。

GUID
// {0F4DD16B-6B31-4408-BAF3-F002637910B7}
static const GUID <<name>> =
{ 0xf4dd16b, 0x6b31, 0x4408, { 0xba, 0xf3, 0xf0, 0x2, 0x63, 0x79, 0x10, 0xb7 } };

CLSID关键字结构
COM只使用注册表的一个分支:HKEY_CLASSES_ROOT。可以看到有一个CISID关键字。
注册表中CLSID分支的结构 如下:

其中InprocServer32包含了DLL的名称。

一些特殊的关键字:
1)AppID
此关键字下的子关键字的作用是将某个APPID(应用程序ID)映射成某个远程服务器名称。分布式COM(DCOM)将用到此关键字。
2)组件类别
注册表的这一分支可以将CATID(组件类别ID)映射成某个特定的组件类别。
3)Interface
此关键字用于将IID映射成与某个接口相关的信息。
4)Licenses
保存的是授权使用COM组件的一些许可信息。
5)TypeLib
类型库关键字所保存的是关于接口成员 函数所用参数的信息,另外还有其他一些信息。



ProgID
注册表中HKEY_CLASSES_ROOT分支的大多数关键字都是ProgID。所谓ProgID指的是程序员给某个CLSID指定的一个程序员容易记的名称。

ProgID命名约定:
<Program>.<Component>.<Version>

ProgID注册表格式:

ProgID到CLSID转换:
CLSID clsid;
CLSIDFromProgID(L"Helicopter.TailRotor",&clsid);

自注册
由于DLL知道它所包含的组件,因此可以完成这些信息的注册。但由于DLL本身不能完成任何事情,因此在DLL中一定要输出如下两个函数:
STDAPI DllRegisterServer();
STDAPI DllUnRegisterServer();
DllRegisterServer的实现
DllRegisterServer的实现实际上是通过直接调用注册表函数来完成的。
RegOpenKeyEx
RegCreateKeyEx
RegSetValueEx
RegEnumKeyEx
RegDeleteKey
RegCloseKey

COM库的初始化
HRESULT CoInitialize(void* reserved);
void CoUninitialize();
OleInitialize的使用
OLE是建立在COM基础上的,它增加对类型库、剪贴板、拖放、ActiveX文档、自动化以及ActiveX控件的支持。
在需要使用时调用OleInitialize
不需要时调用UnOleInitialize












  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蚂蚁_CrkRes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值