_ConnectionPtr.CreateInstance(__uuidof(Connection))“不支持此接口”错误解决

最近在换了win7 64位的系统,今天突然发现以前写的ADO连接数据库的代码编译后在windows2003下会执行到:

_ConnectionPtr.CreateInstance(__uuidof(Connection)) 时会报“不支持此接口”的错误,花了一下午时间找了N多资料,终于解决,最后整理成下文,以备后查。

错误表现

产生错误的环境:在Windows 7 Service Pack 1 (SP1) 或 Windows 2008 R2 sp-1 或安装KB9823246 补丁的机器 上使用Microsoft Visual C++编译的Microsoft ActiveX 数据对象 (ADO)应用程序,运行在低版本的操作系统上会收到以下错误消息:
错误消息 1   
REGDB_E_CLASSNOTREG (0X80040154)
错误消息 2   
E_POINTER (0X80004003)
错误消息 3   
E_NOINTERFACE (0X80004002)
错误消息 4
找不到 COM 对象强制转换的类型为接口类型的 ‘System.__ComObject‘‘ ADODB。连接。此操作失败,因为接口 IID {00001550-0000-0010-8000-00AA006D2EA4} 对 COM 组件的 QueryInterface 调用失败,出现以下错误: 不支持此接口 (HRESULT 中的异常: 0x80004002 (E_NOINTERFACE))。"

示例代码:

#import " msado15.dll" no_namespace rename("EOF","EndOfFile")

int main()
{
	CoInitialize(NULL);
	_ConnectionPtr pConnection = NULL;

	pConnection.CreateInstance("ADODB.Connect");
	HRESULT hr = pConnection.CreateInstance(__uuidof(Connection));
	//hr == E_NOINTERFACE
	if(FAILED(hr))
	{
		_com_error e(hr);
		::MessageBox(NULL, e.ErrorMessage(), "Error", MB_OK);   //不支持此接口
		return 0;
	}
	return 0;
}

错误原因

此问题是由于一些 ADO 接口已更改在 Windows 7 SP1 中要与新实例标识符 (Iid) 相关联。较旧的 IID 接口分配给以下后缀:

_Deprecated

例如,接口 _Connection 已更新,如下所示:

  • 在 Windows 7 中,并在 Windows 的早期版本中,_Connection IID 是 00000550-0000-0010-8000-00AA006D2EA4。

  • 在 Windows 7 SP1 中,_Connection IID 00001550-0000-0010-8000-00AA006D2EA4,并且 _Connection_Deprecated 的 IID 00000550-0000-0010-8000-00AA006D2EA4。

如果您的应用程序使用早期绑定到 _Connection,应用程序二进制在编译过程中存储新的 IID。在低级别的操作系统上运行的应用程序因为 IID 不存在时,这将会导致错误。
是与平台相关的一些 ADO Api 在 ADO 2.7 及更高版本。在 64 位版本的 Windows 中,这些 ADO Api 使用 64 位数据类型 (如LONGLONG数据类型) 处理参数。但是,使用这些 Api 的应用程序仍使用的数据类型。因此,当您尝试运行宏时收到"类型不匹配"错误消息。

解决方案

1、先下载下面的文件

32位WIN7系统:Msado60_Backcompat_i386.tlb

64位WIN7系统(INTEL平台):Msado60_Backcompat_i386.tlbMsado60_Backcompat_x64.tlb

64位WIN7系统(AMD平台):Msado60_Backcompat_i386.tlbMsado60_Backcompat_ia64.tlb

2、拿32位系统示例

注册Msado60_Backcompat_i386.tlb

1、将Msado60_Backcompat_i386.tlb复制到C:\Program Files\Common Files\System\ado\目录下

2、再将C:\Windows\Microsoft.NET\Framework\v4.0.30319\regtlibv12.exe复制到C:\Program Files\Common Files\System\ado\目录下

3、运行CMD,分别输入:
    pushd C:\Program Files (x86)\Common Files\System\ado\ + 回车
    regtlibv12.exe msado60_Backcompat_i386.tlb + 回车
注意
    32位系统需要注册:Msado60_Backcompat_i386.tlb
    64位WIN7系统(INTEL平台)需要注册:    Msado60_Backcompat_i386.tlbMsado60_Backcompat_x64.tlb这2个文件;
    64位WIN7系统(AMD平台)需要注册:Msado60_Backcompat_i386.tlbMsado60_Backcompat_ia64.tlb这2个文件;

3、替换程序代码

将:#import "msado15.dll" no_namespace rename("EOF","EndOfFile")

替换为:#import "msado60_Backcompat.tlb" no_namespace rename("EOF","EndOfFile")

4、重新生成解决方案即可

参考资料:

1、http://support.microsoft.com/kb/2517589/zh-cn

2、http://blog.csdn.net/magic_andy/article/details/9225073

时间: 2024-11-06 19:29:09

_ConnectionPtr.CreateInstance(__uuidof(Connection))“不支持此接口”错误解决的相关文章

Listener refused the connection with the following error 错误解决

原文地址 :http://blog.csdn.net/zajin/article/details/17753351 做个备份: 查询数据库当前进程的连接数: select count(*) from v$process; 查看数据库当前会话的连接数: elect count(*) from v$session; 查看数据库的并发连接数: select count(*) from v$session where status='ACTIVE'; 查看当前数据库建立的会话情况: select sid

【转】Windows IIS注册asp 此操作系统版本不支持此选项 错误解决方法

原文:https://blog.csdn.net/sweety820/article/details/79538973 更新Win10,原来的IIS站点访问不了,原因是因为IIS 没有.net 4.5,使用网上的aspnet_regiis.exe -i命令,一点都不靠谱,直接提示: C:\WINDOWS\system32>c:\windows\microsoft.net\framework64\v4.0.30319\aspnet_regiis.exe -i Microsoft (R) ASP.N

Win10-IIS注册asp 此操作系统版本不支持此选项 错误解决方法

现象再现: 今日在Win10上面ASP.NET网站突然不能跑了, 过程再现: 根据资料提示重新注册ASPNET_IIS.exe -i 直接提示: C:\WINDOWS\system32>c:\windows\microsoft.net\framework64\v4.0.30319\aspnet_regiis.exe -i Microsoft (R) ASP.NET RegIIS 版本 4.0.30319.0 用于在本地计算机上安装和卸载 ASP.NET 的管理实用工具. 版权所有(C) Micr

ab压测 apr_socket_recv: Connection reset by peer (104)错误解决方法

用apache自带ab命令进行压测,报了如下错误: 原因是在ab的程序源码中对并发数有限制. 解决办法:修改apache源码support下面的ab.c源代码,然后重新编译.修改内容如下:

win8 不支持此接口问题

问题: 重装win8后用了一会就又出现不支持此接口问题了,cmd,任务管理器等exe都没法用.这是什么原因啊? 00.截图 00.Win8 Restorator导致win8打开程序提示不支持此接口的解决方法 原因分析,由于Restorator2007的一个Bug导致Exe文件被关联到BomeRst.exe上面去了, 解决方法:复制以下注册表内容到文本编辑器内,另存为*.reg文件,双击导入注册表即可. Windows Registry Editor Version 5.00 [-HKEY_CUR

直接端口打印 支持USB接口的打印机吗?解决办法

直接端口打印 支持USB接口的打印机吗?解决办法 www.MyException.Cn  网友分享于:2013-09-15  浏览:488次 直接端口打印 支持USB接口的打印机吗?问题如上,如可以支持,应该怎么搞? ------解决方案--------------------支持,只是端口名称不同而已. ------解决方案--------------------1. 安装一个打印机驱动(保证可以打印测试页)2. 把打印机共享出来3. 然后把端口名填入 \\机器名\打印机共享名 这样,就可实现

go调用其它C库,若采用命令行方式,不支持重定向的输出解决;smp协议未打开,发送信息到对方,没人响应

很多时候要学会站在巨人的肩膀上,该用别人 现有的东东一定要用,只要是开源合法的 go调用其它C库,一般两种方式,1,查看是否有接口,采用cgo方式编写:2.采用命令行直接执行,前提必须被调用的C库已经安装运行在该机器上 为了高效处理gif文件,采用gifsicle工具 http://download.csdn.net/detail/u010026901/7711469 重定向符合 > 在代码中会出错,所以在代码中实现重定向代替命令行重定向 package main import ( // "

Linux 出现telnet: 127.0.0.1: Connection refused错误解决办法

Linux 出现telnet: connect to address 127.0.0.1: Connection refused错误解决办法 没有xinetd服务: 1./etc/init.d目录中放置了系统中各个daemon服务的脚本,xinetd是其中之一. 2.xinetd是一种特殊的daemon服务(super daemon),它本身管理了一系列的daemon服务,这些服务只有在用户调用时才由xinetd启动,它们启动速度稍慢于独立的daemon服务,这些服务在/etc/xinetd.c

PDO 中支持三种错误处理模式:

PDO 支持三种错误处理模式: 静默模式,警告模式,异常模式 静默模式是默认的,需要修改的话,通过设置 PDO 对象的属性完成. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT)? $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING)?? $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT)?