我正在研究从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;
}
答案 0 :(得分:-1)
因此,我无法确定是什么导致了MFC断言。解决方案是完全删除MFC窗口,并将其替换为类下面的Win32窗口,即CreateWindowExW
,GetClassinfoExW
和RegisterClassExW
。