gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:27:22 28 4
gpt4 key购买 nike

我必须维护一个用 VB6 编写的旧的 active 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 然后加载页面时,它才会打印出新版本。

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

最佳答案

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

场景 1:错误的 .INF 文件

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

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

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

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

根据 KB167597 :

In pseudo-code, here's how component download is controlled for the <OBJECT> tag:

   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

There are a couple of exceptions to the above sequence. If an AppID key is found under the CLSID, the component is usually registered to run through DCOM and is not updated. Also, an Installed Version key takes precedence over the file version. This is used for Java classes and non-PE (portable executable) files.

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

我怎样才能知道 AppID设置为 CLSID ?打开注册表编辑器 regedt32 ,并检查 HKEY_CLASSES_ROOT\CLSID\{<clsid>} 下的值 key 。寻找AppId REG_SZ 类型的命名值.

可能性 2:构建过程更改了默认值 HCKR\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 的注册表查询之后立即开始。 .

关于windows - 如何推出用 VB6 编写的 ActiveX 控件的新版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16033802/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com