3. 一般的な互換性問題この章では、以下のような一般的な互換性問題について紹介します。
3.1 非公開情報に依存しないMicrosoft が推奨・公開している方法を使用して、アプリケーションを開発します。SDK では公開されていない関数・データ構造体・レジストリなどは、次のバージョンアップの際に変更されたり、なくなったりする可能性があります。そのため、その時の OS では動作しても、次のバージョンの OS で問題が発生する可能性があります。 ページのトップへ 3.2 OS のバージョン チェックWindows の内部バージョン番号Windows 7 の内部バージョン番号は、「6.1」です。内部バージョン番号は、OS のバージョン アップに伴い更新されます。(メジャー バージョンは「6」、マイナー バージョンは「1」となります。) これまでの Windows の内部バージョンは以下のとおりです。
アプリケーションが「OS の特定のバージョンかどうか」をチェックしている場合、正しく動作しない可能性があります。たとえば、バージョンが「5.1 かどうか」をチェックしている場合には、Windows 7 は「6.1」を返すため、正しく動作しません。 特に Windows Vista と Windows 7 では、Windows 2000 以来のメジャーバージョンアップがおこなわれています。そのため、「メジャーバージョンが一致すること」のみをチェックしているアプリケーションは、Windows XP や Windows Server 2003 までは正しく動作しても、Windows Vista や Windows 7 では正しく動作しない可能性があります。たとえば、この場合はバージョンが「5 以上かどうか」をチェックすることで正しく動作させることができます。 OS のバージョン チェックの検証バージョン チェック問題による実行の失敗は、アプリケーションによって発生するタイミングが異なります。一般的にはインストール時やアンインストール時、起動時にバージョン チェックをすることが多いため、これらのタイミングで失敗することが多いといえます。 図 3-1: バージョンエラー
適切なバージョン チェック既存のアプリケーションを、新しい OS にインストールできない最大の理由は、アプリケーションがバージョン番号を正しく扱わないことです。このようなアプリケーションでは、バージョン チェックの部分さえ取り除いてしまえば、新しい Windows でも問題なく動作することがよくあります。ここでは、正しいバージョン チェックの方法を紹介します。
OS に特定の機能があるかどうかを検証したい場合、バージョン番号だけをチェックするのは最善の方法ではありません。新しい OS がリリースされたり、サービスパックなどの提供により、新しい機能が追加されたりすることもあるからです。 特定の機能の有無を確認するには、バージョン番号に依存するのではなく、その機能をサポートしているかどうかをチェックすることが重要です。これは、Windows 開発チームが推奨する方法です。
ページのトップへ 3.3 ファイルやフォルダー パスの取得ファイルやフォルダー パスの変更Windows では、各リリースでいくつかのフォルダーの位置が変更されています。たとえばマイ ドキュメント フォルダーは、Windows 95 からWindows 7 までの間に以下のようにパスが変わっています。
Windows Vista では、マイ ドキュメント フォルダーの表示名 (エクスプローラーで開いたときに表示される名前) は、「ドキュメント」でした。しかし、Windows 7 では、「マイ ドキュメント」に戻っています。これは、Windows 7 では、図 3-4 のように、「ライブラリ」内に「ドキュメント」ライブラリが作成され、その中に、「マイ ドキュメント」と「パブリックのドキュメント」が含まれるようになったからです。この「マイ ドキュメント」が「Documents」フォルダーです。 図 3-4: ドキュメントとマイ ドキュメント ただ、Windows 7 でも、「Documents」というフォルダー名自体は変更されていないので、Windows Vista への対応が完了しているアプリケーションはそのまま使うことができます。 ※他にも変更されているフォルダーがあります。詳細は、「4.1 リソースの管理」を参照してください。 フォルダーやファイル パスの取得方法
このコードでは、「CSIDL_SYSTEM」CSLID 値を使用して、Windows のシステム フォルダーへのパスを取得しています。以下に、よく使用される CSIDL 値を示します。
ページのトップへ 3.4 ファイルへの署名デジタル署名の必要性インターネットからソフトウェアをダウンロードする場合、そのソフトウェアが適切な発行元で、適切に作成されたことが保証されないと、信用できないソフトウェアや悪意のあるソフトウェアをインストールしてしまう可能性があります。これらをインストールしてしまうと、システムの安定性やセキュリティに悪影響を及ぼします。 そこで、ソフトウェアが正規の発行元から提供されていて、しかも改ざんされていないことを証明するために、デジタル署名を使用することができます。デジタル署名により、管理者やユーザーはソフトウェアをインストールする前に、信頼できるソフトウェアかどうかを確認することができます。 デジタル署名による改ざんの防止デジタル署名は、公開鍵暗号基盤 (PKI) を使用しており、改ざんを防ぐことができます。たとえば、ソフトウェアの発行元がデジタル署名すると、以下のような手順で安全にソフトウェアを送信できます。
図 3-5: デジタル署名を利用したソフトウェアの送信 デジタル署名では、ユーザーが取得した、「発行元の公開キーが正当なものである」ということが前提になっています。公開キーが改ざんされた場合には、デジタル署名は意味を持ちません。そこで、公開キーの正当性を確保するために「デジタル証明書」を使用します。デジタル証明書はインターネットにおける電子的な身分証明書で、証明機関 (CA: Certification Authority) により発行されます。デジタル証明書には発行元の「公開キー」が含まれているため、送信先のユーザーに提示すれば、自分の公開キーを安全に送信することができます。 Authenticode 証明書とはWindows では、デジタル証明書を利用したコードへの署名の手法として、「Authenticode」といわれる技術を提供しています。Authenticode で使用される証明書のことを「Authenticode 証明書」といいます。以下に、Authenticode 証明書がどのように使用されているのかを示します。
これにより、図 3-5 の手順 5 で使用する公開キーを取得したことになるため、受け取ったデジタル署名を復号することができます。 図 3-6: 証明書を利用した公開キーの送信 証明書を発行する証明機関は、ユーザーのコンピューター上に「信頼する証明機関」として登録されている必要があります。ユーザーが信頼する証明機関は、Internet Explorer で [ツール] メニューから [インターネットオプション] を選択し、「コンテンツ」タブから「証明書」ボタンをクリックして確認することができます。この画面で、信頼する証明機関を追加することもできます。 図 3-7: 信頼された証明機関 Authenticode の利用場面Windows XP までは、インターネット サイトから取得した Active X コントロールや Java アプレットなどのダウンロード パッケージや実行可能ファイル、およびドライバーをインストールする際に、デジタル署名をチェックし、ユーザーが信頼していない発行元のソフトウェアには、警告を表示することでインストールを阻止することができました。 Windows Vista や Windows 7 ではこれに加えて、いくつかの新機能がデジタル署名と連動しているため、デジタル署名の使用が義務付けられているコードが増えています。対象となるソフトウェアは以下の通りです。
コンピューターや周辺機器などのハードウェアやドライバーが、Windows 対応製品としてふさわしいかどうかをテストする組織です。WHQL で認定されると、Windows 対応ロゴを取得することができます。 Windows Vista から導入されているプログラムで、デバイスのロゴを取得するためのベースとなるテストを提供します。DRS に合格すると、Microsoft からデジタル署名ファイルを入手することができます。 Authenticode 証明書は、バージョンに依存しないので、Windows XP で利用していたものが使えます。また、証明書には有効期限がありますが、有効期限内であれば何度でも利用することができます。つまり、1 つの証明書で複数のソフトウェアを署名することができます。 他の機能との連動Windows Vista や Windows 7 では、以下の新機能がデジタル署名と連動しています。
ソフトウェアへのデジタル署名Windows Vista や Windows 7 では、すべての実行可能ファイルに Authenticode 証明書を使用して署名すべきです。拡張子 .exe、.dll、.ocx、.sys、.cpl、.drv および .scr のついたファイルが対象です。Authenticode 証明書による署名のための手順を以下に示します。
通常、Authenticode 証明書は企業内で管理されています。そのため、開発やテストの段階では使用できないことがあります。MakeCert コマンドを使用すると、テスト用の証明書を作成することができます。使用例は、次の通りです。 MakeCert -r -pe -ss TestCertStoreName -n "CN=CertName" CertFileName.cer 各オプションの意味は、次の通りです。
MakeCert の詳細については、Microsoft の Web サイト「証明書作成ツール (Makecert.exe)」を参照してください。 ソフトウェアをテストするコンピューターでは、対応する MakeCert テスト証明書をそのコンピューターの信頼されたルート証明機関の証明書ストアと、信頼された発行元の証明書ストアにインストールする必要があります。発行元が信頼されていないと、インストールの際に、信頼されていないことを通知する、図 3-8 のようなダイアログが表示されます。 図 3-8: 不明な発行元を告げるダイアログ ボックス あらかじめ、MakeCert テスト証明書をそのコンピューターの信頼されたルート証明機関の証明書ストアなどにインストールしておくと、ソフトウェアパッケージは、署名付きとして扱われるため、図 3-9 のようなダイアログボックスが表示されます。 図 3-9: 発行者の確認 証明書をインストールするためには、Internet Explorer で [ツール] メニューから、[インターネットオプション] を選択し、「コンテンツ」タブから「証明書」ボタンを選択します。 厳密名付きのアセンブリを作成するときには、秘密キーと公開キーが必要です。秘密キーはデジタル署名のために使われます。また、公開キーは厳密名の一部となるため、他のアセンブリがそのアセンブリを参照するときなどには必須となります。 しかし、企業においては、公開キーや証明書は容易に取得できても、秘密キーは厳重に管理されているため、開発者が日常的にアクセスすることは難しいといえます。このような場面では、遅延署名を使用します。遅延署名を利用すると、ビルド時は、デジタル署名用のスペースを予約するだけで、署名しないため、秘密キーがなくてもビルドすることができます。 Visual Studio を使用して、遅延署名を設定する手順は、以下の通りです。
図 3-10: [署名] タブ 遅延署名を設定したプロジェクトは、ビルドはできますが実行はできません。また、グローバルアセンブリキャッシュにも登録できません。これは現段階では署名がないからです。しかし、以下のコマンドを実行すると、一時的にそのアセンブリの署名を確認しないようにすることができるため、アセンブリが実行できるようになります。 sn.exe -Vr Application.dll
このオプションは、開発時にのみ設定します。署名の検証を省略したままにしておくと、悪意のあるアセンブリによって、偽装される可能性があります。解除方法は、後述します。 出荷直前に企業の秘密キーでデジタル署名するために、以下のコマンドを実行します。 sn.exe –R Application.dll
前の手順で「sn.exe -Vr」を実行しているため、このままでは署名の検証がおこなわれません。署名の検証を有効にするため、必ず以下のコマンドを実行します。 sn.exe -Vu Application.dll
ページのトップへ 3.5 x64 バージョンのサポートWindows Vista や Windows 7 では、AMD や Intel の 64 ビットアーキテクチャプロセッサを完全にサポートしています。64 ビット版 Windows 7 では、64 ビットのネイティブコードのほか、WoW64 (Windows on Windows 64) サブシステムにより 32 ビットアプリケーションの動作環境が提供されます。 サポートされないソフトウェア以下のソフトウェアは WoW64 上で実行することはできません。
これらの問題点に対する回避策はないため、以下の方法で対処します。
ファイル リダイレクションとレジストリ リダイレクションWoW64 は、32 ビットアプリケーションと、64 ビット カーネルを仲介します。そして、Windows Vista や Windows 7 では互換性のために 32 ビット用と 64 ビット用の 2 つのシステムファイルが用意されていますが、32 ビットのアプリケーションからのアクセスの場合には、32 ビット用のシステムディレクトリに自動的に切り替えられるようになっています。このファイルリダイレクション機能は、WoW64 により提供されます。 同様に、ソフトウェア用のレジストリも 32 ビット用と 64 ビット用が用意されていて、WoW64 のレジストリリダイレクション機能により自動的にリダイレクトされます。 64 ビットバージョンのアプリケーションの作成.NET Framework 1.0 や 1.1 で作成されたアプリケーションは、すべて 32 ビットアプリケーションとして作成されます。一方、.NET Framework 2.0 以降では、32 ビットに加え、64 ビットのアプリケーションも作成できるようになっています。どのタイプのアプリケーションを作成するかは、コンパイラのオプションにより設定できます。以下に主要な言語での設定方法を紹介します。
|
ページのトップへ