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然后加载页面时,它才会打印出新版本.
显然,用户不能也不应该这样做.所以问题仍然存在:一旦将用户部署到服务器上,我怎样才能有效地强制用户使用新版本?
当您从计算机中删除现有版本后,IE 会成功下载并安装该组件,因此这一切都与版本控制有关。此时我可以想到几种场景。
打开您的 .CAB 文件。您将在里面看到 .INF 文件。打开此 .INF 文件并找到[<component name>.ocx]
部分。查一下值FileVersion=...
,应该是FileVersion=1,0,0,80
。我发现,如果您通过先前由打包和部署向导生成的 .BAT 脚本更新现有的 .CAB 文件,则该值不会自动更新。
我能想到的另一个场景是,您正在用于构建新版本控件的同一台机器上进行测试。在这种情况下,您的控件可以由构建过程注册。在这里,它有助于理解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>}
注册表项下的值。查找AppId
type 的命名值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
.
归档时间: |
|
查看次数: |
2525 次 |
最近记录: |