纠错《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. ...
随机推荐
- CentOS7 已安装telnet维修
今天搞下 Centos 7 以下升级 openssl 和 openssh ,顺便说下安装 telnet # 设备 telnet 避 ssh 无法登录 yum -y install xinetd tel ...
- 移动web:Tips消息弹出框
在web开发中经常会用到像alert这样的弹出消息,每个浏览器自带的消息弹出框都不相同.为了统一外观,实现自定义的功能,动手写一个弹出框插件. 对弹出框的实现要求如下: 1. 仿照IOS系统弹出外观 ...
- Codeforces Round #256 (Div. 2) D. Multiplication Table 二分法
D. Multiplication Table time limit per test 1 second memory limit per test 256 megabytes input st ...
- SRM 620 D2L3: RandomGraph, dp
称号:http://community.topcoder.com/stat? c=problem_statement&pm=13143&rd=15853 參考:http://apps. ...
- codeforces Round #260(div2) D解决报告
D. A Lot of Games time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- github jekyll site不再使用Maruku由于Markdown翻译员,但kramdown
今天写了一篇博客,之push至jekyll site on github在,发现总是错的,例如,下面的电子邮件消息: The page build completed successfully, bu ...
- iphone6 plus有什么办法
在苹果9月9号最新的秋季公布会上苹果官方公布了最新的iPhone6 plus,可能非常多朋友不知道plus是什么意思,这样命名有什么特殊的意义呢?本次Ly经典家居小编就为大家带来这方面的具体解答,一起 ...
- Ubuntu 14.04 Android 使用Maven一个 用例project
在说明书前面描述SDK通过使用Ant发展. 本文试图在此基础上使用Maven发展. 在这里,我们需要使用maven-android-plugin. 在本文中,参考官方文件: https://code. ...
- Linux环境Eclipse + Tomcat + MySQL 构造J2EE方法开发环境
1. 版本号信息 (1)CentOS 6.4释64位置.uname -a 下面的示例演示显著样本: Linux localhost.localdomain 3.11.6 #1 SMP Sat Nov ...
- Java Web整合开发(14) -- Struts 1.x 概述
整合Spring与Struts1的三种方法总结 无论用那种方法来整合,第一步就是要装载spring的应用环境,有三种方式: #1. struts-config.xml <?xml version ...