Поделиться через


Использование среды выполнения Microsoft C с драйверами User-Mode и классическими приложениями

Если вы создаете приложения или драйверы для Windows 10, ознакомьтесь только с этим разделом. Если вы используете версию Visual Studio, более раннюю, чем Visual Studio 2015, пропустите этот раздел и начните с повторного распространения среды выполнения C (применимо к до Visual Studio 2015).

Начиная с Visual Studio 2015, универсальная среда выполнения C (UCRT) охватывает среду выполнения C. Другие компоненты, необходимые для полной программы (функции языка C/C++, библиотека C++), предоставляются Visual Studio в распространяемом компоненте VC++. Чтобы избежать требования к перераспределению в среде выполнения, эти элементы связаны статически.

Предупреждение

Если при построении проекта драйвера пользовательского режима в 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)

Примечание

Все сведения, приведенные ниже, относятся только к до 2015 года. До 2015 года существовали две отдельные версии среды выполнения C: среда выполнения Visual C++ (например msvcr120.dll, VCRT) и устаревшая версия Windows CRT (msvcrt.dll).

Visual Studio устанавливает последнюю версию VCRT в System32 каталог. Если файл находится не в этом расположении, его можно скопировать непосредственно в каталог сборки проекта Visual C++.

Если драйвер пользовательского режима или классическое приложение использует VCRT, необходимо распространить соответствующие библиотеки динамической компоновки. Используйте пакет Распространяемый компонент Visual C++ (VCRedist_x86.exe, VCRedist_x64.exe, VCRedist_arm.exe). Зацепите распространяемый пакет с другими двоичными файлами, и распространяемый пакет получит автоматические обновления.

Если вы хотите обеспечить изоляцию или избежать зависимости от распространяемого компонента VC++, можно связать статически с CRT. Хотя проекты, не связанные с драйверами, обычно могут копировать определенные библиотеки DLL Visual C/C++ в локальную папку приложения (где установлено приложение), чтобы избежать зависимости от распространяемого компонента VC++, локальное развертывание приложения не подходит для драйвера.

Не копируйте отдельные компоненты System32 CRT вместо использования распространяемого пакета. Это может привести к тому, что CRT не будет обслуживаться автоматически и, возможно, будет перезаписана.

Для драйверов принтера необходимо учитывать следующие особенности:

  • Эти драйверы должны включать необходимые CRT-файлы в inf, поэтому CRT-файлы копируются в хранилище драйверов как часть полезных данных драйвера.
  • Драйверы печати версии 4 не могут использовать совместный установщик для установки, поэтому inf-файл должен скопировать соответствующие двоичные файлы библиотеки среды выполнения C/C++ в хранилище драйверов. Для этого сослаться на соответствующие файлы в разделе [COPY_FILES] пакета драйвера.
  • Драйверы печати версии 3 не должны использовать совместные установщики для установки, так как они не запускаются во время подключений Point и Print. Эти драйверы должны ссылаться на соответствующие файлы в разделе [COPY_FILES] пакета драйверов.

Ниже приведен пример включения двоичных файлов CRT в раздел [COPY_FILES] INF:

[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, от которых зависит ваше приложение. Один из способов сбора списка — запустить Dependency Walker (depends.exe).

Дополнительные сведения см. в разделах Определение распространяемых библиотек DLL и Выбор метода развертывания.

Невозможно повторно распространять все файлы, входящие в состав Visual Studio; Вы можете распространять только файлы, указанные в разделе Распространяемый код для предварительной версии Visual Studio 2013 и предварительной версии пакета SDK для Visual Studio 2013. Отладочные версии приложений и различные библиотеки динамической компоновки Visual C++ не распространяются.

Следующие библиотеки содержат функции библиотеки времени выполнения C:

Термин Описание
Msvcr120.dll Среда выполнения C
Msvcp120.dll Среда выполнения C++
Msvcr120d.dll Отладочная версия среды выполнения C — распространение не разрешено
Msvcp120d.dll Отладочная версия среды выполнения C++ — распространение не разрешено