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

2023-12-14

Without:

  • 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;
}

这与大卫哈纳克的答案之间的主要区别是使用FORMAT_MESSAGE_IGNORE_INSERTS旗帜。 MSDN 对于如何使用插入有点不清楚,但是Raymond Chen 指出你永远不应该使用它们当检索系统消息时,因为您无法知道系统期望哪些插入。

FWIW,如果您使用 Visual C++,您可以通过使用_com_error class:

{
   _com_error error(hresult);
   LPCTSTR errorText = error.ErrorMessage();
   
   // do something with the error...

   //automatic cleanup when error goes out of scope
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该如何在 C++ 中正确使用 FormatMessage()? 的相关文章

随机推荐

  • PHP 下载脚本在 Mac 上创建不可读的 ZIP 文件

    作为参考 我已经阅读并尝试了这些和其他几个线程中的答案 使用 php 创建和提供压缩文件 打开下载的 zip 文件会创建 cpgz 文件吗 我的服务器上有一个 zip 文件 当我使用 Filezilla 将该 Zip 文件从我的服务器移动到
  • 是否可以在类级别为不同的数据类型配置 Jackson 自定义反序列化器?

    我需要反序列化一个又长又复杂的json 我为此编写了一组java类来映射数据 并且我必须为许多不同类型的字段编写自定义反序列化器 包括String Boolean BigDecimal等 我知道我可以使用相应的自定义反序列化器注释 java
  • 如何在 C# WPF 应用程序中切换图像?

    我正在尝试制作一个应用程序 可以在硬币的正面标志和硬币的反面图像之间切换 但是 每次我按下 正面 按钮或 反面 按钮时 都会发生错误 如何修复我的代码以便图像成功切换 XAML
  • spring-mvc:如何以“a/b/{c}”的形式映射URI模板?

    我可以获得 a b 或 a b 形式的 URI 模板来工作 但是 当我尝试 a b c 时 我收到 HTTP 404 和日志中的一条消息 其形式为 未找到带有 URI myapp a b c 的 HTTP 请求的映射 但是我在日志中也看到了
  • 获取双 SIM 卡 Android 手机的运营商详细信息

    我正在开发一个应用程序 我需要用户 SIM 卡的详细信息 他的电话号码 IMEI 号码和运营商 到目前为止我已经获得了他的 IMEI 号码这个答案 他的设备是单卡还是双卡 我如何获取他的 SIM 卡号码以及这两个连接的运营商名称 试试这个
  • 如何查找 Java 字符串是否包含 X 或 Y 并包含 Z

    我很确定正则表达式是可行的方法 但每当我尝试计算出特定的正则表达式时 我就会头疼 如果 Java 字符串 包含文本 ERROR 或文本 WARNING AND 包含文本 parsing 其中所有匹配项都不区分大小写 我需要查找什么正则表达式
  • 如何使用 phpseclib 设置自定义 SFTP 端口

    我必须使用 PHP 连接到 SFTP 服务器 我正在使用 phpseclib 来实现这一点 我在 Internet 上找到了一些示例 但无法连接到 SFTP 我使用自定义端口 2222 连接到 SFTP 请告诉我在哪里可以定义自定义端口来连
  • 尝试在 Autodesk Forge / Bim360 中显示房间信息

    Okay so I m trying to show room information and geometry from a Revit project on Forge I ve made the call to https devel
  • 在 R 编程神经网络中为 nnet 指定“初始权重”

    在 R 编程中 我试图了解如何使用 nnet 让用户指定初始权重而不是默认值来运行神经网络算法 R 文档提到了以下参数 有如何使用权重的例子吗 nnet formula data weights subset na action contr
  • ag-Grid React 在设置 gridApi 后忘记了它

    我已经修改了用按键选择使用 React 的示例 然而 一旦我按下箭头键 应用程序就会崩溃 代码如下 const gridApi setGridApi useState
  • 在 ggplot 中绘制置信区间

    我想使用 ggplot 绘制以下图 这是我的 df 结构的示例 有点 不按数据比例绘制 example df data frame mean c 0 3 0 8 0 4 0 65 0 28 0 91 0 35 0 61 0 32 0 94
  • 陷阱删除键

    我的问题相当简单 我需要将逻辑应用于 Excel 中的删除按钮 在我问的一个相关问题是清除数据透视表中的单元格的方法 现在意识到这可能不是正确的方法 这是我正在考虑的另一种选择 不幸的是 我承认我对 Visual Basic 的经验很少 而
  • 如何使用 html 类根据时间记录显示打开/关闭

    我正在尝试使用 Javascript 根据公司在该特定日期的时间显示 打开 或 关闭 我在 WordPress 上使用主题 Listify 客户可以在其中列出他们的业务 他们可以选择输入一周中每一天的工作时间 我希望能够使用存储在跨度内的数
  • 逆变解释

    首先 我在 SO 和博客上阅读了许多关于协变和逆变的解释 非常感谢埃里克 利珀特制作了如此精彩的系列协变和逆变 不过 我有一个更具体的问题 我正在努力解决这个问题 据我了解埃里克的解释协变和逆变都是描述变换的形容词 协变变换是保留类型顺序的
  • 没有列表的项目符号列表

    我有以下 html 代码 div class magicbullets Nice awesome cool div 我需要它表现得像 div class magicbullets ul li nice li li aweseome li l
  • SQLite 查询限制

    我正在构建一个小界面 我希望用户能够在其中写出他们的信息entiresql语句 然后查看返回的数据 但是 我不希望用户能够做任何有趣的事情 即delete from user table 实际上 我希望用户能够做的唯一一件事就是运行sele
  • 如何在不访问数据库的情况下创建带有延迟字段的 django 模型实例?

    假设我知道数据库中存在 django 模型的一行的一些字段 但没有将它们封装在模型实例中 有没有什么简单的方法可以让我将它们包装在模型实例中 而无需执行额外的数据库查询 并以填充了这些字段但所有其他字段都延迟的实例结束 所以说我有模型 fr
  • C# 代码不会启动程序。 Win32Exception 未处理

    我正在制作一个程序 当单击按钮时启动程序 它似乎适用于 Chrome 或 Word 等程序 但不适用于 fraps 等较小的程序 并给了我错误 System dll 中发生类型为 System ComponentModel Win32Exc
  • Big Endian 和 Little Endian 字节顺序的区别

    Big Endian 和 Little Endian 字节顺序有什么区别 这两个似乎都与 Unicode 和 UTF16 有关 我们到底在哪里使用它 Big Endian BE Little Endian LE 是组织多字节字的两种方法 例
  • 我应该如何在 C++ 中正确使用 FormatMessage()?

    Without MFC ATL 我该如何使用FormatMessage 获取错误文本HRESULT HRESULT hresult application CreateInstance Excel Application if FAILED