Почему я вижу сбой при попытке вызвать CDHtmlDialog :: OnInitDialog () - PullRequest
2 голосов
/ 16 апреля 2010

Я добавил пункт меню helpAbout в свое приложение MFC. Я решил сделать ddlg производным от CDHTMLDialog.

Я переопределяю метод OnInitDialog () в своем производном классе, и первым делом я вызываю родительский метод OnInitDialog ().

Затем я вставляю код, который устанавливает заголовок.

На некоторых машинах это работает нормально, но на других происходит сбой при вызове

CDHtmlDialog :: OnInitDialog () - Попытка прочитать нулевой указатель.

стек вызовов не имеет ничего полезного - он находится в mfc90.dll

Это потенциальная проблема с несовпадением dll mfc / win32?

Он работает на моих 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 ]

1 голос
/ 29 апреля 2010

Попробуйте заключить в кавычки все значения атрибута ID в HTML и дважды проверьте, что атрибуты ID соответствуют ссылкам в DHTML_EVENT_MAP.

Я предполагаю, что между версиями IE существует разное поведение в отношении чувствительности к регистру атрибутов ID или обработки отсутствующих элементов HTML. Результатом может быть то, что базовый класс OnInitDialog () не может подключиться к некоторым элементам объектной модели документа на тех компьютерах, на которых установлена ​​определенная версия Internet Explorer.

Учитывая историю IE , вполне возможно, что это поведение попало в одну версию, а затем было удалено.

Это должно быть просто обоснованное предположение: у меня нет доступа ко всем более ранним версиям IE, чтобы подтвердить это поведение ...

0 голосов
/ 11 августа 2011

У меня была похожая проблема, которую я решил, добавив :: 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();

...
0 голосов
/ 27 апреля 2010

Это может быть вызвано попыткой ссылки на несуществующий 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"

Ваш метод HTMLDialogs OnDocumentComplete вызывается до OnInitDialog? Это случилось со мной, когда я немного обдумал это, и из-за некоторой плохой проверки ошибок с моей стороны в другом месте это вызвало сбой программы.

Не могли бы вы опубликовать трассировку стека, если это не помогло, или, возможно, файл cpp, h, html и .rc.

0 голосов
/ 23 апреля 2010

Я думаю, вам нужно вызвать SetHostFlags перед вызовом базового класса OnInitDialog 'CDHtmlDialog :: OnInitDialog ()'.

например. SetHostFlags (DOCHOSTUIFLAG_FLAT_SCROLLBAR); // Установить флаги пользовательского интерфейса в соответствии с вашими потребностями.

Общая информация: CDHtmlDialog объявлен в 'afxdhtml.h'. (Я уверен, что вы знали бы это)

Поскольку DHtmlDialog внутренне работает с COM, попробуйте иметь

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

CoUninitialize();//at the exit of app.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...