我在我的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>
答案 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();
...