请教一个关于程序崩溃的问题
我的程序与一个PLC相连,我在程序运行的时候,当出现某一个值大于某一设定值的时候就弹出一个提示框,现在的问题是,我如果移动这个提示框的位置后,再手动输入一个实数的时候,程序就崩溃了,而如果不移动这个提示框就输入某一数值,就不会崩溃,请问大家知道这个是什么原因吗?我知道这样问比较笼统,因为我不知道是哪里的代码问题,不知道贴哪里的代码,由于显示提示框用到了showpicture函数,我就将这个函数写出来,先调用第一ShowPicture,再调用第二个ShowPicture,再调用第三个ShowPicture,大家看看有什么问题吗?谢谢了
void CMainFrame::ShowPicture( TCHAR* pPicName )
{
// first find id of this picture.
WORD wID = 0;
wID = m_ViewManager.FindID( pPicName );
if( wID == 0 )
{ // no this picture.
ASSERT( FALSE );
return;
}
if( m_CurFocusRecord.pViewPicWnd )
m_CurFocusRecord.pViewPicWnd->Exit() ;
////////////////////
ShowPicture( wID);
}
void CMainFrame::ShowPicture( WORD wID )
{
int VarSum;
HGLOBAL* pVarInfor = NULL;
pVarInfor = m_RealDB.GetVarInfor( VarSum );
ShowPicture( wID, pVarInfor, VarSum );
m_RealDB.FreeVarInfor();
}
void CMainFrame::ShowPicture( WORD wID, HGLOBAL* pVarInfor, int VarSum )
{
#ifdef _NEWSECRET
CTouchvewApp* pApp = (CTouchvewApp*)AfxGetApp() ;
#endif
ASSERT( wID > 0 );
if( wID == 0 || pVarInfor == NULL )
{
ASSERT( VarSum == 0 );
return;
}
#ifdef __SECRET
long unResult;
int unIndex;
int secretPt = 1;
LPLONG lpLong;
LPLONG lpElapseTime = (LPLONG)GlobalLock( m_hElapseTime );
if( lpElapseTime[1] >= 720 )
lpElapseTime[1] = 0;
GlobalUnlock( m_hElapseTime );
unResult = queryKey( ALG23, RandSend2[rand()%30] );
#endif
CViewPicWnd* pShowWnd = NULL;
CViewPicWnd* pViewPicWnd = NULL;
CWnd* pPosWnd = NULL;
CString failMess, failMess2;
// if this picture has been in memory , only bring it to top.
#ifdef __SECRET
WRITEKEY( DATA_WORD20, FALSE );
#ifdef _DEBUG
BOOL IsMemory = FALSE;
#endif
#else
BOOL IsMemory = FALSE;
#endif
pViewPicWnd = (CViewPicWnd*)this->GetTopWindow();
if( pViewPicWnd ){ //若当前画面在最上面,且已显示,则不需再显示
while( pViewPicWnd != NULL )
{
ASSERT( ::IsWindow(pViewPicWnd->m_hWnd) != 0 );
if( !pViewPicWnd->IsKindOf(RUNTIME_CLASS(CViewPicWnd)) ){
pViewPicWnd = (CViewPicWnd*)pViewPicWnd->GetNextWindow( GW_HWNDNEXT );
continue;
}
if( pViewPicWnd->m_wID == wID && pViewPicWnd->m_bIsShow == SHOW )
{
#ifdef WYH_PROFILE
CString strProfile = _T("当前画面在最上面,且已显示!");
((CTouchApp*)AfxGetApp)->ShowMessage(strProfile);
#endif
return;
}
else
break;
}
}
pViewPicWnd = (CViewPicWnd*)this->GetTopWindow();
while( pViewPicWnd != NULL )
{
ASSERT( ::IsWindow(pViewPicWnd->m_hWnd) != 0 );
if( !pViewPicWnd->IsKindOf(RUNTIME_CLASS(CViewPicWnd)) ){
pViewPicWnd = (CViewPicWnd*)pViewPicWnd->GetNextWindow( GW_HWNDNEXT );
continue;
}
if( wID == pViewPicWnd->m_wID )
{ // showing this picture exist in memory.
pShowWnd = pViewPicWnd;
#ifdef __SECRET
WRITEKEY( DATA_WORD20, TRUE );
#ifdef _DEBUG
IsMemory = TRUE;
#endif
#else
IsMemory = TRUE;
#endif
break;
}
pViewPicWnd = (CViewPicWnd*)pViewPicWnd->GetNextWindow( GW_HWNDNEXT );
}
if( IsMemory != TRUE )
{
CViewDocument* pViewDocument = new CViewDocument;
pViewDocument->SetID( wID );
CViewPicWnd* pTemp = new CViewPicWnd;
pViewDocument->m_pViewPicWnd = (void*)pTemp;
if( !m_ViewManager.LoadDocView( *pViewDocument, pVarInfor, VarSum ) )
{ // can't load picture from hard disk.
delete pViewDocument;
delete pTemp;
#ifdef WYH_PROFILE
CString strProfile = _T("ShowPicture( wID, pVarInfor, VarSum ) Failed");
((CTouchApp*)AfxGetApp)->ShowMessage(strProfile);
#endif
return;
}
ASSERT( pViewDocument->m_wID == wID );
int flag = pTemp->Load( *pViewDocument, this );
if( (!flag) )
{
failMess.LoadString( IDS_CREATE_PIC_FAIL );
failMess = failMess + _T("\"");
failMess = failMess + pViewDocument->m_Name ;
failMess = failMess + _T("\"");
failMess2.LoadString( IDS_CLOSE_OTHER_PIC );
failMess = failMess + failMess2;
#ifdef WYH_PROFILE
((CTouchApp*)AfxGetApp)->ShowMessage(failMess);
#endif
delete pViewDocument;
delete pTemp;
return;
}
delete pViewDocument;
ASSERT( pShowWnd == NULL );
pShowWnd = pTemp;
pShowWnd->ShowWindow( SW_SHOW );
pShowWnd->InitWindowValue() ; // 初始化窗口上元素的值。
}
// set windows position , states and size.
pShowWnd->m_bIsShow = SHOW;
if ( pShowWnd->m_nType & FLAG_REPLACE )
{ // 如果为替换画面。
//ASSERT( pShowWnd->m_nType & FLAG_REPLACE );
RECT show_rect, pop_rect;
pShowWnd->GetWindowRect( &show_rect );
// and close _T("popup") windows which intersect with it.
pViewPicWnd = (CViewPicWnd*)this->GetTopWindow();
CObArray interArray;
while( pViewPicWnd != NULL )
{
ASSERT( ::IsWindow( pViewPicWnd->m_hWnd ) != 0 );
if( !pViewPicWnd->IsKindOf(RUNTIME_CLASS(CViewPicWnd)) ){
pViewPicWnd = (CViewPicWnd*)pViewPicWnd->GetNextWindow( GW_HWNDNEXT );
continue;
}
if( pViewPicWnd != pShowWnd )
{
pViewPicWnd->GetWindowRect( &pop_rect );
RECT nullRect;
if( ::IntersectRect( &nullRect, &pop_rect, &show_rect ) )
if( pViewPicWnd->m_bIsShow == SHOW )
interArray.Add( (CObject*)pViewPicWnd );
//ClosePicture( pViewPicWnd->m_wID );
}
pViewPicWnd = (CViewPicWnd*)pViewPicWnd->GetNextWindow( GW_HWNDNEXT );
}
int closeCount = interArray.GetSize();
for( int closeInt = 0; closeInt < closeCount; closeInt++ )
{
ClosePicture( ((CViewPicWnd*)interArray.GetAt(closeInt))->m_wID );
//CViewPicWnd* pViewPic = (CViewPicWnd*)interArray.GetAt(closeInt);
// fyy 2007-12-27
//if( pViewPic )
{
// delete pViewPic;
// pViewPic = NULL;
}
}
// 内存泄漏..
if( closeCount )
{
interArray.RemoveAll(); // 如果包含的 CViewPicWnd 还没有被释放掉,这里应该被释放 !!!..
}
}
//执行画面显示命令语言
pShowWnd->ShowWindow( SW_SHOW );
pShowWnd->BringWindowToTop();
pShowWnd->InitValue(); //对所有的图素执行CGraphic::LinkCaculate()以获取最新值。
pShowWnd->Invalidate() ;
pShowWnd->SetFocus() ;
// 画面命令语言支持..
pShowWnd->ProcessScript( SCRIPT_SHOW, 0 );
}