ユーザー モード ドライバーとデスクトップ アプリでの Microsoft C ランタイムの使用
このトピックでは、Windows 8 および Windows 8.1 用のアプリケーションとドライバーを使って C ランタイム ライブラリを配布する方法について説明します。ユーザー モード ドライバーとデスクトップ アプリケーションの作成者がコードをコンパイルし、必要な C ランタイム ライブラリと共に再頒布できるようにパッケージ化するためのガイドラインを示します。
- C ランタイム ライブラリ (CRT) の Windows 共有コンポーネントへの付属停止
- Microsoft がこの変更を行った理由
- C ランタイムを使ったコードのビルド
- C ランタイムの再頒布
- 推奨される戦略
- C ランタイム ライブラリとのコードのリンク
- まとめ: 必要な作業
- 関連トピック
C ランタイム ライブラリ (CRT) の Windows 共有コンポーネントへの付属停止
以前は、C ランタイム ライブラリ (CRT) が Window 共有システム コンポーネントとして配布されていました。以前のバージョンの WDK では、ドライバーや従来型の Windows アプリをビルドするときに、コードを Windows システム バージョンの CRT とリンクできました。Windows 8 リリースでは、C ランタイム ライブラリがシステム コンポーネントとは見なされなくなったため、ユーザー モード ドライバーやデスクトップ アプリケーションと共に再頒布可能バージョンの CRT を出荷する必要があります。このトピックでは、この変更の理由、C ランタイムの新しいコンポーネント、デスクトップ アプリやドライバーをビルドして CRT を再頒布するための戦略について説明します。
Microsoft がこの変更を行った理由
C ランタイムのバージョンは、2 つになりました。1 つは内部 Windows コンポーネントです。もう 1 つはアプリケーション開発者とドライバー開発者が使うバージョンで、Visual Studio に付属します。この変更を行った主な理由は、一貫性を保ち、顧客への CRT の提供をサポートするためです。
以前、アプリケーションは、適切なバージョンの CRT DLL がインストールされていないコンピューターの CRT バージョンにリンクされていることがありました。共通公開バージョンの CRT を使うことは、この問題を解消するのに役立ちます。
加えて、CRT の提供は複雑な場合があります。Visual C チームは、Visual Studio に付属する CRT の更新プログラムを定期的に提供する予定です。推奨される再頒布戦略を使うことで、これらの変更の中からアプリケーションに合うものを簡単に選ぶことができます。さらに、Windows システム バージョンの CRT に加えられた変更によってアプリケーションが停止することを心配する必要はありません。
msvcrt.dll は、Windows によって所有およびビルドされるシステム コンポーネントになりました。これは、システム レベルのコンポーネントだけが使います。msvcr110.dll ファイル (Visual Studio 2012) や msvcr120.dll ファイル (Microsoft Visual Studio 2013) は、新しい公開バージョンの CRT であり、デスクトップ アプリケーションとユーザー モード ドライバーの開発者が使います。
C ランタイムを使ったコードのビルド
Visual C++ は、最新バージョンの CRT を開発システム上の System32 ディレクトリにインストールします。これは、開発者の利便性のためにインストールされます。インストールされていないと、Visual C++ を使ってビルドされ、共有 CRT とリンクされたすべてのプロジェクトをデバッグして実行するために、DLL のコピーがビルド ディレクトリに必要になります。msvcr120.dll は、Windows 8.1 および Windows 8 と以前のバージョンの Windows (Windows Vista 以降) を対象とするドライバーに使うことができます。
C ランタイムの再頒布
Microsoft Visual Studio でユーザー モード ドライバーや従来型のデスクトップ アプリケーションをビルドするときに、アプリケーションによって C ランタイム ライブラリ (CRT) が使われる場合、適切な CRT ダイナミック リンク ライブラリを配布する必要があります。
推奨される CRT 再頒布戦略は、ビルドするアプリケーションやドライバーの種類によって異なります。Windows 8 と Windows 8.1 には、Visual C++ の再頒布可能パッケージ (VCRedist_x86.exe、VCRedist_x64.exe、VCRedist_arm.exe) が用意されており、Visual Studio に付属しています。開発者は、再頒布可能パッケージを他のバイナリと結び付けることができます。 再頒布可能パッケージを使う場合、顧客のコンピューター側で自動的に C/C++ ランタイムを提供できます。 分離する場合は、静的にリンクするか、他のバイナリと同時に特定の Visual C/C++ DLL をアプリケーション ローカル フォルダーにコピーすることができます。アプリケーション ローカル フォルダーとは、アプリケーションの実行可能ファイルが存在するフォルダーのことです。DLL は、アプリケーション ローカル フォルダーに展開する必要があります。
Visual C/C++ の再頒布可能パッケージ (VCRedist_*.exe) は、アプリケーションとして提供されます。インストールに再頒布可能パッケージが含まれている場合、初期セットアップ時に最新バージョンが System32 にインストールされ、通常のパッケージのように Microsoft Update サービスを使って更新が有効になります。Visual C/C++ の再頒布可能パッケージのすべてのコンポーネントは、単一のユニットとして更新されます。
再頒布可能パッケージを使わずに個々の CRT コンポーネントを System32 にコピーした場合、これらのコンポーネントは自動的に提供されないため、誤って上書きしてしまう可能性があります。
ドライバーが CRT コンポーネントを System32 にコピーして、別のプログラムが再頒布パッケージを実行した場合、問題が発生する可能性があります (ドライバーによってインストールされたバージョンが上書きされます)。逆の場合も問題となります。プログラムが再頒布可能パッケージを実行して、ドライバーがそれより前のバージョンの CRT コンポーネントを System32 にコピーした場合、アプリケーションが停止する可能性があります。INF のインストール プロセスでは、インストールするライブラリのバージョン番号と、System32 に既に存在するライブラリのバージョン番号が比較されるだけのため、異なる場合は上書きされます。
推奨される戦略
ドライバーやアプリケーションと共に C/C++ ランタイム コンポーネントを再頒布する場合は、次の戦略を使います。
Program Files にインストールされるアプリケーションの場合
- System32 の下に CRT を展開する Visual C++ の再頒布可能パッケージ (VCRedist_x86.exe、VCRedist_x64.exe、VCRedist_arm.exe) を使います。この場合、再頒布可能パッケージを自動的に更新できます。
- あるいは、DLL をアプリケーション ローカル ディレクトリにインストールするか (アプリケーションがインストールされているディレクトリに直接コピーされます)、CRT に静的にリンクします。この場合、CRT を手動で提供する必要があります。
プリンター ドライバーの場合
- これらのドライバーの場合、必要な CRT ファイルが INF に含まれているため、CRT ファイルがドライバーのペイロードの一部としてドライバー ストアにコピーされます。
- V4 プリンター ドライバーは、セットアップに共同インストーラーを使うことができないため、INF は C/C++ ランタイム ライブラリの関連バイナリをドライバー ストアにコピーする必要があります。これを行うには、ドライバー パッケージの [COPY_FILES] セクションにある該当ファイルを参照する必要があります。
- V3 プリンター ドライバーは、セットアップに共同インストーラーを使いません。ポイント アンド プリント接続中には実行されないためです。これらのドライバーは、ドライバー パッケージの [COPY_FILES] セクションにある該当ファイルを参照する必要があります。
CRT バイナリを INF の [COPY_FILES] セクションに含める方法の例を次に示します。
[COPY_FILES]
;CRT
Msvcr120.dll
; other files
[SourceDisksFiles]
Msvcr120.dll = 2
; other files
[SourceDisksNames.amd64]
1 = %Location%,,,
2 = %Location%,,,"amd64"
UMDF ドライバーの場合
- ドライバーを CRT に静的にリンクして、ランタイムをライブラリに含めます。この場合、CRT を再頒布する必要はありません。
C ランタイム ライブラリとのコードのリンク
次のライブラリには、C ランタイム ライブラリ関数が含まれています。
用語 | 説明 |
---|---|
Msvcr120.dll |
C ランタイム。 |
Msvcp120.dll |
C++ ランタイム。 |
Msvcr120d.dll |
C ランタイムのデバッグ バージョン。再頒布できません。 |
Msvcp120d.dll |
C++ ランタイムのデバッグ バージョン。再頒布できません。 |
アプリケーションと共に再頒布する必要がある DLL を特定するには、アプリケーションが依存している DLL の一覧を収集する必要があります。一覧を収集する 1 つの方法として、Dependency Walker (depends.exe) を実行できます。
依存関係の一覧を持っている場合、Visual Studio 2013 Preview および Visual Studio 2013 SDK Preview 用再頒布可能コードに関するページで説明されているファイルの一覧と比較します。詳しくは、再頒布する DLL の特定に関するページと展開方法の選択に関するページをご覧ください。
Visual Studio に含まれているすべてのファイルを再頒布することはできません。Visual Studio 2013 Preview および Visual Studio 2013 SDK Preview 用再頒布可能コードに関するページに記載されているファイルのみ再頒布することができます。アプリケーションのデバッグ バージョンと各種 Visual C++ ダイナミック リンク ライブラリは、再頒布できません。
まとめ: 必要な作業
可能であれば、インストール プロセスの一部として Visual C++ の再頒布可能パッケージ (VCRedist_x86.exe、VCRedist_x64.exe、VCRedist_arm.exe) の VCRedist.msi を使います。
プリンター ドライバーの場合、デスクトップ アプリケーションのローカルで CRT をドライバー ストアに展開します。
UMDF ドライバーの場合、CRT をドライバー コードに静的にリンクします。
関連トピック
Visual Studio 2013 Preview および Visual Studio 2013 SDK Preview 用再頒布可能コード