如何推出用VB6编写的新版ActiveX控件

F.P*_*F.P 6 windows vb6 internet-explorer activex

我必须维护用VB6编写的旧的活动x控件.

当我们为它开发一些新功能时,我现在需要向用户推出这个新版本.如何以最不突兀的方式做到这一点?

控件是这样嵌入的

<OBJECT classid="clsid:..." CODEBASE="activex/plugin/myOCX.CAB#version=1,0,0,42">
    <PARAM name="RunOnLoad" value="true"></PARAM>
    [...]
</OBJECT>
Run Code Online (Sandbox Code Playgroud)

不,当我将其更改#version为实际的(1,0,0,80)时,它不会改变任何东西.IE仍然加载旧版本(我可以通过提醒OCX版本的函数检查).

只有当我从我的机器上删除OCX然后加载页面时,它才会打印出新版本.

显然,用户不能也不应该这样做.所以问题仍然存在:一旦将用户部署到服务器上,我怎样才能有效地强制用户使用新版本?

Ily*_*sov 1

当您从计算机中删除现有版本后,IE 会成功下载并安装该组件,因此这一切都与版本控制有关。此时我可以想到几种场景。

情况 1:.INF 文件错误

打开您的 .CAB 文件。您将在里面看到 .INF 文件。打开此 .INF 文件并找到[<component name>.ocx]部分。查一下值FileVersion=...,应该是FileVersion=1,0,0,80。我发现,如果您通过先前由打包和部署向导生成的 .BAT 脚本更新现有的 .CAB 文件,则该值不会自动更新。

场景2:测试环境被构建过程污染

我能想到的另一个场景是,您正在用于构建新版本控件的同一台机器上进行测试。在这种情况下,您的控件可以由构建过程注册。在这里,它有助于理解COM 激活是如何工作的?不过,在构建服务器以外的机器上进行测试总是一个好主意。

可能性 1:构建过程在注册表项AppID下创建命名值HCKR\CLSID\{clsid}

根据KB167597

在伪代码中,以下是如何控制标签的组件下载<OBJECT>

   Check the Registry for CLSID
   If CLSID of OBJECT is NOT found in the registry
      Download OBJECT
   Else If no #Version specified in CODEBASE tag
      Use OBJECT installed on system
   Else
      Check InprocServer32 key for location of installed component
      If File version of installed component < CODEBASE #Version Tag
         Download OBJECT
Run Code Online (Sandbox Code Playgroud)

上述顺序有几个例外。如果在 CLSID 下找到 AppID 密钥,则该组件通常已注册为通过 DCOM 运行并且不会更新。此外,已安装版本密钥优先于文件版本。这用于 Java 类和非 PE(可移植可执行)文件。

要确认这个想法,请检查用于测试的计算机上是否有AppID组件的注册表值。您的用户很可能没有在他们的计算机上AppID进行设置CLSID。当然,除非您的组件至少用于另一种不同的场景。Larry Osterman 有一篇博文您的 COM 注册何时需要 APPID?如果您不确定什么,另请查看此 MSDN 博客文章AppID

我怎样才能知道是否AppID设置为 a CLSID?打开注册表编辑器regedt32,检查HKEY_CLASSES_ROOT\CLSID\{<clsid>}注册表项下的值。查找AppIdtype 的命名值REG_SZ

可能性 2HCKR\CLSID\{clsid}\InprocServer32 :构建过程更改了注册表项的默认值

检查注册表项(Default)的默认值 ( ) 。HCKR\CLSID\{clsid}\InprocServer32如果它指向您用作组件编译过程的输出的位置,那么它很可能已在构建期间设置(除非您直接将构建结果放入C:\WINDOWS\Downloaded Program Files我真正怀疑的位置)。操作系统使用此值来确定在 COM 组件激活时使用哪个二进制文件。regsvr32 /u <path to the .ocx created during compilation>使用网页运行并重新运行您的测试。


如果没有帮助,您需要更仔细地调查问题。启动Process Monitor,要求它跟踪 IE 进程的注册表和文件系统活动,并查看 IE 如何决定(不)更新您的控件。收集的跟踪中的有趣信息应该在注册表查询您的控件的CLSID.