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

时间:2017-04-25 15:36:10

标签: windows winapi dll 32bit-64bit createprocess

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

  

%1 is not a valid Win32 application.

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

调用者是否出错了,或者某些Windows子系统的基本故障是否因兼容性原因而无法修复?

2 个答案:

答案 0 :(得分:5)

错误消息来自Windows本身,您可以在System Error Codes (0-499)查看完整列表。您使用FormatMessage将API返回的错误代码转换为消息,该消息具有可选的Arguments数组;消息中的任何%1都将被此数组中的第一个元素替换。如果参数没有传递任何内容,%1如果使用了FORMAT_MESSAGE_IGNORE_INSERTS标记则保持不变,否则FormatMessage将失败(感谢IInspectable对于那些信息)。

作为如何错过这种情况的示例,请考虑将错误代码立即转换为异常的代码。如果异常包含错误代码但没有其他,则没有用于知道传递给FormatMessage的内容的上下文。

答案 1 :(得分:5)

来电者正在做正确的事。他们正在调用FormatMessage,传递FORMAT_MESSAGE_IGNORE_INSERTS标志 1),就像每个人都应该这样。调用者无法控制所创建的消息,并且无法知道它应该传递其他参数,它们应该是什么类型或者有多少类型。

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

<小时/> 1) The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag