我在我的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来确认此行为...

10-08 02:08