近期在看《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的更多相关文章

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

    COM技术内幕(笔记) COM--到底是什么?--COM标准的要点介绍,它被设计用来解决什么问题?基本元素的定义--COM术语以及这些术语的含义.使用和处理COM对象--如何创建.使用和销毁COM对象 ...

  2. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

  3. 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(下)

    索引: 一.SQL Server的体系结构 二.查询 三.表表达式 四.集合运算 五.透视.逆透视及分组 六.数据修改 七.事务和并发 八.可编程对象 五.透视.逆透视及分组 5.1 透视 所谓透视( ...

  4. 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(上)

    索引: 一.SQL Server的体系结构 二.查询 三.表表达式 四.集合运算 五.透视.逆透视及分组 六.数据修改 七.事务和并发 八.可编程对象 一.SQL Server体系结构 1.1 数据库 ...

  5. Mysql技术内幕(第四版)读书笔记(一)

    题记:写代码已经有2年了,学到了很多知识,但是没有一个好习惯去记录,去分享,好多知识点都会忘记,所以从今天开始学着像大牛一样去记录自己经历项目的点点滴滴,先从最近读<Mysql技术内幕>开 ...

  6. 深入分析Java Web技术内幕(修订版)

    阿里巴巴集团技术丛书 深入分析Java Web技术内幕(修订版)(阿里巴巴集团技术丛书.技术大牛范禹.玉伯.毕玄联合力荐!大型互联网公司开发应用实践!) 许令波 著   ISBN 978-7-121- ...

  7. WebKit技术内幕

    WebKit技术内幕(浏览器内核|渲染引擎| HTML5| Chromium项目Committer重磅作品) 朱永盛 著   ISBN 978-7-121-22964-0 2014年6月出版 定价:7 ...

  8. 从Paxos到ZooKeeper-四、ZooKeeper技术内幕

    本文将从系统模型.序列化与协议.客户端工作原理.会话.服务端工作原理以及数据存储等方面来揭示ZooKeeper的技术内幕. 一.系统模型 1.1 数据模型 ZooKeeper的视图结构使用了其特有的& ...

  9. Spark技术内幕:Stage划分及提交源码分析

    http://blog.csdn.net/anzhsoft/article/details/39859463 当触发一个RDD的action后,以count为例,调用关系如下: org.apache. ...

随机推荐

  1. RH033读书笔记(5)-Lab 6 Exploring the Bash Shell

    Lab 6 Exploring the Bash Shell Sequence 1: Directory and file organization 1. Log in as user student ...

  2. 嵌入式Linux学习小结

    这两个月一直在学习Linux.作为一名刚開始学习的人,学习期间难免磕磕碰碰.走弯路,可是,抱着不怕失败.多尝试的信念,终于还是坚持下来了. 如今已经清楚Linux的框架,知道怎么去开发一个Linux程 ...

  3. 获取activity的根视图

    Activity的根视图是什么? Activity所谓的根视图,就是Activity的最底层的View,也就是在Acitivty创建的时候setContentView的时候传入的View. 如何获取到 ...

  4. uva133 The Dole Queue ( 约瑟夫环的模拟)

    题目链接: 啊哈哈,选我选我 思路是: 相当于模拟约瑟夫环,仅仅只是是从顺逆时针同一时候进行的,然后就是顺逆时针走能够编写一个函数,仅仅只是是走的方向的标志变量相反..还有就是为了(pos+flag+ ...

  5. cocos2d-html5

    cocos2d-html5 简单的混乱 在正常情况下,build设置完毕后 跑ant编 变更后cocos2d.js 简单直观so easy 只需要上传cocos2d.js/game.js/index文 ...

  6. IIS安装asp组件:JMail 邮件收发组件

    JMail简介 jmail是一种服务器端的邮件发送组件,和个人用的客户端邮件软件不一样的.jmail是在服务器上给程序用来发邮件用的,除了软件编程人员,其他人一般平常用不上. jmail是一个第三方邮 ...

  7. python遗传算法实现数据拟合(转)

    python据说功能强大,触角伸到各个领域,网上搜了一下其科学计算和工程计算能力也相当强,具备各种第三方包,除了性能软肋外,其他无可指摘,甚至可以同matlab等专业工具一较高下. 从网上找了一个使用 ...

  8. Linux之父:除了写内核代码 别的真不会(转)

    Linus Torvalds 是 Linux 之父,被誉为活着的传奇. 其实很多人不了解他也并不奇怪,因为人是在是太低调了.现年 46 岁的他每天的工作仍然是编程,领导并推动着 Linux 的发展. ...

  9. This Android SDK requires Android Developer Toolkit version 22.6.2 or above.

    今天,在android SDK升级时间,我遇到上述错误,经过一番努力仍克服. 解决方法:android-sdk-windows\tools\lib中间plugin.prop在文档 plugin.ver ...

  10. C#中调用c++的dll具体创建与调用步骤,亲测有效~

    使用的工具是VS2010哦~其他工具暂时还没试过 我新建的工程名是my21dll,所以会生成2个同名文件.接下来需要改动的只有画横线的部分 下面是my21dll.h里面的... 下面的1是自动生成的不 ...