请教一个关于程序崩溃的问题

twins222 2009-08-17 09:19:11
我的程序与一个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 );
}
...全文
113 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
twins222 2009-08-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 youyingbo 的回复:]
提示框做成模式对话框不行吗
[/Quote]
应该不能这样改吧
twins222 2009-08-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 baker_lee 的回复:]
把程序崩溃的callstack贴出来吧
[/Quote]
这个问题是客户在用我们产品的时候出现的,我没有复现出这个问题,客户连接了PLC,我没有连接PLC就没有看到,而客户连接PLC就会出现这个问题。
tiger波波 2009-08-17
  • 打赏
  • 举报
回复
提示框做成模式对话框不行吗
BAKER_LEE 2009-08-17
  • 打赏
  • 举报
回复
把程序崩溃的callstack贴出来吧
twins222 2009-08-17
  • 打赏
  • 举报
回复
没有人帮忙吗?
twins222 2009-08-17
  • 打赏
  • 举报
回复
哈哈 自己也up一下
见习学术士 2009-08-17
  • 打赏
  • 举报
回复
UP
twins222 2009-08-17
  • 打赏
  • 举报
回复
自己再顶一下吧 怎么没有人回答了呢。呼唤强人.....

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧