Inside COM学习笔记(五)

原创 2007年10月09日 14:03:00
   关于HRESULT、GUID、注册表及其他细节
COM使用HRESULT来向用户报告各种情况。HRESULT并不完全是指向某个结果的句柄。HRESULT实际上是一个可分成三个位域的32位值。
系统生成的HRESULT值在win32的WINERROR.H中定义。HRESULT的低16位就是函数的返回代码,其余15位包含的此类型及返回值起源的更详细的信息。
为了显示标准的COM错误消息,可以使用win32 API的FormatMessage函数。

GUID
Microsoft提供了两个建立GUID的程序一个是UUIDGEN.EXE;一个是GUIDGEN.EXE。

OBJBASE.H定义了DEFINE_GUID宏,可以利用该宏来定义接口的GUID
#include <objbase.h>
DEFINE_GUID (IID_IX,0x32bb8320, 0xb41b, 0x11cf,
  {0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}

CLSID
除了接口可以用GUID来标识,组件也可以用GUID来标识。在COM中标识组件的GUID被称为类标识符,即CLSID。

通过引用传递GUID值
因为一个GUID占16个字节,所以一般不用值传递GUID参数,而采用引用传递方式。
如果不想写const IID&,当然也可以使用等价的REFIID/REFCLSID/REFGUID。

                                  windows注册表
组件在系统中注册它们以便客户可以找到它并使用它。
在前面我们需要将包含有待创建组件的DLL名称传递给CallCreateInstance。在windows中,注册表是Windows os系统的一个正式的共享系统数据库。注册表中包含关于系统中硬件、软件、配置以及用户的各种信息。
注册表是由许多元素构成的层次结构,每一个元素均被称作是一个关键字。

注册表编辑器:regedit.exe

CLSID关键字结构
COM只使用了注册表的一个分支:HKEY_CLASS_ROOT.在次关键字之下有一个CLSID关键字。在CLSID下是系统的所以组件的CLSID,格式串如下:{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx}。

对于每个16个字节的CLSID串下面会有写子关键字信息:


Implemented Categories
InprocServer32
ProgID
Programmable
TypeLib
Version
VersionIndependentProgID

其中InprocServer32的关键字的缺省值就是组件所在的DLL文件名称。
ProgID是程序员给某个CLSID指定的一个容易记的名称。
在CLSD目录下除了16个字节的位串就是这些ProgID。
ProgID具有如下格式:
<program>.<component>.<version>

ProgID及与版本无关的ProgID都被列在组件CLSID下面,方便查询。其实在每个ProgID下面有个名CLSID的关键字,其缺省值为组件的CLSID。和下面列出的所有CLSID中一个对应。
与版本无关的ProgID下面除了CLSID关键字外,还有一个CurVer表明是当前系统中的该组件的版本

ProgID到CLSID的转换
com库提供了两个函数CLSIDFromProgID和ProgIDFromCLSID。
CLSID clsid;
CLSIDFromProgID(L"helibopter.Tailrotor",&clsid);

为了在组件中发布组件的信息,DLL必须输出如下两个函数
STDAPI DllRegisterServer();
STDAPI DllUnRegisterServer();
其中STDAPI在objbase.h中定义:
#define STDAPI EXTERN_C HRESULT STDAPICALLTYPE
展开之后就是
extern "c" HRESULT __stdcall

另外一个超级好用的查看组件注册信息的工具:OleView.exe 用法和regedit一样。

 

《COM原理与应用》学习笔记

 为了学习ActiveX插件的编写,从这几天开始学习COM原理。ActiveX是以COM为基础的,所以要想要比较深入的学习ActiveX技术需要先学习COM原理。   COM是微软提出的组件标...
  • dennisxie1992
  • dennisxie1992
  • 2014年09月08日 17:14
  • 528

yii2基础(五)

Yii中的Gii与Url处理 代码自动生成 从1.1.2版本开始,Yii包含一个代码生成工具Gii。它取代了以前的yiic shell命令行。现在我们开始描述如何使用Gii和如何扩展G...
  • CareChere
  • CareChere
  • 2016年04月26日 10:11
  • 698

Inside COM读书笔记------接口

1.接口的作用 组件可以充应用程序中删除并可用另外一个组件代替,只要新的组件支持同样的接口。单个组件并不能起决定性作用,相反,用以连接组件的接口对应用程序亲戚到决定性作用。使用组件来构成应用...
  • wangqiulin123456
  • wangqiulin123456
  • 2013年05月09日 19:01
  • 1734

Inside COM读书笔记-----多线程

1.      COM线程模型 COM并没有定义新的线程和进程模型,而是直接使用Win32线程。 1.1Win32线程          典型的Win32线程具有两种不同...
  • wangqiulin123456
  • wangqiulin123456
  • 2013年05月22日 21:24
  • 2245

mybatis学习笔记(5)-配置文件

本文主要讲解SqlMapConfig配置文件
  • h3243212
  • h3243212
  • 2016年02月28日 13:57
  • 2698

深度学习笔记(五):LSTM

看到一篇讲LSTM非常清晰的文章,原文来自Understanding LSTM Networks , 译文来自理解LSTM网络Recurrent Neural Networks人类并不是每时每刻都从一...
  • u014595019
  • u014595019
  • 2016年09月21日 11:04
  • 16018

重读COM技术内幕(inside com)有感

重读COM技术内幕(inside com)有感面向对象设计哲学在复杂领域并不能很好地解决问题。参考(http://www.richardlord.net/blog/what-is-an-entity-...
  • cheungmine
  • cheungmine
  • 2016年06月07日 12:59
  • 6338

COM学习笔记(五):CoCreateInstance

在COM库中包含一个用于创建组件的名为CoCreateInstance的函数。此函数需要一个CLSID参数,创建相应组件的一个实例,并返回此组件的某个 接口。 COCreateInstance的声...
  • u010002704
  • u010002704
  • 2014年09月03日 17:56
  • 452

《Inside C#》笔记(五) 方法

方法用来体现类的行为。 一 相关概念 a) ref和out 通常一个方法只能返回一个值,但如果确实需要返回多个值时,可以使用ref或out。如果方法的参数被标注为ref或out,在调用该方法时,...
  • zhixin9001
  • zhixin9001
  • 2017年06月20日 21:34
  • 62

Inside COM读书笔记-----包容和聚合

1.      包容和聚合 包容和聚合实际上是使一个组件使用另一个组件的一种技术。 包容简介          外部组件包含指向内部组件接口的指针,外部组件只是内部组件的一个客户。外部组件也可以...
  • wangqiulin123456
  • wangqiulin123456
  • 2013年05月22日 20:57
  • 2608
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Inside COM学习笔记(五)
举报原因:
原因补充:

(最多只允许输入30个字)