纠错《COM技术内幕》之ProgID

一如当初 2014-07-04 09:55:29
加精
学习过程中发现该书的一处错误,怕误导新人,特此记录一下。
http://blog.csdn.net/aqtata/article/details/36915823
...全文
1108 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
fuckhollyshift 2015-07-14
  • 打赏
  • 举报
回复
本人觉得要最新的CLSID比较好,这样可以避免误解。
走你_ 2014-07-15
  • 打赏
  • 举报
回复
好人啊,水水
邓学彬 2014-07-14
  • 打赏
  • 举报
回复
感谢分享,学习一下
the_seal_of_love 2014-07-14
  • 打赏
  • 举报
回复
我也要好好学习一下
super_admi 2014-07-13
  • 打赏
  • 举报
回复
俺也是这么干的。若要纯手工去做,不觉得麻烦吗?
引用 26 楼 mmxida 的回复:
樓主專研精神可嘉。 我在實際開發中,一般先import組件,然後使用編譯器自動生成的CLSID來創建實例。
  • 打赏
  • 举报
回复
樓主專研精神可嘉。 我在實際開發中,一般先import組件,然後使用編譯器自動生成的CLSID來創建實例。
万物同源 2014-07-12
  • 打赏
  • 举报
回复
xusir98 2014-07-10
  • 打赏
  • 举报
回复
lhw7791086 2014-07-10
  • 打赏
  • 举报
回复
bulleyes 2014-07-10
  • 打赏
  • 举报
回复
首次回帖
向立天 2014-07-09
  • 打赏
  • 举报
回复
我是近来学习的
一如当初 2014-07-09
  • 打赏
  • 举报
回复
引用 14 楼 r3000 的回复:
这个不是错误吧? 不应该删除,应该更新? Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\AA.BB\CLSID] @="{11111111-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的CLSID应该更新为最新版本的, 比如我有个COM组件,叫 ABC,一共发布了三个版本,分别是 ABC.1 ABC.2 ABC.3 这个三个版本的CLSID是不同的, 那ABC键值下面, CurVer应该是当前的最高版本也就是 ABC.3 ABC下面的CLSID应该更新为ABC.3的CLSID. 也就是说,我理解正确的应该是更新为当前版的CLSID,而不是删除,那只是碰巧对了。 对COM也不太熟,也能是我理解的不对。
其实你说的就是书上说的。说它错可能过了点,因为结果是相同的。 这个问题与COM本身关系不大了,主要看CLSIDFromProgID的实现,而CLSIDFromProgID在设计时就如我在文章中所说的 它会进行映射
Windows Registry Editor Version 5.00
      
[-HKEY_CLASSES_ROOT\AA.BB\CLSID]
@="{11111111-F2ED-4CD4-9204-A1C28871DD2E}"

[HKEY_CLASSES_ROOT\AA.BB\CurVer]
@="HELLOWORLD"  

[HKEY_CLASSES_ROOT\AA.BB.1\CLSID]  
@="{11111111-F2ED-4CD4-9204-A1C28871DD2E}"

[HKEY_CLASSES_ROOT\helloworld\CLSID]  
@="{22222222-F2ED-4CD4-9204-A1C28871DD2E}"
“AA.BB”会映射到”helloworld“上。 这么理解吧,当一个ProgID提供了具体的clsid的时候就可以认为它是一个具体的组件,而不是一个与版本无关的组件。 当然,按照书上所说的做,最终结果会是一样的,但是从思想上来说其意义是不同的。
康斯坦汀 2014-07-09
  • 打赏
  • 举报
回复
这个不是错误吧? 不应该删除,应该更新? Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\AA.BB\CLSID] @="{11111111-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的CLSID应该更新为最新版本的, 比如我有个COM组件,叫 ABC,一共发布了三个版本,分别是 ABC.1 ABC.2 ABC.3 这个三个版本的CLSID是不同的, 那ABC键值下面, CurVer应该是当前的最高版本也就是 ABC.3 ABC下面的CLSID应该更新为ABC.3的CLSID. 也就是说,我理解正确的应该是更新为当前版的CLSID,而不是删除,那只是碰巧对了。 对COM也不太熟,也能是我理解的不对。
laoer_2002 2014-07-09
  • 打赏
  • 举报
回复
厉害,谢谢楼主分享!
modyaj 2014-07-09
  • 打赏
  • 举报
回复
com不会 但是我去看了一眼 居然半天才能打开!!
GW786228836 2014-07-09
  • 打赏
  • 举报
回复
cattpon 2014-07-09
  • 打赏
  • 举报
回复
看看是什么???
康斯坦汀 2014-07-09
  • 打赏
  • 举报
回复
其实我觉得COM里的小瑕疵很多,这个应该不算什么,本身COM依赖于注册表就是很悲催的事,COM的思想是伟大的, 但是实现细节上倒在了微软的商业策略上面了。所以到了.NET,COM进化了。
redui 2014-07-09
  • 打赏
  • 举报
回复
算得上是一个小BUG或者漏洞,不过通常情况下基本不会出现这种错误。一个组件在写注册信息时,并不知道注册表中是否已经存在该组件或该组件的旧版本,它认为自己是最新版本,所以都会同时更新CLSID和CurVer两个字段。实际上开发时期的注册信息基本是系统自动生成的,不是特殊情况没人去手工修改,一旦生成也不会再改变,所以只更新一个字段的情况很难出现。
fankejin 2014-07-09
  • 打赏
  • 举报
回复
楼主好人!!!
加载更多回复(7)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧