windows - MFC CWnd::Create 触发器断言 wincore.cpp
问题描述
我正在研究一个 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;
}
解决方案
所以,我无法弄清楚是什么导致了 MFC 断言。解决方案是完全删除 MFC 窗口,并将其替换为类下方的 Win32 窗口,即CreateWindowExW
、GetClassinfoExW
和RegisterClassExW
。
推荐阅读
- python - 您如何在 Python 乌龟的每次迭代中增加 pensize?
- c# - 如何继续接受异步套接字上的数据?
- ruby-on-rails - Rails 中的强参数 - 忽略 Require 子句
- xslt - xsl 并用一个词进行标记
- php - PHP Ajax 实时搜索不会加载
- python - 添加矩阵python
- angular - 为什么我所有的图像都在 dist 文件夹而不是“asset”文件夹下
- r - head() 函数将所有结果附加到末尾
- android - 从 RxJava 中的 2 个 observable 项目列表创建一个过滤后的 observable
- c# - 使用 DataSet 过滤两个不同的事物