Скорее всего, проблема в том, что где-то вы звоните CWnd::GetSafeHwnd()
и все еще используете этот дескриптор HWND
во время разрушения окна. Другими словами, вы уничтожаете CWnd
, дескриптор которого еще где-то активен.
Одно из решений - переопределить virtual BOOL DestroyWindow()
и убедиться, что вы отпустите ручку там.
Например, если вы показываете модальное диалоговое окно из плагина Acrobat, вы должны передать дескриптор окна в Acrobat, чтобы он знал, что вы находитесь в модальном режиме:
int CMyDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
// Put Acrobat into modal dialog mode
m_AVdlgWin = AVWindowNewFromPlatformThing(AVWLmodal, 0, NULL, gExtensionID, GetSafeHwnd());
AVAppBeginModal(m_AVdlgWin);
AVWindowBecomeKey(m_AVdlgWin);
return 0;
}
Конечно, вам нужно выполнить противоположное в DestroyWindow
, чтобы убедиться, что внутренняя ручка отпущена:
BOOL CMyDialog::DestroyWindow()
{
// Take Acrobat out of modal dialog mode, and release our HWND
AVAppEndModal();
AVWindowDestroy(m_AVdlgWin);
return CDialog::DestroyWindow();
}
В этом примере предполагается, что CMyDialog всегда модальный.
Если вам не удалось освободить дескриптор, полученный с помощью GetSafeHwnd
, тогда вы получите ошибку подтверждения. Что именно означает выпуск ручки, зависит от того, что вы сделали с ней. Можно только догадываться.