在一个VB工程或者VBA工程中(以下简称VB应用)用到MSCOMCTL.OCX 中的LISTVIEW控件,经常遇到一些莫名其妙的问题,比如:
- 在机器A上运行正常,一段时间后,在A上无法运行了,即便你再重新注册你的MSCOMCTL.OCX文件,任然无法正常工作
- 在机器A上运行正常,到机器B无法运行
- 在机器A上运行正常,在机器B上编辑过VB应用后,在A上无法运行了
正好这几天就碰到一个问题,我在XP下开发的VBA工程在WINDOWS 7下save过一次后,在XP下就不可用了。好在前段时间研究了一下COM,这次发挥了作用。仔细研究了一下注册表,感觉发现了根本解决思路,万变不离其宗,希望对大家能有所帮助。
首先要保证MSCOMCTL.OCX成功注册,查看HKEY_CLASSES_ROOT\CLSID下是否有键{BDD1F04B-858B-11D1-B16A-00C0F0283628}。如果在成功注册的情况下,还是无法正常运行,一般是两种情况,
A.你的VB应用中的控件版本号对应的控件没有注册,比如如果在你的工程中有如下字样,Object={831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.1#0; MSCOMCTL.OCX;表示使用的版本号为2.1,去HKEY_CLASSES_ROOT\TYPELIB下查看={831FDD16-0C5C-11D2-A9FC-0000F8754DA1}键下是否有相应版本,如果没有的话,需要升级到相应版本控件
B.VB应用中记录的控件类型库版本号对应的控件已经注册,但就是无法运行。比如上述问题1,之所以无法运行,是因为你的MSCOMCTL.OCX被升级了,由于MSCOMCTL.OCX有一个安全漏洞,微软升级以后,把你所用的老版本(通常是2.0)给禁用了,如果你还想使用2.0版本怎么办?找到你的老版本的MSCOCTL.OCX文件,拷贝到SYSTEM32\目录下,使用regsvr32注册后,去HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InternetExplorer\ActiveXCompatibility
{BDD1F04B-858B-11D1-B16A-00C0F0283628}下,修改子键Compatibility Flags的键值为0即可,值1024表示老版本禁用了。
以上提到的注册表位置仅适用于32位操作系统,64位系统有所区别。