次の方法で共有


ユーザー モード ドライバーとデスクトップ アプリでの 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 でユーザー モードのドライバー プロジェクトをビルドする際に、PlatformToolsetWindowsUserModeDriver10.0 に設定した場合、ツールセットではプロジェクトで指定されたランタイム ライブラリが無視され、代わりに VC++ ランタイムに対して静的に、UCRT に対して動的にリンクされます。 このツールセットを使用する場合、このハイブリッドなリンク動作を再構成することはできません。

WindowsUserModeDriver10.0 ツールセットを使用しない場合は、次の手順に従って変更を行います (たとえば、別の DLL を含める)。

  1. 一般的に静的なリンクを設定する: [プロパティ] > [C/C++] > [コード生成] > [ランタイム ライブラリ] = [マルチスレッド (/MT)]
  2. 静的にリンクされた UCRT を削除する: [プロパティ] > [リンカー] > [入力] > [特定の既定のライブラリを無視] += libucrt.lib
  3. 動的にリンクされた 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.exeVCRedist_x64.exeVCRedist_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 RedistributeChoosing 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++ ランタイムのデバッグ バージョン - 再頒布は許可されていません