FormatMessage 返回一个 char*,每个字符之间包含空值...为什么?

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

翻译错误消息时,我返回一个指向字符串(pMsgBuf)的指针,如下所示

pMsgBuf = "T\0h\0e\0 \0s\t\0r\0a\0...." 

消息存在,但用空值分隔。它必须是我传递给格式化消息的参数,但不知道如何修复它。

{
char* pMsgBuf;
// windows will allocate memory for err string and make our pointer point to it

const DWORD nMsgLen = FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER |
    FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
    nullptr, hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    reinterpret_cast<LPWSTR>(&pMsgBuf), 0, nullptr
);
// 0 string length returned indicates a failure
if (nMsgLen == 0)
{
    return "Unidentified error code";
}
char joe[100]{};
for (int i = 0, y = 0; i < nMsgLen *2; i++)
{
if (pMsgBuf[i] != '\0')
    joe[y++] = pMsgBuf[i];
    
}
// copy error string from windows-allocated buffer to std::string
std::string errorString = pMsgBuf;
// free windows buffer
size_t size = sizeof(pMsgBuf);
LocalFree(pMsgBuf);
return errorString;

}

在手表处于活动状态时测试代码

应该取回我的字符串指针,而不是每个字符都带有空值。

创建了一个测试块来确认这就是我从格式消息中返回的内容。

 char joe[100]{};
    for (int i = 0, y = 0; i < nMsgLen *2; i++)
    {
if (pMsgBuf[i] != '\0')
    joe[y++] = pMsgBuf[i];

     }    

果然乔,字符串输出正确。

c++ winapi
1个回答
0
投票

您正在使用需要 wchar_t* 缓冲区的 unicode 变体。

大多数函数都有一个“W”和一个“A”变体,并且普通名称 #defines 为其中之一,具体取决于编译器选项,因此

FormatMessage
解析为
FormatMessageW

一般来说,在 Windows 中,一定要使用 unicode,所有字符串都应该是 std::wstring 和 wchar_t。

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