关于在Win7 SP1操作系统下编译的ADO应用程序不能在比Win7 SP1版本低的操作系统上运行,微软给出的解释和解决方案
2011-09-11 09:15
549 查看
本文解决方案摘自:http://support.microsoft.com/kb/2517589
这几天一直在写一个股票软件,用的ACCESS来存储数据,用的ADO方式来操作数据库,在自己机子上运行得好好的,在别人机子上就完全用不起,调试了很久才发现问题锁定在hr = m_pLocalConnection.CreateInstance(__uuidof(Connection));这条语句上,这条语句是创建一个Connection对象,正确执行后是能创建的,但是在别人机子上就是不能正确执行,弄了一天也没弄明白,后来跟一个朋友聊天,从他那里得知原来在Win7 SP1的操作系统上编译的ACCESS应用程序不能在比Win7 SP1的低版本操纵系统上运行,而别人的机子恰好都不是Win7 SP1的操作系统,找到原因就好办了,一下是微软给出的官方解释和解决办法。
症状:
请考虑下面的方案。在计算机上正在运行 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 + + 代码段复制此问题。
下面的 Visual Basic for Applications,代码段复制此问题。
VBA 错误:运行时错误"430": 类不支持自动化或不支持所需的接口
请注意 Microsoft 不能再用于 ADO 支持的主互操作程序集,并不再支持 Visual Basic 6。有关 Visual Basic 6 可支持性的详细信息,请访问下面的 MSDN 网页:
在 Windows Vista、 Windows Server 2008 和 Windows 7 Visual Basic 6.0 支持语句(http://msdn.microsoft.com/en-us/vbasic/ms788708.aspx)
有关 ADO 支持能力的主互操作程序集的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
318559 (http://support.microsoft.com/kb/318559/ ) 有关 ADO (ADODB) 在 Visual Studio 中使用的主互操作程序集.NET
原因:
因为有些 ADO 接口更改与新实例标识符 (IIDs) 相关联的 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,并且该 IID 的 _Connection_Deprecated 00000550-0000-0010-8000-00AA006D2EA4。
如果您的应用程序使用早期绑定到 _Connection,新 IID 存储在应用程序二进制文件在编译过程中。IID 不存在,因此,在低级别的操作系统上运行应用程序时,这会导致错误。
一些 ADO Api 取决于平台,ado 2.7 及更高版本。在 64 位版本的 Windows 中,这些 ADO Api 处理参数使用 64 位数据类型 (如 LONGLONG 数据类型)。但是,使用这些 Api 的应用程序仍然使用 长 数据类型。因此,当您尝试运行该宏时收到"类型不匹配"错误消息。
替代方法:
要解决此问题,请使用下列方法之一。
方法 1
// loadTOCNode(2, 'workaround');
// ]]>
若要解决此问题的 Visual c + + 应用程序、 Visual Basic 6 的应用程序,以及 Microsoft.NET 应用程序,请按照下列步骤。
备注
方法 2 不应用于应用程序的 VBA。读取下载类型库 (.tlb) 文件,在运行时,有的已编译的 Access 文件 (*.mde 或 *.accde),则可能会出现在最终用户计算机上下载的.tlb 文件。
若要下载的文件,请转到此节中的"下载"小节。
以管理员身份运行 CMD 提示符下,类型库的注册过程中可能需要在 Windows 7 计算机上。
将下载的文件复制到部署目录中。例如:
C:\temp\Msado60_Backcompat_i386.tlb"%commonprogramfiles%\system\ado\msado60_backcompat.tlb"
注册下载的文件系统上。例如:
%windir%\Microsoft.NET\Framework\v4.0.30319\regtlibv12"%commonprogramfiles%\system\ado\msado60_backcompat.tlb"
请注意 如果调整为 regtlbv12.exe 的路径。NET 框架 4.0 的系统上未安装。
验证已创建以下注册表项:
HKEY_CLASSES_ROOT\TypeLib\{0C0FF45D-87C8-4333-9075-3D9B4D64F9FC}\6.0
验证以下注册表值指向"%commonprogramfiles%\system\ado\msado60_backcompat.tlb"(在注册表中的路径可能会扩展为绝对路径):
HKEY_CLASSES_ROOT\TypeLib\{0C0FF45D-87C8-4333-9075-3D9B4D64F9FC}\6.0\0\win32
下载到本地目录 (例如 C:\temp) 的 Msado60_Backcompat_x64.tlb。
将下载的文件复制到部署目录中。例如:
C:\Temp\Msado60_Backcompat_i386.tlb"%commonprogramfiles (x86) %\System\ado\Msado60_Backcompat.tlb"
C:\Temp\Msado60_Backcompat_x64.tlb"%commonprogramfiles%\system\ado\msado60_backcompat.tlb"
注册下载的文件系统上。例如:
%windir%\Microsoft.NET\Framework\v4.0.30319\regtlibv12"%commonprogramfiles%\system\ado\msado60_backcompat.tlb"
%windir%\Microsoft.NET\Framework\v4.0.30319\regtlibv12"%commonprogramfiles (x86) %\System\ado\Msado60_Backcompat.tlb"
请注意 如果调整为 regtlbv12.exe 的路径。NET 框架 4.0 的系统上未安装。
验证已创建以下注册表项:
HKEY_CLASSES_ROOT\TypeLib\{0C0FF45D-87C8-4333-9075-3D9B4D64F9FC}\6.0
验证以下注册表值指向"%commonprogramfiles(x86) %\System\ado\msado60_Backcompat.tlb"(在注册表中的路径可能会扩展为绝对路径):
HKEY_CLASSES_ROOT\TypeLib\{0C0FF45D-87C8-4333-9075-3D9B4D64F9FC}\6.0\0\win32
验证以下注册表值指向"%commonprogramfiles%\system\ado\msado60_backcompat.tlb"(在注册表中的路径可能会扩展为绝对路径):
HKEY_CLASSES_ROOT\TypeLib\{0C0FF45D-87C8-4333-9075-3D9B4D64F9FC}\6.0\0\win64
// ]]>
使用相同的过程作为对于 AMD64 的计算机,但下载的 Msado60_Backcompat_x64.tlb (而不是 Msado60_Backcompat_ia64.tlb。
Msado60_Backcompat_x64.tlb (http://download.microsoft.com/download/6/4/3/64318ED2-7E18-4A5C-80E2-9BDA0DF02DB3/msado60_Backcompat_x64.tlb)
Msado60_Backcompat_ia64.tlb
单击以清除 Microsoft ActiveX 数据对象 * 库 和 Microsoft ActiveX 数据对象的记录集 * 库 条目。
单击以选中 Microsoft ActiveX 数据对象 6.0 BackCompat 库 条目。
重新编译应用程序。
// ]]>
您可以更改您的应用程序,以使其使用后期绑定。例如,您就可以通过 IDispatch 界面 c + + 中调用 ADO Api。
请注意 这种解决方法并不适用于 Visual Basic for Applications 的应用程序。
这几天一直在写一个股票软件,用的ACCESS来存储数据,用的ADO方式来操作数据库,在自己机子上运行得好好的,在别人机子上就完全用不起,调试了很久才发现问题锁定在hr = m_pLocalConnection.CreateInstance(__uuidof(Connection));这条语句上,这条语句是创建一个Connection对象,正确执行后是能创建的,但是在别人机子上就是不能正确执行,弄了一天也没弄明白,后来跟一个朋友聊天,从他那里得知原来在Win7 SP1的操作系统上编译的ACCESS应用程序不能在比Win7 SP1的低版本操纵系统上运行,而别人的机子恰好都不是Win7 SP1的操作系统,找到原因就好办了,一下是微软给出的官方解释和解决办法。
症状:
请考虑下面的方案。在计算机上正在运行 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 支持语句(http://msdn.microsoft.com/en-us/vbasic/ms788708.aspx)
有关 ADO 支持能力的主互操作程序集的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
318559 (http://support.microsoft.com/kb/318559/ ) 有关 ADO (ADODB) 在 Visual Studio 中使用的主互操作程序集.NET
原因:
因为有些 ADO 接口更改与新实例标识符 (IIDs) 相关联的 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,并且该 IID 的 _Connection_Deprecated 00000550-0000-0010-8000-00AA006D2EA4。
如果您的应用程序使用早期绑定到 _Connection,新 IID 存储在应用程序二进制文件在编译过程中。IID 不存在,因此,在低级别的操作系统上运行应用程序时,这会导致错误。
一些 ADO Api 取决于平台,ado 2.7 及更高版本。在 64 位版本的 Windows 中,这些 ADO Api 处理参数使用 64 位数据类型 (如 LONGLONG 数据类型)。但是,使用这些 Api 的应用程序仍然使用 长 数据类型。因此,当您尝试运行该宏时收到"类型不匹配"错误消息。
替代方法:
要解决此问题,请使用下列方法之一。
方法 1
// loadTOCNode(2, 'workaround');
// ]]>
若要解决此问题的 Visual c + + 应用程序、 Visual Basic 6 的应用程序,以及 Microsoft.NET 应用程序,请按照下列步骤。
备注
方法 2 不应用于应用程序的 VBA。读取下载类型库 (.tlb) 文件,在运行时,有的已编译的 Access 文件 (*.mde 或 *.accde),则可能会出现在最终用户计算机上下载的.tlb 文件。
若要下载的文件,请转到此节中的"下载"小节。
以管理员身份运行 CMD 提示符下,类型库的注册过程中可能需要在 Windows 7 计算机上。
对于 32 位计算机
下载到本地目录 (例如 C:\temp) 的 Msado60_Backcompat_i386.tlb。将下载的文件复制到部署目录中。例如:
C:\temp\Msado60_Backcompat_i386.tlb"%commonprogramfiles%\system\ado\msado60_backcompat.tlb"
注册下载的文件系统上。例如:
%windir%\Microsoft.NET\Framework\v4.0.30319\regtlibv12"%commonprogramfiles%\system\ado\msado60_backcompat.tlb"
请注意 如果调整为 regtlbv12.exe 的路径。NET 框架 4.0 的系统上未安装。
验证已创建以下注册表项:
HKEY_CLASSES_ROOT\TypeLib\{0C0FF45D-87C8-4333-9075-3D9B4D64F9FC}\6.0
验证以下注册表值指向"%commonprogramfiles%\system\ado\msado60_backcompat.tlb"(在注册表中的路径可能会扩展为绝对路径):
HKEY_CLASSES_ROOT\TypeLib\{0C0FF45D-87C8-4333-9075-3D9B4D64F9FC}\6.0\0\win32
AMD 64 计算机
下载到本地目录 (例如 C:\temp) 的 Msado60_Backcompat_i386.tlb。下载到本地目录 (例如 C:\temp) 的 Msado60_Backcompat_x64.tlb。
将下载的文件复制到部署目录中。例如:
C:\Temp\Msado60_Backcompat_i386.tlb"%commonprogramfiles (x86) %\System\ado\Msado60_Backcompat.tlb"
C:\Temp\Msado60_Backcompat_x64.tlb"%commonprogramfiles%\system\ado\msado60_backcompat.tlb"
注册下载的文件系统上。例如:
%windir%\Microsoft.NET\Framework\v4.0.30319\regtlibv12"%commonprogramfiles%\system\ado\msado60_backcompat.tlb"
%windir%\Microsoft.NET\Framework\v4.0.30319\regtlibv12"%commonprogramfiles (x86) %\System\ado\Msado60_Backcompat.tlb"
请注意 如果调整为 regtlbv12.exe 的路径。NET 框架 4.0 的系统上未安装。
验证已创建以下注册表项:
HKEY_CLASSES_ROOT\TypeLib\{0C0FF45D-87C8-4333-9075-3D9B4D64F9FC}\6.0
验证以下注册表值指向"%commonprogramfiles(x86) %\System\ado\msado60_Backcompat.tlb"(在注册表中的路径可能会扩展为绝对路径):
HKEY_CLASSES_ROOT\TypeLib\{0C0FF45D-87C8-4333-9075-3D9B4D64F9FC}\6.0\0\win32
验证以下注册表值指向"%commonprogramfiles%\system\ado\msado60_backcompat.tlb"(在注册表中的路径可能会扩展为绝对路径):
HKEY_CLASSES_ROOT\TypeLib\{0C0FF45D-87C8-4333-9075-3D9B4D64F9FC}\6.0\0\win64
对于 IA64 的计算机
// loadTOCNode(3, 'workaround');// ]]>
使用相同的过程作为对于 AMD64 的计算机,但下载的 Msado60_Backcompat_x64.tlb (而不是 Msado60_Backcompat_ia64.tlb。
下载
Msado60_Backcompat_i386.tlb (http://download.microsoft.com/download/6/4/3/64318ED2-7E18-4A5C-80E2-9BDA0DF02DB3/msado60_Backcompat_i386.tlb)Msado60_Backcompat_x64.tlb (http://download.microsoft.com/download/6/4/3/64318ED2-7E18-4A5C-80E2-9BDA0DF02DB3/msado60_Backcompat_x64.tlb)
Msado60_Backcompat_ia64.tlb
对于 c + + 开发人员
第 1 行替换第 2 行:重新编译应用程序。#import "msado15.dll" no_namespace rename("EOF","EndOfFile")
#import "msado60_Backcompat.tlb" no_namespace rename("EOF","EndOfFile")
Visual Basic 6 开发人员
在项目菜单上单击引用。单击以清除 Microsoft ActiveX 数据对象 * 库 和 Microsoft ActiveX 数据对象的记录集 * 库 条目。
单击以选中 Microsoft ActiveX 数据对象 6.0 BackCompat 库 条目。
重新编译应用程序。
方法 2
// loadTOCNode(2, 'workaround');// ]]>
您可以更改您的应用程序,以使其使用后期绑定。例如,您就可以通过 IDispatch 界面 c + + 中调用 ADO Api。
请注意 这种解决方法并不适用于 Visual Basic for Applications 的应用程序。
相关文章推荐
- 在Win7或2008(安装了 KB983246补丁)上编译的ADO应用程序,不能运行在XP,2003等低级别的操作系统的解决方案
- 在Win7或2008(安装了 KB983246补丁)上编译的ADO应用程序,不能运行在XP,2003等低级别的操作系统的解决方案 .
- 在Win7或2008(安装了 KB983246补丁)上编译的ADO应用程序,不能运行在XP,2003等低级别的操作系统的解决方案
- XP或2003无法运行Win7 SP1或Windows2008R2 SP1所编译的ADO应用程序
- ADO 应用程序不能在运行级别较低的操作系统上运行的解决方案
- ADO 应用程序不能在运行级别较低的操作系统上运行的解决方案
- 为什么在Win7上编译的ADO程序不能在XP上运行
- 为什么在Win7上编译的ADO程序不能在XP上运行
- VC连接ADO方式ACCESS数据库在WIN7下编译到XP下不能运行
- VC连接ADO方式ACCESS数据库在WIN7下编译到XP下不能运行解决方法
- VC连接ADO方式数据库在WIN7下编译到XP下不能运行解决方法
- VC连接ADO方式ACCESS数据库在WIN7下编译到XP下不能运行解决方法
- ADO 应用程序不在运行级别较低的操作系统运行的解决方案 转载
- ADO 应用程序不在运行级别较低的操作系统运行的解决方案一
- VC连接ADO方式ACCESS数据库在WIN7下编译到XP下不能运行解决方法 2012-2-16 11:08
- VC连接ADO方式ACCESS数据库在WIN7下编译到XP下不能运行解决方法
- 关于Selenium脚本在Win7 IE8环境下不能运行的问题及解决方案
- VC连接ADO方式ACCESS数据库在WIN7下编译到XP下不能运行解决方法
- 关于在64位win7下运行Virtualbox安装系统时出错(提示VBoxDD.DLL错误)的解决方案。
- win7运行第一个opencv程序,基于opencv3.2,官方vc14编译版本,QT5.8 VS2015平台