您的位置:首页 > 产品设计 > UI/UE

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

2016-12-15 15:59 387 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: