État global dans le CRT

Certaines fonctions du runtime C universel (UCRT) utilisent l’état global. Par exemple, setlocale() définit les paramètres régionaux de l’ensemble du programme, ce qui affecte les séparateurs de chiffres, la page de codes texte, et ainsi de suite.

L’état global de l’UCRT n’est pas partagé entre les applications et le système d’exploitation. Par exemple, si votre application appelle setlocale(), elle n’affecte pas les paramètres régionaux pour les composants du système d’exploitation qui utilisent le runtime C ou l’autre moyen.

Versions propres au système d’exploitation des fonctions CRT

Dans l’UCRT, les fonctions qui interagissent avec l’état global ont une fonction « jumeau », préfixée par _o_. Par exemple :

  • setlocale() affecte l’état global spécifique à l’application.
  • _o_setlocale() affecte l’état global partagé par tous les composants du système d’exploitation, mais pas les applications.

La seule différence entre ces fonctions « jumeau » est que lorsqu’elles lisent/écrivent l’état CRT global, les versions spécifiques au système d’exploitation (c’est-à-dire les versions qui commencent par _o_) utilisent la copie du système d’exploitation de l’état global au lieu de la copie de l’état global de l’application.

Les versions spécifiques au système d’exploitation de ces fonctions se trouvent dans ucrt.osmode.lib. Par exemple, la version propre au système d’exploitation est setlocale()_o_setlocale()

Il existe deux façons d’isoler l’état CRT de votre composant à partir de l’état CRT d’une application :

  • Lier statiquement votre composant à l’aide des options /MT du compilateur (version) ou /MTd (débogage). Pour plus d’informations, consultez /MD, /MT, /LD. La liaison statique peut augmenter considérablement la taille binaire.
  • À compter des versions de Windows commençant par Windows 10 version 2004, liez dynamiquement au CRT, mais appelez les exportations en mode système d’exploitation (fonctions commençant par o). Pour appeler les exportations en mode système d’exploitation, liez statiquement comme précédemment, mais ignorez l’UCRT statique à l’aide de l’option /NODEFAULTLIB:libucrt.lib éditeur de liens (mise en production) ou /NODEFAULTLIB:libucrtd.lib (débogage). Ajoutez-y ucrt.osmode.lib l’entrée de l’éditeur de liens. Pour plus d’informations, consultez /NODEFAULTLIB (Ignorer les bibliothèques).

Remarque

Dans le code source, écrivez setlocale(), et non _o_setlocale(). Lorsque vous liez une liaison ucrt.osmode.lib, l’éditeur de liens remplace automatiquement la version spécifique au système d’exploitation de la fonction. C’est-à-dire, setlocale() sera remplacé par _o_setlocale().

La liaison par rapport ucrt.osmode.lib à désactive certains appels UCRT disponibles uniquement en mode application. La tentative d’appel de ces fonctions entraîne une erreur de lien.

État global affecté par la séparation de l’application/du système d’exploitation

L’état global affecté par la séparation de l’état de l’application et du système d’exploitation inclut :

Voir aussi

Informations de référence sur la bibliothèque d’exécution C