繁体   English   中英

来自 Windows 上的 std::error_code 的“未知错误”

[英]"unknown error" from std::error_code on Windows

从 Windows 上的std::error_code获得的系统错误消息有一个奇怪的问题。 当我使用本地安装的 Visual Studio 构建和运行测试程序 1(见下文)时,所有系统错误代码的错误消息都显示为“未知错误”。 另一方面,当通过 Godbolt / Compiler Explorer 在相同版本的 Visual Studio 上构建和运行相同的程序时,会产生正确的错误消息(参见下面的测试程序 1 和 output)。

我在 Windows 10 上使用 Visual Studio 2022 版本 17.3.3 (MSVC 19.33) 对此进行了测试。

我正在使用 Visual Studio 的社区版本。

我尝试使用开发人员命令提示符( cl test.cpp )、使用 Visual Studio 控制台项目(默认所有设置)和使用 Visual Studio CMake 项目(默认所有设置)在本地构建。 没什么区别。 在所有情况下,所有错误消息都显示为“未知错误”。

我没有使用 Visual Studio 的经验,所以我肯定会犯一个非常基本的错误。

也欢迎任何关于我如何进一步诊断问题的建议。

Output 来自测试程序 1(见下文),当构建并通过 Godbolt / Compiler Explorer 运行时:

message = 'The directory is not empty.' (193331629)

Output 来自测试程序 1(见下文)在本地构建和运行时:

message = 'unknown error' (193331629)

Output 来自测试程序 2(见下文)在本地构建和运行时:

message = 'The directory is not empty.' (193331629)

测试程序1:

#include <windows.h>
#include <system_error>
#include <stdio.h>

int main()
{
    std::error_code ec(ERROR_DIR_NOT_EMPTY, std::system_category());
    printf("message = '%s' (%lld)\n", ec.message().c_str(), static_cast<long long>(_MSC_FULL_VER));
}

测试程序 2(用于对比):

#include <windows.h>
#include <stdio.h>

int main()
{
    char buffer[256];
    DWORD len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ERROR_DIR_NOT_EMPTY, 0, buffer, 255, NULL);
    while (len > 0 && (buffer[len - 1] == '\n' || buffer[len - 1] == '\r'))
        --len;
    buffer[len] = '\0';
    printf("message = '%s' (%lld)\n", buffer, static_cast<long long>(_MSC_FULL_VER));
}

好的,我的问题是系统语言环境设置为“en-GB”而不是“en-US”。

如果我将语言标识符 2057 (en-GB) 传递给FormatMessage()我不会收到错误消息,但如果我通过 1033 (en-US),我会这样做。

到目前为止,我还无法更改系统级语言环境,但即使可以更改,如果我的系统语言环境设置为“en-GB”,系统错误消息无法正常工作似乎不是最理想的。

我想知道这种行为背后是否有一个理性的想法,或者它是否只是被打破了。

无论如何,我认为,在我的情况下,解决方案是引入一个自定义错误类别,该类别使用语言标识符 0 调用FormatMessage() (请参阅https://docs.microsoft.com/en-us/windows/win32 /api/winbase/nf-winbase-formatmessage ),然后在处理映射到通用错误条件的函数中转发到本机系统错误类别。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM