gpt4 book ai didi

c++ - 我应该如何在 C++ 中正确使用 FormatMessage()?

转载 作者:IT老高 更新时间:2023-10-28 12:00:35 30 4
gpt4 key购买 nike

没有:

  • MFC
  • ATL

如何使用 FormatMessage()获取 HRESULT 的错误文本?

 HRESULT hresult = application.CreateInstance("Excel.Application");

if (FAILED(hresult))
{
// what should i put here to obtain a human-readable
// description of the error?
exit (hresult);
}

最佳答案

这是从系统返回错误消息以获取 HRESULT 的正确方法(在这种情况下命名为 hresult,或者您可以将其替换为 GetLastError()) :

LPTSTR errorText = NULL;

FormatMessage(
// use system message tables to retrieve error text
FORMAT_MESSAGE_FROM_SYSTEM
// allocate buffer on local heap for error text
|FORMAT_MESSAGE_ALLOCATE_BUFFER
// Important! will fail otherwise, since we're not
// (and CANNOT) pass insertion parameters
|FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, // unused with FORMAT_MESSAGE_FROM_SYSTEM
hresult,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&errorText, // output
0, // minimum size for output buffer
NULL); // arguments - see note

if ( NULL != errorText )
{
// ... do something with the string `errorText` - log it, display it to the user, etc.

// release memory allocated by FormatMessage()
LocalFree(errorText);
errorText = NULL;
}

这与 David Hanak 的答案之间的主要区别在于 FORMAT_MESSAGE_IGNORE_INSERTS 标志的使用。 MSDN 对如何使用插入有点不清楚,但是 Raymond Chen notes that you should never use them在检索系统消息时,因为您无法知道系统需要哪些插入。

FWIW,如果您使用 Visual C++,您可以使用 _com_error 让您的生活更轻松一些。类:

{
_com_error error(hresult);
LPCTSTR errorText = error.ErrorMessage();

// do something with the error...

//automatic cleanup when error goes out of scope
}

据我所知,它不是 MFC 或 ATL 的一部分。

关于c++ - 我应该如何在 C++ 中正确使用 FormatMessage()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/455434/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com