为什么 %1 很少在“%1 不是有效的 Win32 应用程序”中被替换。

Why is %1 rarely substituted in "%1 is not a valid Win32 application."

我相信大多数 Windows 开发人员都熟悉此错误消息,通常是在尝试混合使用 32 位和 64 位可执行文件时。特别是Python和Java都可以得到。

%1 is not a valid Win32 application.

很明显 %1 代表失败命令的第一个参数 - 即试图加载的可执行文件 - 但为什么它没有填充实际路径?

是调用者做错了什么,还是由于兼容性原因无法修复的某些 Windows 子系统的基本故障?

错误消息来自 Windows 本身,您可以在 System Error Codes (0-499). You translate an error code returned by the API into a message using FormatMessage, which has an optional Arguments array; any %1 in the message will be replaced by the first element in this array. If nothing is passed for the arguments, the %1 will be left unchanged if the FORMAT_MESSAGE_IGNORE_INSERTS flag was used or the FormatMessage will fail if it wasn't (thanks to 查看完整列表以获取该信息)。

作为一个可能会被遗漏的示例,请考虑错误代码立即转换为异常的代码。如果异常包含错误代码 但没有其他内容 ,则没有上下文可以知道要传递给 FormatMessage.

的内容

来电者一切正常。他们正在调用 FormatMessage,传递 FORMAT_MESSAGE_IGNORE_INSERTS 标志 1),就像每个人都应该做的那样。调用者无法控制创建的消息,也无法知道它应该传递额外的参数,它们应该是什么类型或多少。

这是 Windows 错误报告系统中的早期设计错误,您会在每个运行良好的应用程序中看到这些占位符。


1) 参见 The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag