我的学习园地

昨夜西风凋碧树,独上高楼,望尽天涯路。

  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  14 随笔 :: 0 文章 :: 36 评论 :: 0 Trackbacks

最近帮同事找c#开发activex控件自动升级的方法,得到的一些细节。这些细节其实稍微动点脑子都能想出来的。

ie检测到本机控件的版本比html中codebase中版本低,就会下载codebase中指定的cab来安装。这个过程不管cab里面是什么东西,哪怕里面的版本更低,或者是其他的activex,顺便说下,关于下载跟cab内容无关,我跟某人说了几次,结果都左耳进右耳出。

ie检测本机控件版本的方法是,先读取控件信息(HKEY_CLASSES_ROOT\CLSID\html中指定的clsid\)中InstalledVersion项的默认值,这个值就是本机控件的版本号。如果不存在InstalledVersion项,则读InprocServer32项下默认值对应文件的版本号。

如果懂一点com原理的话,都应该知道InprocServer32项下默认值就是控件对应的文件。该文件中的DllGetClassObject函数是用来创建控件的。而C#开发的控件文件,里面没有导出任何函数,严格的说C#开发的控件并不是真正的com控件,它必须借助net的mscoree.dll来实现com的流程。

所以所有c#开发的控件InprocServer32项下默认值都是mscoree.dll。对于c#开发的控件,如果没有InstalledVersion项,检测本机控件版本的时候都是读的net系统文件mscoree.dll的文件版本。c#开发的控件要实现自动升级就必须写注册表的InstalledVersion项。

另外,补一句日志中的c#开发的控件应该改成.net开发的控件。

posted on 2012-11-01 11:23 冷夜月 阅读(677) 评论(0)  编辑 收藏 引用 所属分类: Win32
只有注册用户登录后才能发表评论。