纠错《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的第一节写为零了,只不过为了读者easy区分后面的其它CLSID)
书中也讲到了,这么做的目的是为了客户在使用COM组件时能够通过“AA.BB”这个与版本号无关的ProgID来映射到最新版本号的组件
在上例中也就是“AA.BB.1”这个版本号。引用书中的一段原话“与版本号号无关的ProgIDkeywordHelicopter.TailRotor包括两个keywordCLSID及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组件的方式。
所以这个问题也不算是个问题。
回到正题,那么怎样做才是正确的呢?事实上非常easy,仅仅要把“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技术内幕》之ProgID的更多相关文章
- 【转】COM技术内幕(笔记)
COM技术内幕(笔记) COM--到底是什么?--COM标准的要点介绍,它被设计用来解决什么问题?基本元素的定义--COM术语以及这些术语的含义.使用和处理COM对象--如何创建.使用和销毁COM对象 ...
- SQL Server技术内幕笔记合集
SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...
- 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(下)
索引: 一.SQL Server的体系结构 二.查询 三.表表达式 四.集合运算 五.透视.逆透视及分组 六.数据修改 七.事务和并发 八.可编程对象 五.透视.逆透视及分组 5.1 透视 所谓透视( ...
- 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(上)
索引: 一.SQL Server的体系结构 二.查询 三.表表达式 四.集合运算 五.透视.逆透视及分组 六.数据修改 七.事务和并发 八.可编程对象 一.SQL Server体系结构 1.1 数据库 ...
- Mysql技术内幕(第四版)读书笔记(一)
题记:写代码已经有2年了,学到了很多知识,但是没有一个好习惯去记录,去分享,好多知识点都会忘记,所以从今天开始学着像大牛一样去记录自己经历项目的点点滴滴,先从最近读<Mysql技术内幕>开 ...
- 深入分析Java Web技术内幕(修订版)
阿里巴巴集团技术丛书 深入分析Java Web技术内幕(修订版)(阿里巴巴集团技术丛书.技术大牛范禹.玉伯.毕玄联合力荐!大型互联网公司开发应用实践!) 许令波 著 ISBN 978-7-121- ...
- WebKit技术内幕
WebKit技术内幕(浏览器内核|渲染引擎| HTML5| Chromium项目Committer重磅作品) 朱永盛 著 ISBN 978-7-121-22964-0 2014年6月出版 定价:7 ...
- 从Paxos到ZooKeeper-四、ZooKeeper技术内幕
本文将从系统模型.序列化与协议.客户端工作原理.会话.服务端工作原理以及数据存储等方面来揭示ZooKeeper的技术内幕. 一.系统模型 1.1 数据模型 ZooKeeper的视图结构使用了其特有的& ...
- Spark技术内幕:Stage划分及提交源码分析
http://blog.csdn.net/anzhsoft/article/details/39859463 当触发一个RDD的action后,以count为例,调用关系如下: org.apache. ...
随机推荐
- JTree demo
JFrame居中方法一: setLocationRelativeTo(null); 注意:必须在整个frame初始化完成后再加上此语句,否则将显示在屏幕右下角 方法二: private Dimen ...
- PC2日记——坑爹的第一天2014/08/28
我不想安慰自己说今天是因为第一次将pc2用于实际的比赛经验不足而导致的今天出现种种问题,我想说的是自从我開始干后台我所做的每一件事都是第一次,所以这绝对不是让自己免去责怪的理由:我想说的是假设我今天是 ...
- 密码 hdu
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submission(s) ...
- NEON简单介绍
个128位四字寄存器Q0-Q15,32个64位双字寄存器D0-D31,两个寄存器是重叠的,在使用的时候须要特别注意,不小心就会被覆盖掉. NEON的数据类型:无符号整数.有符号整数.未指定类型的整数. ...
- 解决新版Emacs的警告:Warning (initialization): Your load-path...
升级到新版Emacs后出现警告 作为做好用的代码编辑器之一,Emacs绝对在极客世界实用率很高.当然VIM也有很多支持者.但小编是从VIM转到Emacs的,个人觉得Emacs更好用. 小编最近升级了F ...
- 【Android基础】listview控件的使用(4)-----自定义布局的listview的使用
前面我介绍了listview控件的不同用法,但是这些用法在实际的开发项目中是不足以满足需求的,因为前面的几种用法只能简单的显示文本信息,而且布局都比较单一,很难做出复杂的结果,在实际的开发项目中,90 ...
- HDU 3715 Go Deeper(2-sat)
HDU 3715 Go Deeper 题目链接 题意:依据题意那个函数,构造x数组.问最大能递归层数 思路:转化为2-sat问题,因为x仅仅能是0.1,c仅仅能是0,1.2那么问题就好办了,对于0, ...
- 【007】【JVM——内存分配和恢复策略】
内存分配与收回策略 JVM的自己主动内存管理要自己主动化地解决两个问题:对象分配内存以及回收分配给对象的内存.回收内存前几篇已经讲了.如今说内存分配.对象的内存分配一般分配在堆内存中,也可能经过 ...
- BigPipe设计原理
高性能页面加载技术--BigPipe设计原理及Java简单实现 1.技术背景 动态web网站的历史可以追溯到万维网初期,相比于静态网站,动态网站提供了强大的可交互功能.经过几十年的发展,动态网站在互动 ...
- WPF学习(10)模板
在前面一篇我们粗略说了Style和Behaviors,如果要自定义一个个性十足的控件,仅仅用Style和Behaviors是不行的,Style和Behaviors只能通过控件的既有属性来简单改变外观, ...