MFC CWnd :: Create触发断言wincore.cpp

时间:2019-05-01 06:20:02

标签: windows mfc

我正在研究从CWnd派生并在其构造函数中创建隐藏窗口的MFC类。该对象本身是在派生的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 :(得分:-1)

因此,我无法确定是什么导致了MFC断言。解决方案是完全删除MFC窗口,并将其替换为类下面的Win32窗口,即CreateWindowExWGetClassinfoExWRegisterClassExW