翻译错误消息时,我返回一个指向字符串(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];
}
果然乔,字符串输出正确。
您正在使用需要 wchar_t* 缓冲区的 unicode 变体。
大多数函数都有一个“W”和一个“A”变体,并且普通名称 #defines 为其中之一,具体取决于编译器选项,因此
FormatMessage
解析为 FormatMessageW
。
一般来说,在 Windows 中,一定要使用 unicode,所有字符串都应该是 std::wstring 和 wchar_t。