сбой в ShowWindow () - PullRequest
       2

сбой в ShowWindow ()

0 голосов
/ 07 февраля 2012

Я разрабатываю плагин Notepad ++.

У меня есть простое диалоговое окно, которое создается с помощью CreateDialogParam().Первоначально он скрыт.

После нажатия кнопки меню я вызываю ShowWindow() с SW_SHOW на его дескрипторе, что приводит к следующему исключению:

c000041d

После отладки я обнаружил, что эти два сообщения отправляются в мой диалог как раз перед сбоем WM_SHOWWINDOW
WM_WINDOWPOSCHANGING

Оба они не обрабатываются.Вот мой код dlgproc.Любая идея, почему это произойдет?

BOOL CALLBACK StaticDialog::dlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{
    switch (message) 
    {
        case WM_INITDIALOG :
        {
            // Get the additional init data
            StaticDialog *pStaticDlg = (StaticDialog *)(lParam);

            // Store the handle in the object
            pStaticDlg->_hSelf = hwnd;


            ::SetWindowLongPtr(hwnd, GWL_USERDATA, (long)lParam);

            // Store the co-ordinates in the object
            ::GetWindowRect(hwnd, &(pStaticDlg->_rc));

            // Forward the message for further processing
            pStaticDlg->run_dlgProc(message, wParam, lParam);

            // TRUE if it processed the message
            return TRUE;
        }

        default :
        {
            // Retrieve the user data
            StaticDialog *pStaticDlg = (StaticDialog *)(::GetWindowLongPtr(hwnd, GWL_USERDATA));
            if (!pStaticDlg)
                return FALSE;

            // Send the message for further processing
            return pStaticDlg->run_dlgProc(message, wParam, lParam);

            // return FALSE if it processed the message
        }
    }
}



BOOL CALLBACK MarkDownViewDialog::run_dlgProc( UINT Message, WPARAM wParam, LPARAM lParam)
{
    switch (Message) 
    {
        case WM_INITDIALOG:
        {
            EmbedBrowserObject(this->_hSelf);
            DisplayHTMLPage(this->_hSelf,L"http://www.microsoft.com");
            DisplayHTMLStr(this->_hSelf, L"<H2><CENTER>HTML string test</CENTER></H2><P><FONT COLOR=RED>This is a <U>HTML string</U> in memory.</FONT>");

            break;
        }



        default:
            break;
    }

    return FALSE;
}

Диалоговое окно создается через механизм плагинов Notpead ++.Я помещаю исходный код из его файла StaticDialog.cpp.Элемент управления проходит через блок else в приведенном ниже коде.

void StaticDialog::create(int dialogID, bool isRTL, bool isModeles)
{
    if (isRTL)
    {
        DLGTEMPLATE *pMyDlgTemplate = NULL;
        HGLOBAL hMyDlgTemplate = makeRTLResource(dialogID, &pMyDlgTemplate);
        _hSelf = ::CreateDialogIndirectParam(_hInst, pMyDlgTemplate, _hParent, (DLGPROC)dlgProc, (LPARAM)this);
        ::GlobalFree(hMyDlgTemplate);
    }
    else
        _hSelf = ::CreateDialogParam(_hInst, MAKEINTRESOURCE(dialogID), _hParent, (DLGPROC)dlgProc, (LPARAM)this);
    //int i=GetLastError();

    if (!_hSelf)
    {
        //systemMessage(_T("StaticDialog"));
        return;
    }

    if (isModeles) {
        _isModeles = isModeles;
        ::SendMessage(_hParent, NPPM_MODELESSDIALOG, MODELESSDIALOGADD, (WPARAM)_hSelf);
    }
}

Весь исходный код моего решения находится здесь: https://github.com/madhur/Npp-Markdown-Viewer

Решение проблемы

Вот чтоЯ сделал для устранения проблемы:

  • Создан проект Win32, в котором я создаю диалоговое окно и помещаю точно такой же исходный код, чтобы встроить элемент управления браузером в WM_INITDIALOG, и это работает.Этот проект Win32 связан с той же статической библиотекой, с которой связан исходный код.Это источник почтового файла с примером проекта:
    https://github.com/madhur/Npp-Markdown-Viewer/blob/master/dll/example/example.c

  • Статическая библиотека, на которую я ссылался выше, является ничем иным, кроме как содержит функции для встраивания управления браузером в HWND и для визуализацииURL или строка.Я взял источник отсюда: http://www.codeguru.com/Cpp/I-N/ieprogram/article.php/c4379 Это источник основного файла статической библиотеки:
    https://github.com/madhur/Npp-Markdown-Viewer/blob/master/dll/dll.c

  • Если я прокомментирую эту единственную строку, плагин работает,в основном он загружает диалоговое окно без элемента управления Browser:

    EmbedBrowserObject (this -> _ hSelf);

  • Фактическое исключение в Visual Studio возникает в этой строке:

return pStaticDlg-> run_dlgProc (message, wParam, lParam);

...