Pourquoi% 1 rarement substitué dans “% 1 n’est pas une application Win32 valide.”

Je suis sûr que la plupart des développeurs Windows sont familiers avec ce message d’erreur, généralement lors de la tentative de mélange de fichiers exécutables 32 et 64 bits. En particulier, Python et Java peuvent tous deux l’obtenir.

% 1 n’est pas une application Win32 valide.

Il est clair que %1 représente le premier argument de la commande défaillante – c’est-à-dire l’exécutable qui essaie d’être chargé – mais pourquoi ne pas remplir le chemin d’access?

Est-ce quelque chose que l’appelant fait mal ou est-ce une défaillance de base de certains sous-systèmes Windows qui ne peuvent pas être résolus pour des raisons de compatibilité?

Le message d’erreur provient de Windows lui-même, vous pouvez voir la liste complète dans Codes d’erreur système (0-499) . Vous traduisez un code d’erreur renvoyé par l’API en un message à l’aide de FormatMessage , qui dispose d’un tableau Arguments facultatif. tout %1 dans le message sera remplacé par le premier élément de ce tableau. Si rien n’est passé pour les arguments, le %1 restra inchangé si l’indicateur FORMAT_MESSAGE_IGNORE_INSERTS a été utilisé ou si le FormatMessage échouera s’il ne l’était pas (grâce à IInspectable pour cette information).

À titre d’exemple de la façon dont cela pourrait manquer, considérez le code où un code d’erreur est immédiatement converti en une exception. Si l’exception contient le code d’erreur mais rien d’autre , il n’y a pas de contexte pour savoir quoi transmettre à FormatMessage .

L’appelant fait tout correctement. Ils appellent FormatMessage , en passant l’indicateur FORMAT_MESSAGE_IGNORE_INSERTS 1) , comme tout le monde le devrait. L’appelant ne contrôle pas le message créé et n’a aucun moyen de savoir qu’il doit transmettre des arguments supplémentaires, quels types doivent être ou combien.

C’était un bug de conception précoce dans le système de rapport d’erreurs Windows, et vous verrez ces espaces réservés dans chaque application bien comscope.


1) Voir L’importance de l’indicateur FORMAT_MESSAGE_IGNORE_INSERTS .