近期在看《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. Android开发框架SmartAndroid2.0 强劲框架

    SmartAndroid 是一个功能强劲的 Android 框架,作为一个简单而"优雅"的工具库包,它能够为 Android 开发人员建立功能完好的Android 应用程序. 经过 ...

  2. hdu N!

    Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in o ...

  3. 构建安全的Xml Web Service系列之初探使用Soap头

    原文:构建安全的Xml Web Service系列之初探使用Soap头 Xml Web Service 从诞生那天就说自己都么都么好,还津津乐道的说internet也会因此而进入一个新纪元,可5年多来 ...

  4. Android - 数据存储 -在SQL数据库中保存数据

    对于重复的或结构化的数据,保存到数据库中是很好的选择,比如联系人信息.这里假设你对SQL数据库大体上了解然后帮助你学习Android上的SQLite数据库.在Android数据库上需要用到的API可以 ...

  5. unix pwd使用命令

    [语法]:     pwd [说明]:    此命令会显示当前的工作文件夹 []: pwd     这显示当前工作文件夹 版权声明:本文博主原创文章.博客,未经同意不得转载.

  6. HDU 5095 Linearization of the kernel functions in SVM(模拟)

    主题链接:http://acm.hdu.edu.cn/showproblem.php? pid=5095 Problem Description SVM(Support Vector Machine) ...

  7. Codeforces Beta Round #3 A. Shortest path of the king

    标题效果: 鉴于国际棋盘两点,寻求同意的操作,是什么操作的最小数量,在操作过程中输出. 解题思路: 水题一个,见代码. 以下是代码: #include <set> #include < ...

  8. mysql1130远程连接没有权限解决方法

    原因擅自在两个远程连接,一种是由于mysql限制,一个是防火墙限制. 1,解决防火墙限制: 于mysql服务主机将关闭防火墙,或者在防火墙高级设置这增加了入站和出站规则,加号mysql的port.同意 ...

  9. MEF初体验之十:部件重组

    一些应用程序被设计成在运行时可以动态改变.例如,一个新的扩展被下载,或者因为其它的多种多样的原因其它的扩展变得不可用.MEF处理这些多样的场景是依赖我们称作重组的功能来实现的,它可已在最初的组合后改变 ...

  10. 【Unity 3D】学习笔记三十五:游戏实例——摄像机切换镜头

    摄像机切换镜头 在游戏中常常会切换摄像机来观察某一个游戏对象,能够说.在3D游戏开发中,摄像头的切换是不可或缺的. 这次我们学习总结下摄像机怎么切换镜头. 代码: private var Camera ...