最近在看《COM技术内幕》,看到第六章时发现该章节在解释ProgID时有点错误,特此记录一下,也给正在学习COM的小伙伴们一个提示。
而且我发现该问题存在于一些很多大型软件的COM组件中。(开发者估计都是看了该书吧)
在该书的6.3.5章节讲解了ProgID的在注册表中的格式,示例如下
注册表文件格式为
-
WindowsRegistryEditorVersion5.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改一下
-
WindowsRegistryEditorVersion5.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(intargc,_TCHAR*argv[])
-
{
-
CLSIDclsid;
-
CLSIDFromProgID(L"AA.BB",&clsid);
-
LPOLESTRstr;
-
StringFromCLSID(clsid,&str);
-
std::wcout<<str<<std::endl;
-
CoTaskMemFree(str);
-
-
system("pause");
-
return0;
-
}
运行结果如图
很可惜,取到的CLSID还是“AA.BB”的,并非“AA.BB.1”的CLSID。
看到这里你也许会发现,在我们的系统中,有着这个问题的COM组件有很多,比如迅雷的
腾讯的
它们都无法从“与版本号无关的ProgID”映射到“具体版本的ProgID”。
一般来说升级COM组件的最佳方式还是升级内部接口的方式,如IX2、IX3等,并不会选择去添加一个新的COM组件的方式。
所以这个问题也不算是个问题。
回到正题,那么如何做才是正确的呢?其实很简单,只要把“AA.BB"的CLSID键删除即可
-
WindowsRegistryEditorVersion5.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。
原文:http://blog.csdn.net/aqtata/article/details/36915823
分享到:
相关推荐
对纠错技术详细介绍,对初学纠错技术的人来说是一本不错的书
在实际研究中,经常需要对传输数据进行纠错,而现有的纠错技术中,卷积码是一种非常高效的技术,但是其实现原理并不简单,本资源是将写好的(2,1,2)卷积码用C++封装成类,程序接口适合不同项目的调用,是一个很好的...
在当前的移动通信领域,4G作为第四代移动通信技术,已广泛应用于全球范围内,其背后的技术支撑之一便是纠错编码技术,而LDPC码(低密度奇偶校验码)正是其中的佼佼者。LDPC码是一种强大的线性纠错码,它以其高效的...
计算机网络的网络纠错技术在现代通信系统中扮演着至关重要的角色。这些技术旨在检测和纠正数据传输过程中的错误,确保信息的准确无误地到达目的地。在“C 计算机网络”这一主题中,我们将深入探讨网络纠错的原理、...
纠错码技术是一种在数据存储和传输过程中用于错误检测和纠正的编码方式。Hadoop是一个由Apache基金会开发的开源分布式存储与计算框架,广泛应用于大数据的存储和处理。HDFS,即Hadoop分布式文件系统,是Hadoop项目的...
ChatGPT 技术与自动纠错技术的结合应用 ChatGPT 技术是自然语言处理领域的一种主要技术,通过预先训练大量的语料库数据,可以生成高质量、连贯的文本回复。然而,ChatGPT 技术存在一些限制,例如训练数据的局限性...
作者: 陈宗杰,左孝彪出版社: 人民邮电出版社 出版年: 1987ISBN:7-115-03494-x
本次提交的资源是杰林码信道纠错算法的DEMO,旨在为大家提供一个可以用来测试验证王杰林先生的纠错理论。
纠错编码的发展历程是现代通信和信息存储技术中一个极为重要的部分,其理论基础和实际应用的演进极大地提高了数据通信的准确性和可靠性。 纠错编码的基本概念涉及到为什么需要引入纠错码,以及它们在通信系统中扮演...
为了应对这些问题,纠错编码技术成为了关键解决方案之一。 #### 二、纠错码技术概述 纠错码技术是一种通过在原始数据中添加额外的冗余信息来提高数据传输可靠性的方法。这种方法可以在接收端检测并纠正传输过程中...
ChatGPT技术的生成质量监控和自动纠错技术策略 ChatGPT 技术是由 OpenAI 开发的一种自然语言生成模型,它可以用于生成对话和回答问题。然而,由于其自由度较高,其生成结果有时会存在错误或者不恰当的内容。为了...
java面试题中有一种代码纠错问题,现总结了几道代码错误问题
基于JAVA 纠错码的冗余技术的研究——EVENODD码的设计与实现.zip基于JAVA 纠错码的冗余技术的研究——EVENODD码的设计与实现.zip基于JAVA 纠错码的冗余技术的研究——EVENODD码的设计与实现.zip基于JAVA 纠错码的...
总结来说,OTN中的前向纠错技术FEC是克服光纤传输过程中色散和非线性效应的关键技术之一,通过在硬件层面上使用FPGA等可编程设备,能够高效实现FEC编译码器的设计与验证,进而确保光通信系统的可靠性和效率。
RS(里德索罗门)纠错算法是一种常用的纠错编码技术,广泛应用于数据存储和传输中。下面将对RS纠错算法的原理、计算过程、相关知识进行详细介绍,并结合RS(11,4)进行举例。 一、GF(2m)域 在RS编码理论中,GF...
在分析《基于深度学习技术的语法纠错算法模型构建分析.pdf》这篇专业文献之前,首先需要指出,文档中出现的OCR扫描错误和识别问题对阅读理解造成了一定的困扰。尽管如此,我们仍然可以从中提炼出丰富的专业知识点。...