ユーザー モード ドライバーとデスクトップ アプリでの Microsoft C ランタイムの使用
Windows 10 用のアプリケーションまたはドライバーをビルドする場合は、このセクションを読むだけで十分です。 Visual Studio 2015 よりも前のバージョンの Visual Studio を使用している場合は、このセクションをスキップし、「C ランタイムの再頒布 (適用対象: Visual Studio 2015 よりも前)」から開始してください。
Visual Studio 2015 以降では、ユニバーサル C ランタイム (UCRT) に C ランタイムが含まれています。 完全なプログラムに必要なその他の部分 (C/C++ 言語機能、C++ ライブラリ) は、VC++ 再頒布可能パッケージの Visual Studio によって提供されます。 ランタイムの再頒布の要件を回避するために、これらの部分は静的にリンクされます。
警告
Visual Studio でユーザー モードのドライバー プロジェクトをビルドする際に、PlatformToolset を WindowsUserModeDriver10.0
に設定した場合、ツールセットではプロジェクトで指定されたランタイム ライブラリが無視され、代わりに VC++ ランタイムに対して静的に、UCRT に対して動的にリンクされます。 このツールセットを使用する場合、このハイブリッドなリンク動作を再構成することはできません。
WindowsUserModeDriver10.0
ツールセットを使用しない場合は、次の手順に従って変更を行います (たとえば、別の DLL を含める)。
- 一般的に静的なリンクを設定する: [プロパティ] > [C/C++] > [コード生成] > [ランタイム ライブラリ] = [マルチスレッド (/MT)]
- 静的にリンクされた UCRT を削除する: [プロパティ] > [リンカー] > [入力] > [特定の既定のライブラリを無視] += libucrt.lib
- 動的にリンクされた UCRT を追加する: [プロパティ] > [リンカー] > [入力] > [追加の依存ファイル] += ucrt.lib、[プロパティ] > [リンカー] > [入力] > [特定の既定のライブラリを無視] += libucrt.lib
C ランタイムの再頒布 (適用対象: Visual Studio 2015 よりも前)
Note
これより以下の情報はすべて、2015 より前にのみ適用されます。 2015 より前には、2 つの異なるバージョンの C ランタイムがありました。Visual C++ ランタイム (VCRT、例: msvcr120.dll
) とレガシ Windows CRT (msvcrt.dll
) です。
Visual Studio では、最新バージョンの VCRT は System32
ディレクトリにインストールされます。 ファイルがこの場所にない場合は、Visual C++ プロジェクトのビルド ディレクトリに直接コピーできます。
ユーザー モード ドライバーまたはデスクトップ アプリケーションで VCRT が使用される場合は、適切なダイナミック リンク ライブラリを配布する必要があります。 Visual C++ 再頒布可能パッケージ (VCRedist_x86.exe
、VCRedist_x64.exe
、VCRedist_arm.exe
) を使用します。 再頒布可能パッケージを他のバイナリと結び付けると、その再頒布可能パッケージが自動更新を受信するようになります。
分離を実現したり、VC++ 再頒布可能パッケージへの依存関係を回避したりする場合は、代わりに CRT に静的にリンクすることができます。 ドライバー以外のプロジェクトでは通常、特定の Visual C/C++ DLL を "アプリケーション ローカル フォルダー" (アプリケーションがインストールされる場所) にコピーして、VC++ 再頒布可能パッケージへの依存関係を回避できますが、アプリ ローカル配置はドライバーには適していません。
再頒布可能パッケージを使用する代わりに、個々の CRT コンポーネントを System32
にコピーしないでください。 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 ランタイム ライブラリとリンクする (適用対象: Visual Studio 2015 よりも前)
アプリケーションと共に再頒布する必要がある DLL を特定するには、アプリケーションが依存している DLL の一覧を収集します。 一覧を収集する方法の 1 つは、Dependency Walker (depends.exe
) を実行することです。
詳細については、Determining Which DLLs to RedistributeとChoosing a Deployment Methodを参照。
Visual Studio に含まれるすべてのファイルを再配布することはできません。再配布できるのは、Visual Studio 2013 プレビューおよび Visual Studio 2013 SDK プレビューの再頒布可能コードで指定されているファイルのみです。 アプリケーションのデバッグ バージョンとさまざまな Visual C++ ダイナミック リンク ライブラリは再配布できません。
次のライブラリには、C ランタイム ライブラリ関数が含まれています。
用語 | 説明 |
---|---|
Msvcr120.dll | C ランタイム |
Msvcp120.dll | C++ ランタイム |
Msvcr120d.dll | C ランタイムのデバッグ バージョン - 再頒布は許可されていません |
Msvcp120d.dll | C++ ランタイムのデバッグ バージョン - 再頒布は許可されていません |