在Win7或2008(安装了 KB983246补丁)上编译的ADO应用程序,不能运行在XP,2003等低级别的操作系统的解决方案

错误表现

产生错误的场景如下:重新运行 Windows 7 Service Pack 1 (SP1) 或 Windows 2008 R2 sp-1 或具有 KB9823246 安装在计算机上编译 Microsoft ActiveX 数据对象 (ADO) 应用程序使用下列应用程序之一:

    Microsoft Visual C++
    Microsoft Visual Basic for Applications (VBA)
    Microsoft Visual Basic 6
    Microsoft.NET 应用程序

在这种情况下,您发现该应用程序不会在低级别的操作系统上运行。例如,它不会运行 Windows 7 的发行版、 Windows Vista 和其他 Windows 的早期版本。这取决于您的实现,您还收到类似于下列内容之一的错误消息。(您可能收到其他错误消息。)

错误消息 1
REGDB_E_CLASSNOTREG (0X80040154)
错误消息 2
E_POINTER (0X80004003)
错误消息 3
E_NOINTERFACE (0X80004002)
4 的错误消息
找不到 COM 对象强制转换的类型为接口类型 System.__ComObject ' ADODB。连接。此操作失败,因为对 COM 组件的接口 IID {00001550-0000-0010-8000-00AA006D2EA4} QueryInterface 调用失败,出现以下错误: 不支持此接口 (HRESULT 中的异常: 0x80004002 (E_NOINTERFACE))。"
下面的 Visual C++ 代码段复制此问题。

#import " msado15.dll" no_namespace rename("EOF","EndOfFile")
 
int main()
{
  CoInitialize(NULL);
  _ConnectionPtr pConnection = NULL;
     HRESULT hr = pConnection.CreateInstance(__uuidof(Connection)); //hr gets E_NOINTERFACE here
}

下面的 Visual Basic for Applications 代码段复制此问题。

Private Sub Form_Load()
 Dim Conn As New ADODB.Connection ‘Runtime error here: Class does not support Automation or does not support expected interface
End Sub

VBA 错误: 运行时错误"430": 类不支持自动化或不支持所需的接口

注意Microsoft 不再对 ADO 支持的主互操作程序集,并不再支持 Visual Basic 6。有关 Visual Basic 6 可支持性的详细信息,请访问下面的 MSDN 网页:
在 Windows Vista、 Windows Server 2008 和 Windows 7 的 Visual Basic 6.0 支持语句
ADO 支持性的主互操作程序集的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
318559有关 ADO (ADODB) Visual Studio.NET 中使用的主互操作程序集


原因:

因为有些 ADO 接口更改与新实例标识符 (Iid) 相关联的 Windows 7 SP1 中,将出现此问题。较旧的 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 的应用程序仍使用数据类型。 因此,当您尝试运行该宏时收到一条"类型不匹配"错误消息。


解决方案:

下载msado60_Backcompat_i386.tlb,将原来程序中的类似于下面的代码:

#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")\
    rename("LockTypeEnum","adoLockTypeEnum")\
    rename("FieldAttributeEnum","adoFieldAtttributeEnum")\
    rename("EditModeEnum","adoEditModeEnum")\
    rename("RecordStatusEnum","adoRecordStatusEnum")\
    rename("ParameterDirectionEnum","adoParameterDirectionEnum")\
    rename("DataTypeEnum","adoDataTypeEnum")

替换成:

#import "msado60_Backcompat_i386.tlb" no_namespace rename("EOF","adoEOF")\
    rename("LockTypeEnum","adoLockTypeEnum")\
    rename("FieldAttributeEnum","adoFieldAtttributeEnum")\
    rename("EditModeEnum","adoEditModeEnum")\
    rename("RecordStatusEnum","adoRecordStatusEnum")\
    rename("ParameterDirectionEnum","adoParameterDirectionEnum")\
    rename("DataTypeEnum","adoDataTypeEnum")


重新编译成功即可!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值