0

我有一个基于 MFC 的带有 GUI 的 Windows 应用程序,它是用 C++ 编写的,并且有很多 COM 对象;我们称之为“HelloWorld”。

一位用户向我发送了错误报告:有时,为了响应特定的用户操作,会显示一个 MessageBox(在下图中,我删除了标题栏标题)。

在此处输入图像描述

1) MessageBox 的标题栏标题是HelloWorld,并且在代码中查找该字符串,在我看来,它是由AFX_IDS_APP_TITLE(在.rc应用程序的源文件中)标识的资源字符串;以下是.rc源文件的相关部分:

STRINGTABLE
BEGIN
   AFX_IDS_APP_TITLE       "HelloWorld"
   AFX_IDS_IDLEMESSAGE     "..."
   AFX_IDS_HELPMODEMESSAGE "..."
END

2) 在具有英语语言的 Windows 7 上,MessageBox 的消息是“未找到成员”。

3) 在具有不同语言的 Windows 7 中,消息被翻译成正确的语言。

我认为问题描述在这里 HOWTO: Troubleshoot "Member Not Found" 0x80020003 Error并且与 DISP_E_MEMBERNOTFOUND错误有关;我实际上在用户站点解决了这个问题。

但是还有一个问题没有解决,那就是用户体验问题:给我发bug报告的用户不是程序员,不知道“成员”在表达中的含义,例如“成员函数”和因此,由于“成员”一词的多种含义(至少在英语和意大利语中),该消息使用户感到有些冒犯。

我检查了应用程序的源代码,在我看来 MessageBox 不是由应用程序生成的;现在我想知道 MessageBox 是如何生成的,以便拦截它并显示不同的 MessageBox:有可能吗?

4

1 回答 1

0

我不知道具体的错误,但要抑制消息框,这是 windows 调用。

BOOL SetThreadErrorMode(
  _In_   DWORD dwNewMode,
 _Out_  LPDWORD lpOldMode
);

在 Windows 7 之前,使用 SetErrorMode。

于 2014-01-21T18:14:13.830 回答