Sfoglia il codice sorgente

【软件版本】
V
【模块名称】

【问题原因】
不要使用m_pDoc,这个是会在第一次随m_pChildFrame->DestroyWindow或m_pChildFrame->SendMessage(WM_CLOSE, 0, 0);销毁。
再次使用时m_pDoc是野指针,导致LoadFrame出错;
【修改描述】
context.m_pCurrentDoc = NULL; 且在View里删除调用m_pDocument相关的代码;
【测试结果】

sat23 3 anni fa
parent
commit
32444b1722

+ 4 - 4
FieldTestTool/FieldTestTool/FieldTestTool.cpp

@@ -103,12 +103,12 @@ BOOL CFieldTestToolApp::InitInstance()
     TCHAR szExt[MAX_PATH] = { 0 };
     ::GetModuleFileName(NULL, Global::g_szCurModulePath, sizeof(Global::g_szCurModulePath) / sizeof(TCHAR));
     _tsplitpath_s(Global::g_szCurModulePath, szDrive, szDir, Global::g_szFna, szExt);
-#ifdef _DEBUG
-    ::GetCurrentDirectory(MAX_PATH, Global::g_szCurModuleDir);
-    _tcscat_s(Global::g_szCurModuleDir, _T("\\"));
-#else
     _tcscpy_s(Global::g_szCurModuleDir, szDrive);
     _tcscat_s(Global::g_szCurModuleDir, szDir);
+#ifdef _DEBUG
+    //::GetCurrentDirectory(MAX_PATH, Global::g_szCurModuleDir);
+    //_tcscat_s(Global::g_szCurModuleDir, _T("\\"));
+    ::SetCurrentDirectory(Global::g_szCurModuleDir);
 #endif
 
     Global::GetConfig();

+ 7 - 6
FieldTestTool/FieldTestTool/FieldTestToolView.cpp

@@ -57,10 +57,10 @@ BOOL CFieldTestToolView::PreCreateWindow(CREATESTRUCT& cs)
 
 void CFieldTestToolView::OnDraw(CDC* /*pDC*/)
 {
-	CFieldTestToolDoc* pDoc = GetDocument();
-	ASSERT_VALID(pDoc);
-	if (!pDoc)
-		return;
+	//CFieldTestToolDoc* pDoc = GetDocument();
+	//ASSERT_VALID(pDoc);
+	//if (!pDoc)
+	//	return;
 	// TODO: 在此处为本机数据添加绘制代码
     if ( m_pCamera )
         m_pCamera->ResizeVideoWindow();
@@ -102,8 +102,9 @@ void CFieldTestToolView::Dump(CDumpContext& dc) const
 
 CFieldTestToolDoc* CFieldTestToolView::GetDocument() const // 非调试版本是内联的
 {
-	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFieldTestToolDoc)));
-	return (CFieldTestToolDoc*)m_pDocument;
+	//ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFieldTestToolDoc)));
+	//return (CFieldTestToolDoc*)m_pDocument;
+    return NULL;
 }
 #endif //_DEBUG
 

+ 7 - 14
FieldTestTool/FieldTestTool/MainFrm.cpp

@@ -634,15 +634,8 @@ void CMainFrame::OnCameraCombobox()
                 if ( pView->m_pCamera )
                     delete pView->m_pCamera;
                 pView->m_pCamera = NULL;
-                //pView->GetDocument()->OnCloseDocument();
-
-                //pView->SendMessage(WM_CLOSE, 0, 0);
-                //pView->CloseWindow();
-                //m_pChildFrame->MDIDestroy();
-                m_pChildFrame->CloseWindow();
-                //m_pChildFrame->DestroyWindow();
-                //m_pChildFrame->SendMessage(WM_CLOSE, 0, 0);
-                //delete m_pChildFrame;
+                pView->DestroyWindow(); //pView->SendMessage(WM_CLOSE, 0, 0);
+                m_pChildFrame->DestroyWindow(); //m_pChildFrame->SendMessage(WM_CLOSE, 0, 0);
                 m_pChildFrame = NULL;
             }
   
@@ -653,7 +646,9 @@ void CMainFrame::OnCameraCombobox()
             m_pChildFrame = new CChildFrame();
             context.m_pLastView = NULL;
             context.m_pCurrentFrame = this;
-            context.m_pCurrentDoc = m_pDoc;
+            // 不要使用m_pDoc,这个是会在第一次随m_pChildFrame->DestroyWindow或m_pChildFrame->SendMessage(WM_CLOSE, 0, 0);销毁
+            // 再次使用时m_pDoc是野指针,导致LoadFrame出错;
+            context.m_pCurrentDoc = NULL;//m_pDocTemplate->CreateNewDocument();
             context.m_pNewViewClass = RUNTIME_CLASS(CFieldTestToolView);
             context.m_pNewDocTemplate = m_pDocTemplate;
 
@@ -1045,7 +1040,7 @@ BOOL CMainFrame::OnDeviceChange(UINT nEventType, DWORD_PTR dwData)
         {
             OutputDebugString(_T("设备有变化===============\n"));
             // 新增时,需要等待系统刷新后才能遍历设备(有时仍不灵,添加刷新按钮处理);
-            if ( nEventType == DBT_DEVICEARRIVAL)
+            if ( nEventType == DBT_DEVICEARRIVAL )
                 Sleep(1000);
 
             EnumDevices(vtDevices);
@@ -1069,15 +1064,13 @@ BOOL CMainFrame::OnDeviceChange(UINT nEventType, DWORD_PTR dwData)
                     if ( pView->m_pCamera )
                         delete pView->m_pCamera;
                     pView->m_pCamera = NULL;
-                    pView->CloseWindow();
                     pView->DestroyWindow();
 
-                    m_pChildFrame->CloseWindow();
+                    m_pChildFrame->DestroyWindow();
                     m_pChildFrame = NULL;
 
                     // 设备移除后,设置空;
                     pCameraCombo->DeleteItem(nCurSel);
-                    //pCameraCombo->SelectItem(-1);
                 }
             }