【问题标题】:How can I get English error messages when loading XML using MSXML使用 MSXML 加载 XML 时如何获取英文错误消息
【发布时间】:2015-10-01 07:07:11
【问题描述】:

当我使用 MSXML DOM 解析器加载 XML 数据并且出现错误时,IXMLDOMDocument.parseError 包含错误代码和错误消息。错误消息已本地化(即德语 Windows 安装上的德语)。

无论操作系统安装语言如何,都可以获得非本地化的英文消息吗?可能是通过使用某些 COM API 函数手动将错误代码转换为字符串,或者将某些应用程序范围的语言模式设置为英语/美国?

【问题讨论】:

  • 我肯定不会相信包含技术信息的自动翻译错误消息 - 那是要求翻译错误。正如您还说的,它返回 Windows 的本地化语言 - 无论当前有效的语言包是什么。您最好的办法是创建您自己的翻译并将它们与您的应用程序一起分发,并让用户选择使用哪种语言。事实是 - 本地化的 Windows 中不存在您想要的语言的错误消息。如果您有德语 Windows,它应该返回德语消息。
  • 我很想知道你为什么要这样做。
  • 如果您的问题是来自不同客户端的错误报告,以便您可以调试他们的问题,那么这就是错误代码的用途。错误代码永远不会改变,您可以用任何语言解释它们的含义。
  • 是的,我希望能够向客户端询问日志输出并解释错误消息。关于记录错误代码:如何在我的开发计算机上手动查找错误代码消息?有一些API函数吗?我尝试使用FormatMessage,但它不适用于 MSXML 错误代码,仅适用于 GetLastError() 返回的代码。

标签: xml delphi error-handling localization msxml


【解决方案1】:

找到了一些解决方案,可以让我将错误代码翻译成中性(英文)错误消息。显然,这些字符串作为消息表资源存储在msxml6r.dll.mui 文件中,位于C:\Windows\System32 路径下的某个与语言相关的子文件夹中。因此,我将文件从具有英文本地化的计算机复制到我的应用程序文件夹中,并使用以下函数查找给定错误代码的错误消息:

function GetMsXmlErrorStr( const ErrorCode : Integer ) : WideString;
var
   Module : tHandle;
   MsgBuf : pWideChar;
   MsgLen : Integer;
begin
   Module := LoadLibrary('msxml6r.dll.mui');
   if ( Module <> 0 ) then
   begin
      MsgBuf := nil;
      MsgLen := FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_HMODULE,
         Pointer(Module), ErrorCode, 0, @MsgBuf, 0, nil);
      if ( MsgLen > 0 ) then
         SetString(result, MsgBuf, MsgLen);
      LocalFree(HLocal(MsgBuf));
      FreeLibrary(Module);
   end;
end;

【讨论】:

  • 哇!非常感谢。
猜你喜欢
  • 2012-09-20
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多