Utilisation de Microsoft C Runtime avec des pilotes User-Mode et des applications de bureau
Si vous créez des applications ou des pilotes pour Windows 10, il vous suffit de lire cette section. Si vous utilisez une version de Visual Studio antérieure à Visual Studio 2015, ignorez cette section et commencez par Redistribuer le runtime C (s’applique à avant Visual Studio 2015).
À compter de Visual Studio 2015, le runtime C universel (UCRT) englobe le runtime C. Les autres éléments requis pour un programme complet (fonctionnalités de langage C/C++, bibliothèque C++) sont fournis par Visual Studio dans le vc++ Redistributable. Pour éviter une exigence de redistribution du runtime, ces éléments sont liés de manière statique.
Avertissement
Lors de la génération d’un projet de pilote en mode utilisateur dans Visual Studio, si vous définissez PlatformToolsetWindowsUserModeDriver10.0
sur , l’ensemble d’outils ignore toute bibliothèque d’exécution spécifiée dans le projet et établit des liens statiques avec le runtime VC++ et dynamiquement avec l’UCRT. Lorsque vous utilisez cet ensemble d’outils, ce comportement de liaison hybride ne peut pas être reconfiguré.
Si vous n’utilisez pas l’ensemble WindowsUserModeDriver10.0
d’outils, utilisez la procédure suivante pour apporter des modifications (par exemple, inclure une autre DLL) :
- Défini pour établir un lien statique en général : Propriétés > C/C++ > Bibliothèque runtime de génération > de code = Multithread (/MT)
- Supprimer l’UCRT lié de manière statique : Propriétés : entrée > de l’éditeur > de liens > Ignore les bibliothèques par défaut spécifiques += libucrt.lib
- Ajoutez l’UCRT lié dynamiquement : Propriétés > Linker > Input > Additional Dépendances += ucrt.lib, Properties > Linker > Input > Ignore Specific Default Libraries += libucrt.lib
Redistribution du runtime C (s’applique à avant Visual Studio 2015)
Notes
Toutes les informations situées sous ce point s’appliquent uniquement aux informations antérieures à 2015. Avant 2015, il existait deux versions distinctes du runtime C : le runtime Visual C++ (VCRT, par exemple msvcr120.dll
) et le CRT Windows hérité (msvcrt.dll
).
Visual Studio installe la dernière version du VCRT dans le System32
répertoire. Si le fichier ne se trouve pas à cet emplacement, vous pouvez le copier directement dans le répertoire de build de votre projet Visual C++.
Si votre pilote en mode utilisateur ou votre application de bureau utilise le VCRT, vous devez distribuer les bibliothèques de liens dynamiques appropriées. Utilisez le package Visual C++ Redistributable (VCRedist_x86.exe
, VCRedist_x64.exe
, VCRedist_arm.exe
). Chaînez le package redistribuable avec d’autres fichiers binaires, et le package redistribuable recevra des mises à jour automatiques.
Si vous souhaitez effectuer l’isolation ou éviter la dépendance vis-à-vis du redistributable VC++, vous pouvez créer un lien statique vers le CRT à la place. Bien que les projets non-pilotes soient généralement en mesure de copier les DLL Visual C/C++ spécifiques dans le dossier local de l’application (où l’application est installée) pour éviter une dépendance au vc++ Redistributable, le déploiement local d’application n’est pas approprié pour un pilote.
Ne copiez pas de composants CRT individuels vers System32
au lieu d’utiliser un package redistribuable. Cela peut empêcher le crt d’être automatiquement pris en charge et potentiellement d’être remplacé.
Les considérations spéciales suivantes s’appliquent aux pilotes d’imprimante :
- Ces pilotes doivent inclure les fichiers CRT requis dans l’INF, afin que les fichiers CRT soient copiés dans le magasin de pilotes dans le cadre de la charge utile du pilote.
- Les pilotes d’impression V4 ne pouvant pas utiliser de co-programme d’installation, le fichier INF doit copier les fichiers binaires pertinents de la bibliothèque runtime C/C++ dans le magasin de pilotes. Pour ce faire, référencez les fichiers appropriés dans la section [COPY_FILES] du package de pilotes.
- Les pilotes d’impression V3 ne doivent pas utiliser de co-programme d’installation, car ils ne sont pas exécutés pendant les connexions Point et Print. Ces pilotes doivent référencer les fichiers appropriés dans la section [COPY_FILES] du package de pilotes.
Voici un exemple d’inclure les fichiers binaires CRT dans la section [COPY_FILES] d’un fichier INF :
[COPY_FILES]
;CRT
Msvcr120.dll
; other files
* [SourceDisksFiles]
Msvcr120.dll = 2
; other files
* [SourceDisksNames.amd64]
1 = %Location%,,,
2 = %Location%,,,"amd64"
Pour les pilotes UMDF :
- Liez statiquement votre pilote au CRT pour inclure le runtime dans le binaire. Dans ce cas, vous n’avez pas besoin de redistribuer le CRT.
Liaison de votre code avec les bibliothèques runtime C (s’applique à avant Visual Studio 2015)
Pour déterminer les DLL que vous devez redistribuer avec votre application, collectez une liste des DLL dont dépend votre application. Une façon de collecter la liste consiste à exécuter Dependency Walker (depends.exe
).
Pour plus d’informations, consultez Détermination des DLL à redistribuer et Choix d’une méthode de déploiement.
Vous ne pouvez pas redistribuer tous les fichiers inclus dans Visual Studio ; vous êtes uniquement autorisé à redistribuer les fichiers spécifiés dans Code redistribuable pour Visual Studio 2013 préversion et Visual Studio 2013 SDK Preview. Les versions de débogage des applications et des différentes bibliothèques de liens dynamiques Visual C++ ne sont pas redistribuables.
Les bibliothèques suivantes contiennent les fonctions de bibliothèque d’exécution C :
Terme | Description |
---|---|
Msvcr120.dll | Runtime C |
Msvcp120.dll | Runtime C++ |
Msvcr120d.dll | Version de débogage du runtime C - aucune redistribution autorisée |
Msvcp120d.dll | Version de débogage du runtime C++ - aucune redistribution autorisée |