【COM/ATL】纠错《COM技术内幕》之ProgID

最近在看《COM技术内幕》,看到第六章时发现该章节在解释ProgID时有点错误,特此记录一下,也给正在学习COM的小伙伴们一个提示。

而且我发现该问题存在于一些很多大型软件的COM组件中。(开发者估计都是看了该书吧)

在该书的6.3.5章节讲解了ProgID的在注册表中的格式,示例如下

注册表文件格式为

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\AA.BB\CLSID]
@="{00000000-F2ED-4CD4-9204-A1C28871DD2E}"

[HKEY_CLASSES_ROOT\AA.BB\CurVer]
@="AA.BB.1"

[HKEY_CLASSES_ROOT\AA.BB.1\CLSID]
@="{00000000-F2ED-4CD4-9204-A1C28871DD2E}"

(上面我故意将CLSID的第一节写为零了,仅仅只是为了读者容易区分后面的其他CLSID)

书中也讲到了,这么做的目的是为了客户在使用COM组件时可以通过“AA.BB”这个与版本无关的ProgID来映射到最新版本的组件

在上例中也就是“AA.BB.1”这个版本。引用书中的一段原话“与版本号无关的ProgID关键字Helicopter.TailRotor包含两个关键字CLSID及CurVer。”

也就是上面注册表文件中所描述的格式。为了验证书中所说的,我们把"AA.BB.1”的CLSID改一下

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\AA.BB\CLSID]
@="{00000000-F2ED-4CD4-9204-A1C28871DD2E}"

[HKEY_CLASSES_ROOT\AA.BB\CurVer]
@="AA.BB.1"

[HKEY_CLASSES_ROOT\AA.BB.1\CLSID]
@="{11111111-F2ED-4CD4-9204-A1C28871DD2E}"

那么是不是真的可以通过“AA.BB”映射到“AA.BB.1”呢?编写如下测试代码

#include "stdafx.h"
#include <iostream>
#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
	CLSID clsid;
	CLSIDFromProgID(L"AA.BB", &clsid);
	LPOLESTR str;
	StringFromCLSID(clsid, &str);
	std::wcout << str << std::endl;
	CoTaskMemFree(str);

	system("pause");
	return 0;
}

运行结果如图

很可惜,取到的CLSID还是“AA.BB”的,并非“AA.BB.1”的CLSID。

看到这里你也许会发现,在我们的系统中,有着这个问题的COM组件有很多,比如迅雷的

腾讯的

它们都无法从“与版本号无关的ProgID”映射到“具体版本的ProgID”。

一般来说升级COM组件的最佳方式还是升级内部接口的方式,如IX2、IX3等,并不会选择去添加一个新的COM组件的方式。

所以这个问题也不算是个问题。

回到正题,那么如何做才是正确的呢?其实很简单,只要把“AA.BB"的CLSID键删除即可

Windows Registry Editor Version 5.00

[-HKEY_CLASSES_ROOT\AA.BB\CLSID]

[HKEY_CLASSES_ROOT\AA.BB\CurVer]
@="AA.BB.1"

[HKEY_CLASSES_ROOT\AA.BB.1\CLSID]
@="{11111111-F2ED-4CD4-9204-A1C28871DD2E}"

这样,CLSIDFromProgID才会真正的工作正常,再次运行测试程序得到”AA.BB.1“的CLSID

CLSIDFromProgID会查找用户指定的ProgID,如果其下有子键”CLSID“的话,则认为该ProgID是一个具体版本的。

否则该ProgID只是起到映射的作用,它实际会跳到”CurVer“键所指向的ProgID。

《COM技术内幕》中所讲到的与版本无关的ProgID都添加了CLSID键,这样会导致该ProgID不是一个能映射的ProgID。

【COM/ATL】纠错《COM技术内幕》之ProgID,布布扣,bubuko.com

时间: 2024-10-27 07:27:44

【COM/ATL】纠错《COM技术内幕》之ProgID的相关文章

纠错《COM技术内幕》之ProgID

最近在看<COM技术内幕>,看到第六章时发现该章节在解释ProgID时有点错误,特此记录一下,也给正在学习COM的小伙伴们一个提示. 而且我发现该问题存在于一些很多大型软件的COM组件中.(开发者估计都是看了该书吧) 在该书的6.3.5章节讲解了ProgID的在注册表中的格式,示例如下 注册表文件格式为 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\AA.BB\CLSID] @="{00000000-F2ED-4CD4

【转】COM技术内幕(笔记)

COM技术内幕(笔记) COM--到底是什么?--COM标准的要点介绍,它被设计用来解决什么问题?基本元素的定义--COM术语以及这些术语的含义.使用和处理COM对象--如何创建.使用和销毁COM对象.基本接口--描述IUnknown基本接口及其方法. 掌握串的处理--在COM代码中如何处理串.应用COM技术--例子代码,举例说明本文所讨论的所有概念. 处理HRESULT--HRESULT类型描述,如何监测错误及成功代码.COM--到底是什么? 简单地说,COM是一种跨应用和语言共享二进制代码的

COM技术内幕(笔记)

COM--到底是什么?--COM标准的要点介绍,它被设计用来解决什么问题?基本元素的定义--COM术语以及这些术语的含义.使用和处理COM对象--如何创建.使用和销毁COM对象.基本接口--描述IUnknown基本接口及其方法. 掌握串的处理--在COM代码中如何处理串.应用COM技术--例子代码,举例说明本文所讨论的所有概念. 处理HRESULT--HRESULT类型描述,如何监测错误及成功代码. COM--到底是什么? 简单地说,COM是一种跨应用和语言共享二进制代码的方法.与C++不同,它

2本Hadoop技术内幕电子书百度网盘下载:深入理解MapReduce架构设计与实现原理、深入解析Hadoop Common和HDFS架构设计与实现原理

这是我收集的两本关于Hadoop的书,高清PDF版,在此和大家分享: 1.<Hadoop技术内幕:深入理解MapReduce架构设计与实现原理>董西成 著  机械工业出版社2013年5月出版 2.<Hadoop技术内幕:深入解析Hadoop Common和HDFS架构设计与实现原理>蔡斌.陈湘萍 著  机械工业出版社2013年4月出版 百度网盘下载地址: http://pan.baidu.com/s/1sjNmkFj

MySQL技术内幕-InnoDB存储引擎-读书笔记(二)

MySQL技术内幕-InnoDB存储引擎-读书笔记(二) 作为php开发,使用mysql总是少不了的 系列文章博客链接 http://itsong.net/articles/466.html 第三章 文件 mysql与innodb几个类型的文件 参数文件,配置路径.初始化参数.内存大小等 日志文件,包括错误日志,二进制日志,慢查询日志,查询日志 socket文件,用unix域套接字,unix domain socket来进行连接时需要的文件,这一般是本机连接,比通常tcp快 pid文件,进程id

Struts2技术内幕 读书笔记一 框架的本质

本读书笔记系列,主要针对陆舟所著<<Struts2技术内幕 深入解析Strtus2架构设计与实现原理>>一书.笔记中所用的图片若无特殊说明,就都取自书中,特此声明. 什么是框架?我们为什么要用框架?框架能给我们带来什么? 这几个问题既简单又复杂.说它简单,是因为框架确实存在在软件设计中,说它复杂是因为我们现在所使用的框架不论是spring还是struts都是经过多年的发展,其内部已经十分庞杂了,因此想一句话两句话说清楚一个框架就不是那么简单了. OK,既然现有的框架都很复杂,那我们

Hadoop技术内幕HDFS-笔记2

任何一个复杂的软件系统,为了提高其适应性和扩展性,一般都会有一个配置模块或者配置系统,作完成其扩展.定制的手段和方式. 1.1.  Windows的配置文件 (第一次知道这事啊): 采用的是ini后缀的文本文件,可通过动态链接库提供方法进行处理. 初始化文件或profile概要文件 1.2.  Java配置文件: Properties文件 Xml文件 工具:Apache Commons Configuration 用于对配置文件进行常用的操作. Hadoop configuration Hado

《mysql技术内幕 InnoDB存储引擎(第二版)》阅读笔记

一.mysql架构 mysql是一个单进程多线程架构的数据库. 二.存储引擎 InnoDB: 支持事务 行锁 读操作无锁 4种隔离级别,默认为repeatable 自适应hash索引 每张表的存储都是按主键的顺序记性存放 支持全文索引(InnoDB1.2.x - mysql5.6) 支持MVCC(多版本并发控制)实现高并发 MyISAM: 不支持事务 表锁 支持全文索引 三.InnoDB体系架构 1.后台线程 Master Thread 负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性 IO

MySQL技术内幕-InnoDB存储引擎-读书笔记(一)

MySQL技术内幕-InnoDB存储引擎-读书笔记(一) 作为php开发,使用mysql总是少不了的 博客链接 http://itsong.net/articles/466.html 第一章 MySQL体系结构和存储引擎 MySQL被设计为一个单进程多线程架构的数据库 ./mysql --help | grep my.cnf 可以查看mysql数据库实例启动时,它会在哪些位置查找配置文件. 配置文件中有一个datadir参数,指定了数据库所在的路径.默认为/usr/local/mysql/dat