我必须维护用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然后加载页面时,它才会打印出新版本。
显然,用户不能也不应该这样做。所以问题仍然存在:一旦将用户部署到服务器上,我怎样才能有效地强制我的用户?
答案 0 :(得分:1)
当您从计算机中删除现有版本后,IE成功下载并安装了该组件,这完全取决于版本控制。在这一点上,我可以想到几种情况。
打开.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;部署向导。
我能想到的另一个场景是,您在用于构建控件新版本的同一台机器上进行测试。在这种情况下,您的控件可以由构建过程注册。这有助于理解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>