GetLastError()!=古怪

时间:2012-10-18 09:34:11

标签: c++ visual-studio winapi error-handling

作为我的C ++项目的一部分,我正在使用带有WinAPI文件管理功能的文件管理结构。 在搜索临时文件名时,我有一个函数OpenNewTempFile(),它将生成一个名称,尝试通过调用结构中的另一个函数来打开它,只需OpenFile(),如果该文件已存在,则重试静默地使用不同的名称(并且无限循环)。 这是OpenFile(),如果它没有作为临时文件打开,它应该只报告已存在的文件错误。

GetLastError() oddity

有人能解释为什么if块正在执行吗? &&的第二部分不应该是真的。 当块被命中时,您可以在下面的VS停靠栏中看到当前变量,以及上面控制台窗口中返回的GetLastError()。这让我感到困惑。

编辑: 由于建议,我已将GetLastError存储在变量中。

Snap with GetLastError() stored

......好吧,这只会引发更多问题。为什么现在是80?

2 个答案:

答案 0 :(得分:1)

我认为问题是Windows中有两个“已存在的文件”代码。来自CreateFile文档:

  

CREATE_ALWAYS

     

始终创建新文件。

     

如果指定的文件存在且可写,则该函数将被覆盖   文件,函数成功,最后错误代码设置为    ERROR_ALREADY_EXISTS(183)

     

如果指定的文件不存在且是有效路径,则为新文件   创建,函数成功,最后一个错误代码设置为   零。

     

有关详细信息,请参阅本主题的“备注”部分。

     

CREATE_NEW

     

仅当新文件尚不存在时才创建新文件。

     

如果指定的文件存在,则函数失败并返回last-error   代码设置为 ERROR_FILE_EXISTS(80)

     

如果指定的文件不存在并且是可写入的有效路径   location,创建一个新文件。

你使用CREATE_NEW标志(正确),所以你应该期望显示80个代码。

答案 1 :(得分:0)

  

为什么现在是80?

80表示“文件存在”,如果您的CREATE_NEW AsTemp == true AsTemptrue,则表示您{{1}}。