首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC 單文檔程序調試報錯 winocc.cpp _ASSERT(m_pCtrlSite != NULL):ActiveX 控件未 Create 直接調用方法

     編輯:程式設計綜合問答

錯誤位置:winocc.cpp 中 CWnd::GetProperty/SetProperty 斷言 m_pCtrlSite != NULL 失敗。

根因

代碼中直接使用 CMapX 控件變量 m_ctrlMapX 調用 GetLayers(),但該 ActiveX 控件**未經 Create/SubclassWindow 附著到真實窗口**,m_hWnd = 0,導致 m_pCtrlSite 為空。

代碼問題片段

float* try::fun1() {
    GET dlg; dlg.DoModal(); // 模態對話框
    CMapX *m_ctrlMapX; // 未初始化,無 hWnd
    CMapXLayers allLr = m_ctrlMapX.GetLayers(); // 崩潰
    ...
}

修正方案

  1. 在對話框資源中放置控件,類向導映射 CMapX m_ctrlMapX 到 IDC_MAPX。
  2. DoModal 返回後,控件已自動 Create,可直接調用方法。
  3. 若動態創建:
    m_ctrlMapX.Create(NULL, WS_VISIBLE|WS_CHILD, rect, this, IDC_MAPX);

關鍵區別

  • CDialog::DoModal():模態對話框,內部控件自動創建/銷毀。
  • CWnd::Create():創建子窗口/控件,需手動調用 ShowWindow(SW_SHOW)。

將 ActiveX 控件操作移至對話框類內部,或確保控件已成功 Create 後再調用方法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved