前記事「Windows 7 SP1 が2011-2-23にリリースと不具合情報」では、Windows 7 SP1インストール時の不具合について書きました。
今回は開発用PCにWindows 7 SP1をインストールした際の問題についてです。
(2011/3/21現在、調べて分かっている問題だけです)
KB2517589:ADOを使用しているアプリケーションの再コンパイルで互換性に問題が発生する
KB2517589で情報が公開されています。
「An ADO application that is re-compiled on a Windows 7 Service Pack 1-based computer does not run」(マイクロソフト サポート オンライン)
概要:
Windows 7 SP1をインストール済みのPCで、ADOを使用したアプリケーションを再コンパイルした場合、生成したプログラムはWindows 7 SP1以上の環境でないと動作しない。(Vista、XPも含む)
具体的には次のようなエラーが発生する:
- REGDB_E_CLASSNOTREG (0x80040154)
- E_POINTER (0x80004003)
- E_NOINTERFACE (0x80004002)
- Unable to cast COM object of type 'System.__ComObject' to interface type 'ADODB.Connection'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{00001550-0000-0010-8000-00AA006D2EA4}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).”
--日本語のメッセージは解りません--
既に、日本語で分かり易く解説されているブログを見つけました。
KB2517589では何故下位互換がなくなると説明しているか - 新日々此何有哉(2011/3/18)
フォーラムでの議論:
試してみる:
VB6やVC++の環境が無いので、VS2010 C#で試す。
英語のフォーラムにあった簡単なVBの再現コードをC#に直してみた。
using System;
using System.Collections.Generic;
using System.Text;
namespace AdoTest
{
class Program
{
static void Main(string[] args)
{
ADODB.Connection cn ;
object o;
o = new ADODB.Connection();
if (o == null)
Console.WriteLine("connection is null.");
else
Console.WriteLine(((ADODB.Connection)o).Version.ToString());
cn = (ADODB.Connection)o ;
}
}
}
ADOの参照設定は、Version6にしておく。

このアプリケーションを Windows XP SP3にコピーして実行すると、確かにエラーになる。

エラー内容:
Unhandled Exception: System.InvalidCastException: Unable to cast COM object of type 'ADODB.ConnectionClass' to interface type 'ADODB._Connection'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{00001550-0000-0010-8000-00AA006D2EA4}' failed due to the following error: インターフェイスがサポートされていません (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).
at ADODB.ConnectionClass.get_Version()
at AdoTest.Program.Main(String[] args) in H:\VS2010-Projects\Gomi\AdoTest\AdoTest\Program.cs:line 20
ADOの参照設定を、Version 2.8 にしても同様のエラーとなる。
XP SP3で動作させるには、Version 2.7 にする必要がある。

C#(もしくは、VB.NET)であれば、参照設定により使用するADOのバージョンをコントロール出来るが、VB6ではできない(?)ので問題が大きくなっているという事だろうか。
ADOについて:
マイクロソフト サポート オンライン KB308044「.NET での ADO の使用に関するロードマップ」に次のように注意書きが記述されている。
注意 : ADO および ADO MD は、Microsoft .NET Framework 環境で十分にはテストされていません。特に、サービスベースのアプリケーションまたはマルチスレッド アプリケーションでは、断続的に問題が発生することがあります。この資料に記載されている技術は、ADO.NET への移行中に一時的な手段としてのみ使用してください。この技術を使用する前に、十分なテストを行って互換性の問題がないことを確認する必要があります。この方法で ADO または ADO MD を使用することによって発生した問題は、一切サポートされません。詳細については、「サポート技術情報」 (Microsoft Knowledge Base) の次の資料を参照してください。
840667 .NET Framework アプリケーションで ADO および ADO MD を使用したときに予期しないエラーが発生する
.NET Framework を使用しないアプリケーションには当てはまらない内容である。
KB2517589の問題は、ADOが公開しているCOMインターフェースの変更に起因するため、.NET Framework を使用しているアプリにも当てはまるはずだが、KB2517589の文章中には次のように書かれている。
・・・次のアプリケーションを使用してMicrosoft ActiveX Data Objects (ADO)アプリケーションを再コンパイルした場合
- Microsoft Visual C++
- Microsoft Visual Basic for Applications
- Microsoft Visual Basic 6
また、それぞれについてサポート終了している旨注記している。
結論としては、次の様に言いたいように感じる:
- .NET Framework アプリケーション
そもそも非推奨だから、ADO.NETに移行すべし。
- ネイティブ、VB6、VBA
回避方法が提示。
今回、既存のIIDはそのまま残し、既存の名前に別の新しいIIDを関連付けたため、ビルドした途端SP1以前では動かなくなってしまう。
このような措置がされているIntefaceには次のものがある。
- Interface: ADORecordsetConstruction
- Interface: ConnectionEventsVt
- Interface: _Connection
- Interface: Connection15
- DispInterface: ConnectionEvents
- Interface: _Command
- Interface: Command25
- Interface: Command15
- Interface: Fields
- Interface: Fields20
- Interface: Fields15
- Interface: Field
- Interface: Field15
- Interface: Field20
- Interface: _Parameter
- Interface: Parameters
- Interface: _Record
- Interface: _Recordset
- Interface: Recordset21
- Interface: Recordset20
- Interface: Recordset15
- DispInterface: RecordsetEvents
- Interface: RecordsetEventsVt
- Interface: _Stream
回避策
現在次の4つの回避策が提示されている。
どれもキツイ内容だ。(C++に関しては、英語のフォーラムの方には別の方法も書かれている)
特にVB6とVBAの場合は方法1しかない。
顧客が許すなら方法1も悪くはない。(私の場合・・・たぶんダメだろう)
しかし、もっと短期的に一番簡単なのは、SP1をアンインストールする事だ。
ADOは避けてADO.NETに行った上、VBに疎いもので間違いがあるかもしれません。
ご指摘いただければ幸いです。
次回は、「ADO, adAsyncExecute and Windows 7 SP1 handles leaking」という件 orz