我在我的mfc应用中添加了helpAbout菜单项。我决定使ddlg源自CDHTMLDialog。
我在派生类中重写OnInitDialog()方法,我要做的第一件事是调用父级的OnInitDialog()方法。
然后,我输入设置标题的代码。
在某些计算机上,此方法工作正常,但在其他计算机上,在
CDHtmlDialog::OnInitDialog()-试图读取一个空指针。
调用堆栈没有任何用处-它在mfc90.dll中
这是mfc / win32 dll不匹配的潜在问题吗?
它可以在我的Vista机器上运行,但在win2003服务器盒上崩溃。
BOOL HTMLAboutDlg::OnInitDialog()
{
// CRASHES on the following line
CDHtmlDialog::OnInitDialog();
CString title = "my title"; // example of setting title
... other code
SetWindowText(title);
return TRUE; // return TRUE unless you set the focus to a control
}
这是相关的头文件:
class HTMLAboutDlg : public CDHtmlDialog
{
DECLARE_DYNCREATE(HTMLAboutDlg)
public:
HTMLAboutDlg(CWnd* pParent = NULL); // standard constructor
virtual ~HTMLAboutDlg();
// Overrides
HRESULT OnButtonOK(IHTMLElement *pElement);
HRESULT OnButtonCancel(IHTMLElement *pElement);
// Dialog Data
enum { IDD = IDD_DIALOG_ABOUT, IDH = IDR_HTML_HTMLABOUTDLG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
DECLARE_DHTML_EVENT_MAP()
};
我不知道发生了什么,特别是为什么它可以在某些计算机上运行而在其他计算机上崩溃。
两者都安装了VS2008
Visual Studio为每台计算机报告以下内容:
VISTA-无崩溃
9.0.30729.1 SP
2003服务器:(崩溃)
9.0.21022.8 RTM
编辑-HTML代码
<HTML>
<BODY ID=HTMLAboutDlg BGCOLOR=WHITE>
<TABLE WIDTH=100%>
<TR WIDTH=100% HEIGHT=75>
<TD ALIGN=CENTER VALIGN=TOP>
<font color="#707880">by </font><a ID=LinkCP target=_blank href='http://www.mywebsite.com'><font color="#000000">my</font><font color="#2554C7">web</font><font color="#7093DB">site</font></a>
</TD>
</TR>
<TR>
<TD ALIGN=RIGHT ALIGN=BOTTOM>
<BUTTON STYLE="WIDTH:80" ID="ButtonOK">OK</BUTTON><BR>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>
最佳答案
尝试引用HTML中所有ID属性值,然后再次检查ID属性是否与DHTML_EVENT_MAP中的引用匹配。
我猜测IE版本之间在ID属性的区分大小写或缺少HTML元素的处理方面存在不同的行为。最终结果可能是,基本OnInitDialog()类无法在安装了特定版本Internet Explorer的那些机器上挂钩到文档对象模型中的某些元素。
给定history of IE,很可能将此行为爬到一个版本中,然后被删除。
这只能是一个有根据的猜测:我无权访问所有早期版本的IE来确认此行为...