COM技术内幕--关于HRESULT、GUID、注册表及其他细节
2016-12-15 15:59
387 查看
HRESULT
这就是结果:Here's the RESULT
HRESULT 结构如下 :
////////////////////////
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
这就是结果: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 | 没有指定的失败。 |
成功的代码有多个,失败的代码也有多个
失败代码可能发生变化
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
相关文章推荐
- COM技术内幕第六章笔记-HRESULT、GUID、注册表及其他
- 第6章 关于HRESULT、GUID、注册表及其他细节
- COM 技术内幕学习之六 (HRESULT,GUID)
- Inside COM读书笔记-----关于HRESULT、GUID、注册表及其它细节
- Inside COM读书笔记-----关于HRESULT、GUID、注册表及其它细节
- COM中的HRESULT, CLISD,ProgID, DLL注册,COM库函数的知识(COM技术内幕笔记之三)
- COM中的HRESULT, CLISD,ProgID, DLL注册,COM库函数的知识(COM技术内幕笔记之三)
- 关于一个VC++6.0技术内幕的COM错误问题,错误信息:error C2504: 'IMotion' : base class undefined
- 关于OLE技术!(OLE/ActiveX/COM)
- COM程序的简单实现(COM技术内幕笔记之一)
- 动态链接库实现COM(COM技术内幕笔记之二)
- ***求书***COM技术内幕
- COM 技术内幕学习之九 (简化程序编写)
- COM技术内幕
- 内存管理内幕--Jonathan Bartlett (johnnyb@eskimo.com), 技术总监, New Media Worx--
- COM技术内幕学习笔记(2)
- COM 技术内幕学习之七 (类厂)
- com技术内幕
- 关于EPOLL的ET与LT工作模式及其他细节
- COM学习笔记六《COM技术内幕》§6 —— HRESULT、GUID和注册表