MFC CWnd :: Создать утверждение триггеров wincore.cpp - PullRequest
0 голосов
/ 01 мая 2019

Я работаю над классом MFC, который наследуется от CWnd и создает скрытое окно в своем конструкторе.Сам объект создается внутри производной функции CWinApp :: InitInstance.

if (
    this->CWnd::Create(
        nullptr,
        nullptr,
        WS_DISABLED, // Even disabled it will receive broadcast messages.
        {0, 0, 0, 0},
        CWnd::GetDesktopWindow(),
        fakeWindowId
    ) == FALSE
)
      throw runtime_error{"failed to create window"};

Когда я запускаю этот код в отладочной сборке, он вызывает следующее утверждение:

Ошибка отладочного подтверждения!

Программа: C: \ WINDOWS \ SYSTEM32 \ mfc140ud.dll Файл: f: \ dd \ vctools \ vc7libs \ ship \ atlmfc \ src \ mfc \ wincore.cpp Строка: 571

Информацию о том, как ваша программа может вызвать ошибку подтверждения, см. В документации по утверждениям для Visual C ++.

(Нажмите «Повторить» для отладки приложения)

Если я игнорирую утверждение,код работает нормально и никакого вредного воздействия не наблюдается.Как мне обратиться к этому утверждению?

Я также регистрирую окно следующим образом:

BOOL HiddenWindow::PreCreateWindow(CREATESTRUCTW& cs)
{
    if ( ! CWnd::PreCreateWindow(cs))
        return FALSE;
    cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
    WNDCLASSEXW wc;
    ZeroMemory(&wc, sizeof(WNDCLASSEXW));
    wc.cbSize = sizeof(WNDCLASSEXW);
    const auto instance{AfxGetInstanceHandle()};

    if (GetClassInfoExW(instance, this->className_.c_str(), &wc) == FALSE)
    {
        wc.lpszClassName = this->className_.c_str();

        if ( ! RegisterClassExW(&wc))
        {
            Logger::Fatal(
                "Registering the window for copy data message failed! Messages will not be "
                    "copied, error code {}.",
                GetLastError()
            );
            return FALSE;
        }
    }
    else
        Logger::Debug(
            "There is already a window registered under the class name '{}'.",
            toString(this->className_)
        );
    cs.lpszClass = _wcsdup(this->className_.c_str());
    return TRUE;
}

1 Ответ

0 голосов
/ 06 мая 2019

Итак, я так и не смог выяснить, что послужило причиной утверждения MFC.Решением было полностью удалить окно MFC и заменить его окном Win32 под классом, то есть CreateWindowExW, GetClassinfoExW и RegisterClassExW.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...