std::error_code
我對從Windows 上獲得的系統錯誤訊息有一個奇怪的問題。當我使用本地安裝的 Visual Studio 構建和運行測驗程式 1(見下文)時,所有系統錯誤代碼的錯誤訊息都顯示為“未知錯誤”。另一方面,當通過 Godbolt / Compiler Explorer 在相同版本的 Visual Studio 上構建和運行相同的程式時,會產生正確的錯誤訊息(參見下面的測驗程式 1 和輸出)。
我在 Windows 10 上使用 Visual Studio 2022 版本 17.3.3 (MSVC 19.33) 對此進行了測驗。
我正在使用 Visual Studio 的社區版本。
我嘗試使用開發人員命令提示符 ( cl test.cpp
)、使用 Visual Studio 控制臺專案(默認所有設定)和使用 Visual Studio CMake 專案(默認所有設定)在本地構建。沒什么區別。在所有情況下,所有錯誤訊息都顯示為“未知錯誤”。
我沒有使用 Visual Studio 的經驗,所以我肯定會犯一個非常基本的錯誤。
也歡迎任何關于我如何進一步診斷問題的建議。
通過 Godbolt / Compiler Explorer 構建和運行測驗程式 1(見下文)的輸出:
message = 'The directory is not empty.' (193331629)
在本地構建和運行時測驗程式 1(見下文)的輸出:
message = 'unknown error' (193331629)
在本地構建和運行時測驗程式 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));
}
uj5u.com熱心網友回復:
好的,我的問題是系統語言環境設定為“en-GB”而不是“en-US”。
如果我將語言識別符號 2057 (en-GB) 傳遞給FormatMessage()
我沒有收到錯誤訊息,但如果我傳遞 1033 (en-US),我會這樣做。
到目前為止,我還無法更改系統級語言環境,但即使可以更改,如果我的系統語言環境設定為“en-GB”,系統錯誤訊息無法正常作業似乎不是最理想的。
我想知道這種行為背后是否有一個理性的想法,或者它是否只是被打破了。
無論如何,我認為,在我的情況下,解決方案是引入一個自定義錯誤類別,該類別FormatMessage()
使用語言識別符號 0 呼叫(請參閱https://docs.microsoft.com/en-us/windows/win32/api/ winbase/nf-winbase-formatmessage),然后在處理映射到通用錯誤條件的函式中轉發到本機系統錯誤類別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/505092.html
上一篇:按多個首字母對國家/地區進行排序