Windows7 SP1导致含有ADO的程序运行失败问题

来源:互联网 发布:海岛奇兵升级数据 编辑:程序博客网 时间:2024/05/01 12:55
前天,更换了一台新电脑,配置还行,就兴冲冲的用上了32位的Windows7 SP1,确实比XP,2003好看,呵呵,其他还没更深的感触。当天晚上一个客户让修改一个程序功能,之前一直是在XP SP3(Windows2003 SP2)+VB6+SQL2000的环境下编译(确实有点古老了,习惯了),于是很兴奋的把源码拷到了新机器上,很简单的修改了一下便编译替换,然后悲剧来了,反映说“运行程序后直接弹出一个提示框,内容是‘类不支持自动化或不支持期望的接口’,程序退出”(有的机器会提示“类型不匹配”,“函数或接口标记为限制的,或函数中使用了VB不支持的自动类型”)。

程序入口是连接数据库,这里我没有做任何的修改,但最终还是判断是由ADO造成的,查看”Microsoft ActiveX Data Objects 2.8 Library”在Win7 SP1下的路径是“C:\ProgramFiles (x86)\Common Files\System\ado\msado28.tlb”,在Win2003 SP2下的路径是” C:\ProgramFiles\Common Files\System\ADO\msado15.dll”,在Win2003下根本没有msado28.tlb这个文件,我便开始了悲催的百度谷歌之旅,最终有帮助的资料如下:

1、http://topic.csdn.net/u/20110305/09/64d1a776-4bb2-44f7-9f83-d5ae4b1af325.html

通过这篇文章知道了ADO有更新,IID码是不相同的。

2、"类型不匹配"错误消息,当您运行Office 2010 应用程序的 32 位版本中的 VBA 宏http://support.microsoft.com/kb/983246

3、MS11-002:2011 年 1 月 11 日版 MicrosoftData Access Components 2.8 Service Pack 1 安全更新说明

http://support.microsoft.com/kb/2419632

3、An ADO applicationdoes not run on down-level operating systems after you recompile it on acomputer that is running Windows 7 SP 1 or Windows Server 2008 R2 SP 1 or thathas KB983246 installed

http://support.microsoft.com/kb/2517589/en-us

这篇文章中的解决方法是注册Msado60_Backcompat_i386.tlb或Msado60_Backcompat_x64.tlb,因为我的机器是32位,就注册了第二个,然后在引用中选择“Microsoft ActiveX Data Objects 6.0 BackCompat Library”,然后我本机就运行不了。所以这个并不能解决问题。但重要的一个信息是文章标题中的“KB983246”。

4、http://social.msdn.microsoft.com/Forums/zh-CN/accessdev/thread/aec25af5-2c32-4f7e-aac4-7900c46a22fe

5、这篇文章指向“KB983246”http://www.open-open.com/news/view/176e681

 

最终问题解决办法:

根据以上信息汇总,最终开始搜索“KB983246”这个补丁程序,微软官方站好像没有提供直接下载的链接,在CSDN的资源中发现了这个“解决WIN7SP1下编译的VS6.0程序(ADO2.8)在其它客户端下需无法使用的问题”

http://download.csdn.net/download/chinayokel/3096932

经测试(windows2003 SP2和Widows XPSP3),完美解决,历时三个小时呀,郁闷死了。

 

在部分计算机安装此补丁时,可能会出现安装失败,最暴力的办法就是到别的机器(未安装SP1的Windows 7)将本机的ADO(C:\Program Files\Common Files\System\ado)整个文件夹都替换掉,然后将程序Debug与Release文件夹全部删除干净,重新编译即可运行。

 

无意中又发现了一篇博文,台湾的,Windows7 SP1 導致含有 ADO 的程式失效問題,地址是http://www.dotblogs.com.tw/topcat/archive/2011/03/28/22122.aspx,这里面的解决办法是使用后期绑定(Late Binding)使用ADO,我的程序确实都是使用的前期绑定(Early Binding),测试确实可以,且ADO的引用并不用更换。但因为需要改动的地方太多,而且没有了智能感知(Intellisense),很不习惯。所以还是使用KB983246解决问题。


转自:http://blog.csdn.net/lifeng40401/article/details/7837961

0 0