Почему%1 редко подставляется в "%1 не является допустимым приложением Win32".

Я уверен, что большинство разработчиков Windows знакомы с этим сообщением об ошибке, обычно при попытке смешать 32- и 64-разрядные исполняемые файлы. В частности, Python и Java могут получить его.

% 1 не является допустимым приложением Win32.

Понятно, что %1 представляет первый аргумент для команды, в которой произошла ошибка - т.е. исполняемый файл, который пытается быть загружен, - но почему он не заполняется фактическим путем?

Это то, что вызывающая сторона делает неправильно, или это основной сбой в какой-либо подсистеме Windows, который не может быть исправлен по причинам совместимости?

2 ответа

Решение

Сообщение об ошибке приходит из самой Windows, полный список вы можете увидеть в Кодах системных ошибок (0-499). Вы переводите код ошибки, возвращенный API, в сообщение, используя FormatMessage, который имеет необязательный Arguments массив; любой %1 в сообщении будет заменен первый элемент в этом массиве. Если для аргументов ничего не передается, %1 останется без изменений, если FORMAT_MESSAGE_IGNORE_INSERTS флаг был использован или FormatMessage потерпит неудачу, если это не так (спасибо IInspectable за эту информацию).

В качестве примера того, как это может быть пропущено, рассмотрим код, в котором код ошибки немедленно преобразуется в исключение. Если исключение содержит код ошибки, но ничего больше, тогда нет контекста, чтобы знать, что передать FormatMessage,

Звонящий делает все правильно. Они вызывают FormatMessage, передавая FORMAT_MESSAGE_IGNORE_INSERTS флаг 1), как и все должны. Вызывающая сторона не контролирует создаваемое сообщение и не может знать, что ему следует передать дополнительные аргументы, какими они должны быть или сколько.

Это была ранняя ошибка проектирования в системе отчетов об ошибках Windows, и вы увидите эти заполнители в каждом приложении с хорошим поведением.


1) См . Важность флага FORMAT_MESSAGE_IGNORE_INSERTS.

Другие вопросы по тегам