2 Stimmen

Warum erlebe ich einen Absturz, wenn ich versuche, CDHtmlDialog::OnInitDialog() aufzurufen?

Ich habe einen helpAbout-Menüpunkt zu meiner mfc-Anwendung hinzugefügt. Ich habe beschlossen, die ddlg von CDHTMLDialog abzuleiten.

Ich überschreibe die Methode OnInitDialog() in meiner abgeleiteten Klasse und rufe als erstes die Methode OnInitDialog() der übergeordneten Klasse auf.

Dann füge ich einen Code ein, der den Titel festlegt.

Auf einigen Rechnern funktioniert das problemlos, auf anderen stürzt es beim Aufruf von

CDHtmlDialog::OnInitDialog() - Versucht, einen Null-Zeiger zu lesen.

der Aufrufstapel enthält nichts Nützliches - er befindet sich in mfc90.dll

Ist dies ein potenzielles Problem mit nicht übereinstimmenden mfc/win32-DLLs?

Es funktioniert auf meinen Vista-Rechnern, stürzt aber auf einem Win2003-Server ab.

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
}

Und hier ist die entsprechende Header-Datei:

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()
};

Ich kann nicht herausfinden, was los ist - insbesondere, warum es auf einigen Rechnern funktioniert und auf anderen abstürzt.

Beide haben VS2008 installiert

Visual Studio meldet für jeden Rechner Folgendes:

VISTA - keine Abstürze 9.0.30729.1 SP

2003 Server: (Abstürze) 9.0.21022.8 RTM

EDIT - html code

<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>

1voto

MZB Punkte 1965

Versuchen Sie, alle Werte der ID-Attribute im HTML zu zitieren, und überprüfen Sie, ob die ID-Attribute mit den Referenzen in der DHTML_EVENT_MAP übereinstimmen.

Ich vermute, dass es ein unterschiedliches Verhalten zwischen den IE-Versionen in Bezug auf die Groß- und Kleinschreibung von ID-Attributen oder die Behandlung von fehlenden HTML-Elementen gibt. Der Nettoeffekt könnte sein, dass die OnInitDialog()-Basisklasse auf Rechnern mit einer bestimmten Version des Internet Explorers keine Verbindung zu einigen der Elemente im Dokumentobjektmodell herstellen kann.

Dada la Geschichte des IE Es ist durchaus möglich, dass sich dieses Verhalten in eine Version eingeschlichen hat und später entfernt wurde.

Dies ist nur eine Vermutung: Ich habe keinen Zugang zu allen früheren Versionen des IE, um dieses Verhalten zu bestätigen...

0voto

Akaanthan Ccoder Punkte 2011

Ich denke, Sie müssen SetHostFlags vor dem Aufruf der Basisklasse OnInitDialog 'CDHtmlDialog::OnInitDialog()' aufrufen.

z.B.. SetHostFlags(DOCHOSTUIFLAG_FLAT_SCROLLBAR); //Setzen Sie die Host-UI-Flags nach Ihrem Bedarf.

Allgemeine Informationen: CDHtmlDialog ist in 'afxdhtml.h' deklariert. (Ich bin sicher, dass Sie das wissen)

Da DHtmlDialog intern mit COM arbeitet, versuchen Sie, die

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

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

0voto

Andrew Punkte 1538

Die Ursache könnte der Versuch sein, auf eine nicht existierende HTML-Datei zu verweisen. Vergewissern Sie sich, dass das IDH-Enum, das Sie an den Konstruktor der Basisklasse übergeben, gültig ist und tatsächlich auf eine vorhandene HTML-Seite verweist.

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

Prüfen Sie also, ob Ihrem Wert IDR_HTML_HTMLABOUTDLG tatsächlich eine korrekte HTML-Seite zugewiesen ist.

Wenn Sie Ihr Dialogfeld mit dem Assistenten erstellt haben, wurde eine Seite mit dem Namen "MeinProjektname.htm" erzeugt, der normalerweise der Wert IDR_HTML_HTMLABOUTDLG zugewiesen wird.

Ihre Ressourcendatei .rc sollte wahrscheinlich ein ähnliches Format haben wie diese:

IDR_HTML_MYPROJECT_DIALOG HTML                    "MyProjectName.htm"

Wird Ihre HTMLDialogs OnDocumentComplete-Methode vor OnInitDialog aufgerufen? Das ist mir passiert, als ich ein wenig damit herumgespielt habe, und aufgrund einer schlechten Fehlerprüfung meinerseits an anderer Stelle ist das Programm abgestürzt.

Könnten Sie einen Stack-Trace posten, wenn das nicht hilft, oder möglicherweise die cpp-, h-, html- und .rc-Datei.

0voto

Adam Pierce Punkte 32051

Ich hatte ein ähnliches Problem, das ich durch Hinzufügen von ::AfxOleInit(); am Anfang der CMyApp::InitInstance() Funktion gelöst habe. Wenn diese Funktion nicht aufgerufen wird, bevor das Fenster erstellt wird, stürzt die gesamte Anwendung ab. So sieht der Anfang meiner InitInstance-Funktion jetzt aus:

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();

...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X