C# と .NET Framework 4 を主にWindows Formのアプリケーション開発について

2011年5月14日

Windows 7 SP1 インストール時の不具合対応Update Windows 7 SP1 インストール時の不具合対応Update

 

Windows 7 SP1 が2011-2-23にリリースと不具合情報で書いたWindows 7 SP1 のインストール時に”0xc0000034”が表示されてインストールが出来ない問題の修正がWindows Updateに上がっているようです。

 

マイクロソフト サポート オンライン:KB2533552
Windows 7 の SP1 または Windows Server 2008 R2 SP1 をインストールしようとすると、「0xC0000034」エラー メッセージを防止する更新プログラムし
(現状機械翻訳なので読み辛い)

対象OSにWindows 7 SP1が含まれているのが気持ち悪い。

この更新プログラムを適用するには、次のオペレーティング システムのいずれかの実行する必要があります。

  • Windows 7
  • Windows 7 のサービス パック 1 (SP1)
  • Windows サーバー 2008 R2
  • Windows Server 2008 R2 のサービス パック 1 (SP1)

 

手動での対処法は、マイクロソフト サポート オンライン:KB975484(最終更新日: 2011年5月11日)に記述があります。

「Windows 7 Service Pack 1 または Windows Vista の Service Pack をインストールした後、コンピューターがフリーズするか、再起動して画面が黒くなり "0xc0000034" エラー メッセージが表示されることがある」 (リビジョン4になっている)
こちらの解決法にKB2533552がリンク or Windows Updateによる方法が入っていないのがちょっと気になりますが、Windows UpdateしてもSP1をインストールして”0xc0000034”エラーが発生した場合は、手動での対処となるのでしょう。

 

運よく?私の近辺ではこの問題は発生してないので、本当に治るか検証していません。

2011年3月23日

Windows 7 SP1 関連 不具合情報(2) Windows 7 SP1 関連 不具合情報(2)

前記事では、「ADOを使用しているアプリケーションの再コンパイルで互換性に問題が発生する」問題について書きましたが、Windows 7 SP1 にはADO関連で更に不具合があるようです。

 

ADOで adAsyncExecute を指定した場合、Windows 7 SP1でメモリ・ハンドル リークが発生する

 

SQL Server Forum: 「ADO, adAsyncExecute and Windows 7 SP1 handles leaking」(英語)で報告されている。

今回は実行PCにSP1がインストールされている場合の問題です。

 

登録されたKBはまだ見つける事が出来ません。
フォーラムの内容から概要を抜き出してみます。

 

発生条件

OS:

  • Windows 7 SP1 32bit, 64bit 共
  • Windows 2008 R2 SP1

ADO:

  • adAsyncExecute オプションを指定した場合に発生
  • msado15.dll は 6.1.7601.17514 (必要条件か不明)

 

現象

adAsyncExecute オプションをつけて Execute をコールした場合に発生する。

SP1がインストールされていない場合、リークは発生しない。

データベース コネクションをクローズする際に全てのハンドルがリリースされる。

(アプリケーションの造りによっては、)この時かなり時間がかかる。

 

要するに、データベース コネクションを使いまわして、かなりのExecuteを実行すると発生するようだ。

こまめにクローズしている場合には、気づかないのかもしれない。
特にバッチ処理的に実行するような場合や、バックグラウンド サービス等では問題が発生する可能性がある。

 

また、明確にされていない情報があります。
KB983246がインストールされている場合にXP等で発生するかどうかです。
もし発生するのであれば、前記事の「回避策 方法1」は当にクライアントPCに対してKB983246をインストールする事ですから、
前記事の現象を回避するためKB983246をインストールすると、今度はメモリを使いつぶす事になります。

 

対策

前記事の内容と併せると、ADOを使用しているアプリケーション(ネイティブ、VB6、VBA、.NET Framework・・・に関わらず)は、次のようなテストを実施する必要がある。 リークを検出するには、それなりのテストデータを準備する必要がある。

 

  1. Windows 7 SP1インストール済みPCでテスト(正常/リーク)
    非同期処理を行っている場合リークが発生する可能性がある。
  2. Windows 7 SP1インストール済みPCでビルド(*1)してテスト(正常/リーク)
  3. (*1)をKB983246がインストールされていないPCでテスト(正常/エラー)
    エラーの場合前記事の回避方法を検討
  4. (*1)をKB983246インストール済みのPCでテスト(正常/リーク)
    1とほぼ同等のテスト。
  5. KB983246がインストールされていないPCでテスト(正常/リーク)
    (1)と同様の従来ビルドのモジュールをテスト

 

  Win7 SP1でビルド SP1なしビルド

Win7 SP1実行

正常/リーク(2)

正常/リーク(1)

Win7 SPなし実行

正常/エラー(3)

従来通り

KB983246インストール環境で実行

正常/リーク(4)

正常/リーク(5)

(括弧内の数値は上記のテスト番号に対応)

 

.NET アプリの場合、古いADOを参照設定し、非同期オプションを指定していない場合全てPASSする。
(そもそもADO.NETを使えという話はある)

 

今後ADO使うなと言いたいのだろうか(x64との統合が原因っぽいので、そうでは無いのだろうが、やり方がマズいよ)

Windows 7 SP1 関連 不具合情報 Windows 7 SP1 関連 不具合情報

前記事「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にコピーして実行すると、確かにエラーになる。

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 にする必要がある。

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つの回避策が提示されている。

  • 方法1: 983246 のHotFixを実行するPCにインストールする。
    新しいIIDが追加されるので、新しいプログラムが動作するようになる。
    (未確認だが、”追加”とあるので古いIIDも残るのだろう。そうであれば、古いバイナリも動作する)
  • 方法2: Visual C++ アプリケーションは次の方法で回避: (訳すの面倒になったのでゴメンナサイ)
    1. Build the project. This creates the msado15.tlh and msado15.tli files in the Debug/Release folder on the release version of Windows 7 or on earlier versions of Windows.
    2. Copy the msado15.tlh and msado15.tli files into the source directory for your project.
    3. Edit the code, and delete the following string:

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

    4. Type the following to replace the deleted string:

      #include "msado15.tlh"

    5. Rebuild the project.
    Note The msado15.tli file location in the msado15.tlh file is as follows:

    C:\MyProject\release\msado15.tli

    You may have to change the path of the msado15.tli file manually in the msado15.tlh file. This removes any dependency on the build operating system from your project.

  • 方法3: Visual C++ アプリケーションは次の方法で回避:
    全てのインターフェース リファレンスに "_Deprecated" サフィックスを追加する。
  • 方法4: ADOの呼出しをレイトバインディングに変更する。(ADO APIを IDispacheインターフェースから呼び出するようにする)
    この方法は、VBAには使用できない。

 

どれもキツイ内容だ。(C++に関しては、英語のフォーラムの方には別の方法も書かれている)
特にVB6とVBAの場合は方法1しかない。

顧客が許すなら方法1も悪くはない。(私の場合・・・たぶんダメだろう)
しかし、もっと短期的に一番簡単なのは、SP1をアンインストールする事だ。

 

ADOは避けてADO.NETに行った上、VBに疎いもので間違いがあるかもしれません。
ご指摘いただければ幸いです。

 

次回は、「ADO, adAsyncExecute and Windows 7 SP1 handles leaking」という件 orz

2011年3月20日

Windows 7 SP1 が2011/2/23にリリースと不具合情報 Windows 7 SP1 が2011/2/23にリリースと不具合情報

Windows 7 と Windows Server 2008 R2 の初のサービスパックが2011/2/23にリリースされている。
東北関東大震災とそれに続く計画停電でエントリを書くのをすっかり忘れていた。

手近の環境にはスグに入れてあり、大きな問題は出ていない。

導入済みの環境:

  • Windows 7 Ultimate 32bit
  • Windows 7 Ultimate 64bit
  • Windows 7 Enterprise 32bit
  • Windows Server 2008 R2 64bit

インストール方法 公式:「Windows 7 Service Pack 1 (SP1) をインストールする方法」(日本マイクロソフト)

 

個人的には、次の点が気になっている。

  • 視覚効果の「ドラッグ中にウィンドウの内容を表示する」の動作がおかしい

    パフォーマンスオプション ダイアログ:視覚効果
    この選択が勝手にOffになったり、Onなのに枠だけドラッグの状態になったりする。
    上部のラジオ ボタンの選択状態には依存せず発生する。(パフォーマンスを優先するは試していない)
  • 使用メモリが増加した気がする(定量的ではない)
    Internet Explorer 9によるメモリ・リソース リークや、Chromeのバージョンアップ、VS2010 SP1等を同時期に更新しているためWindows 7 SP1 単体で評価できない。
    タスク マネージャで見る使用メモリ使用率での評価なので、それの計算法が変わった可能性もある。

 

SP1での変更点は?

はっきり言って今更だが・・・

 

 

現状で分かっている不具合(1)(2011/3/20現在)

一部ユーザーが『Windows 7 SP1』のインストールで不具合 - japan.internet.com」記事にあるように、一部環境で再起動時にハングするという不具合が発生しているようである。

 

現象としては、SP1をインストール時に再起動すると黒い画面で “0xc0000034” が表示されるというもの。

!! 0xc0000034 !! 142/53007 (_0000000000000000.cdf-ms)

対処法は「Your computer may freeze or restart to a black screen that has a "0xc0000034" error message after you install Windows 7 Service Pack 1 or a Windows Vista service pack」 に記述されている。

 

一般向けは、システム復元を行う方法。

上級者向けは、日本語と英語で内容が異なっているので注意が必要だ。

  • 日本語の記事は、「文書番号: 975484 - 最終更新日: 2011年3月11日 - リビジョン: 1.1
  • 英語の記事は、「Article ID: 975484 - Last Review: March 16, 2011 - Revision: 2.3

 

英語の記事の方が新しいので、そちらの手順の方が良いのだろう。

VBスクリプトを稼働しているPCで作成してUSBメモリにいれ、不具合PCに指して回復オプションを使用する方法になっている。

普通に考えて面倒(というか危険)な手順になっているし、発生条件も記述されていない。
回避策で終わらせるのか、恒久対策を行うのかについても記述されていない。

かなり稀な症状なのだろうか?


私は運よく遭遇していないので試していません。

 

長くなったので、(2)は次回。(開発者向けの情報「An ADO application that is re-compiled on a Windows 7 Service Pack 1-based computer does not run on down-level operating systems」について)

2009年9月25日

Windows 7 用ドライバなど Windows 7 用ドライバなど

Windows 7 のパッケージのリリースがもう間もなく始まりますね。

改めて周りにあるデバイスとソフトの対応状況を確認してみます。

ハードウェア

こうしてみると、かなり古い機器が多いです。
Windows 7に合わせて新しくしていく予定!(あくまで予定)

Windows 7とSamba Windows 7とSamba

Windows 7 RCの時Sambaに接続できなくて困ったが、現在RTMでは接続できている。

Samba側の設定も特に変更していない。
Sambaの更新はDebian Etchのaptで行っているだけ。

パッケージのバージョンは多少古い。

samba 3.0.24-6etch10

Windows側が直したのかSamba側が対応したのか不明だが(多分前者だと勝手に推測)、現状問題は起きていない。

Windows7 RCのときにVisualStudio 2008上で、LinuxサーバにASP.NETのサイトを配置する事が出来なくなり、態々ftpを立ち上げたが再度配置の設定をUNCに戻すことにする。

2009年9月24日

Windows SDK for Windows 7 (Windows SDK v7.0) Windows SDK for Windows 7 (Windows SDK v7.0)

Windows 7 に対応したWindows SDK v7.0が既にリリースされてます。

Visual Studio 2008に含まれているWindows SDKはv6.0Aなので、Windows7の新機能を使う場合、別途v7.0をダウンロードしてインストールします。

 

ISO版:
http://www.microsoft.com/downloads/details.aspx?familyid=71DEB800-C591-4F97-A900-BEA146E4FAE1&displaylang=en

Web Setup版:
http://www.microsoft.com/downloads/details.aspx?familyid=C17BA869-9671-4330-A63E-1FD44E0E2505&displaylang=en

インストール完了後Visual Studio 2008と統合する作業があります。

続きを読む "Windows SDK for Windows 7 (Windows SDK v7.0)"