为什么我在尝试调用CDHtmlDialog :: OnInitDialog()时看到崩溃

时间:2010-04-16 19:26:12

标签: c++ mfc

我在我的mfc应用程序中添加了一个helpAbout菜单项。我决定让ddlg派生自CDHTMLDialog。

我在派生类中重写了OnInitDialog()方法,我做的第一件事是调用父的OnInitDialog()方法。

然后我输入了设置标题的代码。

在某些机器上,这样可以正常工作,但在其他机器上,它会在调用

时崩溃

CDHtmlDialog :: OnInitDialog() - 尝试读取空指针。

调用堆栈没有任何用处 - 它位于mfc90.dll

这是mfc / win32 dlls不匹配的潜在问题吗?

它适用于我的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>

4 个答案:

答案 0 :(得分:1)

尝试引用HTML中的所有ID属性值,并仔细检查ID属性是否与DHTML_EVENT_MAP中的引用匹配。

我猜测IE版本之间在ID属性的区分大小写或处理丢失的HTML元素方面存在不同的行为。最终结果可能是基础OnInitDialog()类无法连接到安装了特定版本Internet Explorer的那些计算机上的文档对象模型中的某些元素。

鉴于history of IE,这种行为很可能会悄悄进入一个版本,然后被删除。

这只是一个有根据的猜测:我无法访问所有早期版本的IE以确认此行为......

答案 1 :(得分:0)

我认为你需要在调用基类OnInitDialog'CDHtmlDialog :: OnInitDialog()'之前调用SetHostFlags。

例如。 SetHostFlags(DOCHOSTUIFLAG_FLAT_SCROLLBAR); //根据需要设置主机UI标志。

一般信息:CDHtmlDialog在'afxdhtml.h'中声明。 (我相信你会知道的)

由于DHtmlDialog内部处理COM,请尝试

CoInitialize();//at the begining of application launch

CoUninitialize();//at the exit of app.

答案 2 :(得分:0)

这可能是由于尝试引用不存在的html文件引起的。确保传递给基类构造函数的IDH枚举有效,并实际引用现有的HTML页面。

HTMLAboutDlg::HTMLAboutDlg(Cwnd *pParent) 
    : CDHTMLDialog(HTMLAboutDlg::IDD, HTMLAboutDlg::IDH, pParent)

因此,检查您的IDR_HTML_HTMLABOUTDLG值是否实际分配了正确的HTML页面。

如果您使用向导创建了对话框,我认为它为您生成了一个名为“MyProjectName.htm”的页面,通常会为此分配IDR_HTML_HTMLABOUTDLG值。

您的资源.rc文件应该有点像:

IDR_HTML_MYPROJECT_DIALOG HTML                    "MyProjectName.htm"

在OnInitDialog之前调用HTMLDialogs OnDocumentComplete方法吗?这件事发生在我身上,当我稍微唠叨这一点时,由于我在其他地方检查了一些错误,导致程序崩溃。

如果没有帮助,可以发布堆栈跟踪,或者可能是cpp,h,html和.rc文件。

答案 3 :(得分:0)

我有类似的问题,我通过添加:: AfxOleInit()解决了这个问题。靠近CMyApp :: InitInstance()函数的顶部。如果在创建窗口之前未调用此窗口,则会使整个应用程序崩溃。以下是我的InitInstance函数的开头现在的样子:

BOOL CMyApp::InitInstance()
{
    // InitCommonControls() is required on Windows XP if an application
    // manifest specifies use of ComCtl32.dll version 6 or later to enable
    // visual styles.  Otherwise, any window creation will fail.
    InitCommonControls();
    CWinApp::InitInstance();

    ::AfxOleInit();

...