如何使用 FormatMessage c++ 获取仅英文消息

Posted

技术标签:

【中文标题】如何使用 FormatMessage c++ 获取仅英文消息【英文标题】:How to use FormatMessage c++ for getting english only messages 【发布时间】:2012-10-03 19:40:18 【问题描述】:

我正在尝试使用格式消息来获取仅英文值

MSDN 指定如下

DWORD WINAPI FormatMessage(
  _In_      DWORD dwFlags,
  _In_opt_  LPCVOID lpSource,
  _In_      DWORD dwMessageId,
  _In_      DWORD dwLanguageId,
  _Out_     LPTSTR lpBuffer,
  _In_      DWORD nSize,
  _In_opt_  va_list *Arguments
);

对于dwLanguageId参数,

请求消息的语言标识符。如果 dwFlags 包含 FORMAT_MESSAGE_FROM_STRING,则忽略此参数。

如果您在此参数中传递特定的 LANGID,FormatMessage 将仅返回该 LANGID 的消息。如果函数找不到该 LANGID 的消息,它将 Last-Error 设置为 ERROR_RESOURCE_LANG_NOT_FOUND。如果您传入零,则 FormatMessage 按以下顺序查找 LANGID 消息:

    语言中立 线程 LANGID,基于线程的语言环境值 用户默认 LANGID,基于用户的默认区域设置值 系统默认 LANGID,基于系统默认区域设置值 美国英语

如果 FormatMessage 没有找到任何上述 LANGID 的消息,它会返回任何存在的语言消息字符串。如果失败,则返回 ERROR_RESOURCE_LANG_NOT_FOUND。

这是否意味着,如果值为 5,它将返回英文消息?

你能澄清一下吗?

【问题讨论】:

这是我真希望我能专门为编辑投赞成票的地方。干得好@RobKennedy! 出于兴趣,你为什么只想要英语?如果消息可用,用户肯定应该能够用他们自己的语言阅读吗? 确实如此,但应用程序以英文显示所有消息,但系统消息以本地显示...使其保持一致 @NidaSahar 在非英语系统上,对于许多错误代码,英语错误消息不可用,而对于相同的错误代码,母语消息可用 @NidaSahar 我最近尝试在俄语 Windows XP 上调用 FormatMessage,并将 dwLanguageId 设置为默认语言。错误代码为 0x1F。 FormatMessage 用俄语返回了一条错误消息。然后我尝试使用具有相同错误代码的MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)。它什么也没给我。我不认为非英语系统在两种语言中都有错误消息。好吧,也许他们有,但是错误代码数量非常有限 【参考方案1】:

文档中的数字 5 表示美国英语是第五种语言FormatMessage 将在您将零作为参数值传递时尝试使用,在它尝试并失败前四个选项之后。这与为该函数参数传递值 5 无关。

要请求英文消息,请传入美国英语的 LANGID 值,您可以通过 MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) 获取该值。 FormatMessage 文档链接到 documentation on language identifiers,而 documentation on language identifiers 又链接到 language identifier constants and strings 的页面。

【讨论】:

(迟到的评论,我知道..)你知道在本地化系统上是否保证提供英语错误消息? 不知道,@Peter。在 Stack Overflow 上提问。

以上是关于如何使用 FormatMessage c++ 获取仅英文消息的主要内容,如果未能解决你的问题,请参考以下文章

如何在 intl.formatMessage 中使用占位符

如何使用 React-Intl 插入带有 injectIntl​​ formatMessage 的 HTML 标记?

为啥 WinAPI FormatMessage 失败,总是返回 false

Windows API一日一练 81 FormatMessage函数

FormatMessage函数的使用方法

是否可以覆盖一个特定 intl.formatMessage 的语言环境?