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

时间:2013-04-16 09:48:08

标签: windows internet-explorer vb6 activex

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

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

控件是这样嵌入的

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

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

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

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

2 个答案:

答案 0 :(得分:1)

当您从计算机中删除现有版本后,IE成功下载并安装了该组件,这完全取决于版本控制。在这一点上,我可以想到几种情况。

场景1:坏.INF文件

打开.CAB文件。你应该在里面看到.INF文件。打开此.INF文件并找到[<component name>.ocx]部分。检查FileVersion=...的值,它应为FileVersion=1,0,0,80。我发现如果你通过之前由Package&amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp;部署向导。

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

我能想到的另一个场景是,您在用于构建控件新版本的同一台机器上进行测试。在这种情况下,您的控件可以由构建过程注册。这有助于理解how does COM activation work anyway?尽管在构建服务器以外的机器上进行测试总是一个好主意。

可能性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
  

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

要确认该想法,请检查您用于测试的计算机上的组件是否有AppID注册表值。您的用户很可能不会在其计算机上为AppID设置CLSID。当然,除非您的组件至少在一个不同的场景中使用。 Larry Osterman有一篇博文When do you need an APPID in your COM registration?如果您不确定AppID是什么,请查看this MSDN blog post

如何确定AppID是否设置了CLSID?打开注册表编辑器regedt32,并检查HKEY_CLASSES_ROOT\CLSID\{<clsid>}项下的值。查找类型AppId的{​​{1}}命名值。

可能性2 :构建过程更改了REG_SZ注册表项的默认值

检查HCKR\CLSID\{clsid}\InprocServer32注册表项的默认值((Default))。如果它指向您用作组件编译过程输出的位置,那么它很可能是在构建期间设置的(除非您将构建结果直接放到HCKR\CLSID\{clsid}\InprocServer32,我真的怀疑)。 OS使用此值来确定在COM组件激活时使用的二进制文件。运行C:\WINDOWS\Downloaded Program Files并使用网页重新运行测试。


如果没有任何帮助,您需要更仔细地调查此问题。启动Process Monitor,要求它跟踪IE进程的注册表和文件系统活动,并查看IE如何决定(不)更新您的控件。收集的跟踪中的有趣信息应在对您的控件regsvr32 /u <path to the .ocx created during compilation>进行注册表查询后立即开始。

答案 1 :(得分:0)

最好不要破坏兼容性。

打开Project Properties,然后在Component标签中将Version Compatibility更改为No Compatibility。编译,然后更改您的clsid以匹配新的。{/ p>

相关问题