MSCOMCTL布鲁斯
请原谅我写了这么长的一篇文章,但我正在试着提供所有相关的信息。
我正在将VB6应用程序从Windows 2008 R2移到运行在vm上的Windows 2012 R2。这是一个完全手工的过程。
我用文本编辑器打开vbp文件,并将依赖项保存在文本文件中。
我在2008服务器上的注册表中搜索每个dll和ocx,以找到它们在文件系统中的位置。然后,将它们全部复制到2012年的服务器上,并开始在SysWoW64文件夹中使用SysWoW64注册每个人。
我与一些dll(第三方和我自己的)有相当多的问题,但能够解决。
2012年的exe终于能够加载,但是:
我们在窗体上使用的date组件(不片断化PVDateEdit9.ocx)在按下小箭头时无法显示日历。然后,我从过去的安装中记得,它与MSCOMCTL.OCX有关,可能是PVDateEdit9调用它来删除日历。
我搜索了2012年的登记册,但没有找到任何参考资料。我复制了安装在服务器2008上的服务器,并在SysWoW64 regsvr32中注册了它。这没什么用。
在花了一段时间之后,我决定从两个服务器导出TypeLib键{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}的所有注册表项,并对其进行比较。我发现,2008年注册表只有一个条目,如下所示,而2012年在每个节点下都没有(实际上这个ocx有5个节点):
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\TypeLib\{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}**\2.0**]
"PrimaryInteropAssemblyName"="mscomctl, Version=10.0.4504.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"版本2.2的其余密钥是相同的。喜欢
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\TypeLib\{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}**\2.2**\0\win32]
@="C:\\Windows\\SysWOW64\\MSCOMCTL.OCX" 我认为将这些PrimaryInteropAssemblyName密钥添加到2012年可以解决这个问题。
在我尝试之前,我有以下几个问题:
第一个问题--有谁知道"PrimaryInteropAssemblyName“密钥的目的是什么,以及它是如何在2008年出现的?
第二,有人也有类似的问题吗?
第三,通过将这些缺失的条目添加到2012年,我会对注册表造成严重的损害吗?
谢谢
墨舍
发布于 2020-06-04 01:01:24
如果有人遇到类似的问题,比如非常老的PVDate9.ocx没有放弃日历,下面是我为我的问题找到的解决方案
它需要另一个ocx从不脆弱性注册-PVCal宪兵9.OCX。它没有显示任何地方,它依赖它。我在Ingragistics的原始CAB中搜索.dep文件,但它并不存在。一旦我注册了PVCALMPA9.ocx,它就成功了。这与MSCOMCTL.OCX无关--我可能在网上看到过它。它不需要它。
我是怎么弄明白的
我用一个表单创建了一个非常简单的exe,只有一个PVDate控件。我在它工作的计算机上运行了exe (服务器2008)。然后我使用了procexp (过程探索),查看了它加载的dll,就在那里,PVCal宪兵9.OCX
问题解决了。
现在是时候开始将这些古老的应用程序迁移到新技术上了。:-)
https://stackoverflow.com/questions/62163843
复制相似问题