如何正确将 char 转换为 wchar_t

问题描述 投票:0回答:1

我正在尝试创建此消息框,但框中的文本是一种奇怪的语言。

catch (const ExceptionHandling& e)
{
    // initialize vars
    const wchar_t* wideWhat = nullptr;
    const wchar_t* wideType = nullptr;

    size_t size;
    mbstowcs_s(&size, nullptr, 0, e.what(), 0);
    if (size != static_cast<size_t>(-1))
    {

        std::wstring wideString(size + 1, L'\0');
        size_t convertedSize;
        mbstowcs_s(&convertedSize, &wideString[0], size + 1, e.what(), size);

        // save wideWhat
        wideWhat = wideString.c_str();
    }
    size_t size2;
    mbstowcs_s(&size2, nullptr, 0, e.GetType(), 0);
    if (size2 != static_cast<size_t>(-1))
    {
        std::wstring wideString(size2 + 1, L'\0');
        size_t convertedSize;
        mbstowcs_s(&convertedSize, &wideString[0], size2 + 1, e.GetType(), size2);

        // save wideType
        wideType = wideString.c_str();
    }

    // send MessageBox
    MessageBox(nullptr, wideWhat, wideType, MB_OK | MB_ICONEXCLAMATION);
}
catch (const std::exception& e)
{
    size_t size;
    mbstowcs_s(&size, nullptr, 0, e.what(), 0);
    if (size != static_cast<size_t>(-1))
    {
        std::wstring wideString(size + 1, L'\0');
        size_t convertedSize;
        mbstowcs_s(&convertedSize, &wideString[0], size + 1, e.what(), size);

        MessageBox(nullptr, wideString.c_str(), L"Standard Exception", MB_OK | MB_ICONEXCLAMATION);
    }
}
catch (...)
{
    MessageBox(nullptr, L"No details available", L"Unknown Exception", MB_OK | MB_ICONEXCLAMATION);
}
return -1;

这是捕获异常的代码部分。然而,消息框需要我一个 LPCWSTR 参数,我尝试转换 e.what() 和 e.GetType() 的返回值,但消息框已损坏。

我尝试将 e.what() 和 e.GetType() 转换为 LPCWSTR,我希望消息框以英语显示,但它似乎已损坏。 我还期望使用更小的代码进行转换。

c++ winapi messagebox
1个回答
0
投票

我知道这个答案并不能真正回答你关于为什么代码不起作用的问题,但我希望它仍然对你有用。

捕获异常的代码不应该显示消息框——它应该做的是记录错误,如果所述错误是不可恢复的,那么它应该终止程序。它应该避免任何进一步复杂的操作,例如显示对话框、分配内存等。

  1. 如果由于程序内存不足而捕获

    std::bad_alloc
    异常,然后尝试分配缓冲区来转换和/或格式化错误消息,该怎么办?

  2. 如果您的代码从您调用的某些 Windows API 中收到错误 87 (ERROR_INVALID_PARAMETER),然后抛出

    std::invalid_argument
    ,该怎么办?当了解哪个参数无效的唯一方法是在 API 调用之前记录所有参数并事后调查日志时,用户将如何处理异常消息?

消息框应该只向用户显示有意义且可操作的错误消息。例如,“您无权访问

C:\Windows\System32\Drivers\etc\hosts
文件。您必须以管理员身份运行该程序”是一条有意义且可操作的消息,但“访问被拒绝”。不是因为它没有告诉用户他们被拒绝访问的内容、原因以及如何解决。

最后,在深入研究异常处理、字符转换和 Windows 等高级概念之前,您应该真正学习如何将通用代码提取到函数中并向其传递参数,而不是像示例中那样将几乎相同的代码复制/粘贴三次API。

© www.soinside.com 2019 - 2024. All rights reserved.