COM原理
+ -

COMM CSID和GUID

2022-02-16 30 0

Office的Word中可以插入EXCEL数据,我们知道是通过Word存储的复合文件功能来实现的。那么当WORD程序读取复合文件,遇到EXCEL数据时,它该如何启动Excel呢?启动后,又如何让Excel自己去读入、解析、显示xls数据呢?

CLSID概念

有一个非常简单的解决方案,那就是在对象数据的前面,保存有处理这个数据的程序名。
EXCEL CLSID

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\LocalServer]
@="C:\\PROGRA~1\\MICROS~1\\Office15\\EXCEL.EXE /automation"
"LocalServer"=zqP^V5!!!!4!!!!MKKSkEXCELFiles>Of1RD?I9b9j[2hL]KhO& /automation

这的确是一个简单方法,但问题也很严重。在“张三”的计算机上,Excel路径是:”c:\office\Excel.exe”,如果把这个doc文件复制到“李四”计算机上使用,而“李四”的Excel路径是:”d:\Program files\Microsoft Office\Office\Excel.exe”
于是,微软想出了一个解决方案,不使用直接路径表示,而使用CLSID间接描述这些对象数据的处理程序路径。CLSID其实就是一个16字节的数。在HKCR\CLSID{……}主键下,在LocalServer32(DLL组件使用InprocServer32)中保存程序路径名。
CLSID结构定义:

typedef struct { 
                DWORD Data1;    //随机数
                WORD Data2;        //和时间相关
                WORD Data3;        //和时间相关
                BYTE Data4[8];     //和网卡MAC相关
                } GUID;        

typedef GUID CLSID;            //组件ID
typedef GUID IID;            //接口ID
#define REFCLSID const CLSID &

常见的声明和赋值方法

CLSID CLSID_Excel = {0x00024500,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};
struct __declspec(uuid("00024500-0000-0000-C000-000000000046"))CLSID_Excel;
class DECLSPEC_UUID("00024500-0000-0000-C000-000000000046")CLSID_Excel;

注册表中的表示方法

{00024500-0000-0000-C000-000000000046}

用一个值间接表示程序名,实现了组件位置的透明,并方便地扩展出DCOM(远程组件)。
但CLSID是一个16个字节共128位的二进制数,干吗这么长?想当初,设计socket用TCP/IP协议进行网络通讯。每个参与通讯的计算机都有一个4字节的IP表示编号地址,范围是0,0,0,0~255,255,255,255共42亿个地址。
没想到,自从Internet选择TCP/IP协议后,42亿个地址不够啦。前车之鉴,微软设计CLSID/IID时,使用了16字节的GUID表示。这下好啦,全世界60亿人口,每个人每秒钟分配10亿个号码,需要分配1800亿年。

CSID其实用的是GUID的概念

生成CLSID

1.使用开发环境编写组件程序,IDE会自动产生CLSID;
2.程序中可用函数CoCreateGuid产生CLSID;
3.使用工具程序GuidGen.exe产生GUID;

0 篇笔记 写笔记

Windows Inf文件设备GUID分类(设备安装程序类)
Class=SystemClassGuid={4d36e97d-e325-11ce-bfc1-08002be10318}Class=USBClassGuid={36FC9E60-C465-11CF-8056-444553540000}Class=AudioClassGuid={4d36e96c-......
使用CLSIDFromString将字符串GUID转化成十六进制GUID/UUID
Windows的一般会给相同类型的设备接口注册相同的GUID,但GUID有时别人给的是一个字符串,但是在实际使用过程中我们又使用的是GUID类型,其结构定义如下:typedef struct _GUID { unsigned long Data1; unsigned short ......
Windows驱动预定义设备GUID
全球唯一标识符 (GUID) 是一个字母数字标识符,用于指示产品的唯一性安装。在许多流行软件应用程序(例如 Web 浏览器和媒体播放器)中,都使用 GUIDGUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内......
SetupAPI函数实现设备分类GUID和类名之间的转换SetupDiClassNameFromGuidEx和SetupDiClassGuidsFromNameEx
类名与其GUID之间的切换 GUID guid; ULONG rtn = 0; if (SetupDiClassGuidsFromNameEx(TEXT("USB"), &guid, 1, &rtn, NULL, N......
SetupAPI 根据类GUID获取类描述符信息SetupDiGetClassDescriptionEx
Windows设备的一种管理方式就是在安装设备驱动的时候,通过INF文件中的Class和ClassGUID来设置,如Class=USBClassGuid={36FC9E60-C465-11CF-8056-444553540000}当设备驱动安装后,可以通过SetupDiClassNameFro......
COM全局唯一标识符GUID
COM规范采用了128位全局唯一标识符GUID来标识对象和接口,这是一个随机数,并不需要专门机构进行分配和管理。因为GUID是个随机数,所以并不绝对保证唯一性,但发生标识符相重的可能性非常小。从理论上讲,如果一台机器每秒产生10000000个GUID,则可保证(概率意义上)的3240年不重复)。GU......
COM 类厂和DllGetObjectClass函数
类厂是COM对象的生产基地,COM库通过类厂创建COM对象;对应每一个COM类,都有一个类厂,用于该COM类的对象创建操作。类厂本身也是一个COM对象,它支持一个特殊接口(IClassFactory):class IClassFactory:public IUnknown{ virtua......
COMM CSID和GUID
Office的Word中可以插入EXCEL数据,我们知道是通过Word存储的复合文件功能来实现的。那么当WORD程序读取复合文件,遇到EXCEL数据时,它该如何启动Excel呢?启动后,又如何让Excel自己去读入、解析、显示xls数据呢?CLSID概念有一个非常简单的解决方案,那就是在对象数据的......
COM 根据CLSID获取ProgID
void GetProgID(){ CoInitialize(NULL); //{000209FF-0000-0000-C000-000000000046} = word.application LPOLESTR lpwProgID = NULL; ......
使用C语言生成GUID
Windows系统&Linux系统获取uuid统一通用代码:#include #include #include #ifdef WIN32#include ......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!