程序在另一台机器上运行崩溃,虽然找到的避免该错误的方法,但稀里糊涂的,不知道为什么?
出错描述: 程序在我的开发用机器上运算无误,但放到用户机器上崩溃了,跟踪后发现,同样的程序在两台机器上有一句代码的执行不一样:
/***************************************************************************************/
//源代码,CarIORec类的构造函数:
CarIORec::CarIORec(_ConnectionPtr connPtr/* =0 */, long nRecId/* =-1 */, CString strCarCode/* =_T */, COleDateTime dtIO/*=COleDateTime::GetCurrentTime()*/, bool bRecType/*=true*/)
:m_connPtr(connPtr), m_nRecId(nRecId), m_strCarCode(strCarCode), m_dtIO(dtIO), m_bRecType(bRecType)
{
}
//增加记录按钮按下时的处理函数:
void CCarIOView::OnButtonAdd()
{
CarIORec ioRec(GetDocument()->m_adoconn.GetConnection()); //创建CarIORec类对象导致程序崩溃
.....
}
//跟踪比较汇编代码:==================================
129: void CCarIOView::OnButtonAdd()
130: {
131: CarIORec ioRec(GetDocument()->m_adoconn.GetConnection());
0041604E push 1
00416050 lea eax,[ebp-40h]
00416053 push eax
00416054 call COleDateTime::GetTickCount (0042723a) //未重编译时
//在用户机器上跟踪调试时导致错误的调用,GetTickCount JMP到
// CDateTimeCtrl::GetTime(COleDateTime& timeDest)
//而在我开发用的机器上,GetTickCount JMP到COleDateTime::GetCurrentTime
//于是在用户机器上进行重新编译,有些改变:
00416054 call COleDateTime::GetTickCount (0042715a) //重编译后
//现在和我开发用机器上的一样是JMP到COleDateTime::GetCurrentTime,程序正确了
........
}
//////////////////////////////////////////////////////////////////////////////////////////
//在用户机器上出错时的细节:
//在用户机器上JMP到GetTime后的执行细节:
BOOL CDateTimeCtrl::GetTime(COleDateTime& timeDest) const
{
SYSTEMTIME sysTime;
BOOL bRetVal = TRUE;
LRESULT result = ::SendMessage(m_hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM) &sysTime);
if (result == GDT_VALID)
{
timeDest = COleDateTime(sysTime);
bRetVal = TRUE;
ASSERT(timeDest.GetStatus() == COleDateTime::valid); //这里断言失败!
}
else if (result == GDT_NONE)
{
timeDest.SetStatus(COleDateTime::null);
bRetVal = TRUE;
}
else
timeDest.SetStatus(COleDateTime::invalid);
return bRetVal;
}
//CDateTimeCtrl::GetTime执行后立即执行以下程序:
_AFXDISP_INLINE COleDateTime::COleDateTime(const COleDateTime& dateSrc)
{ m_dt = dateSrc.m_dt; m_status = dateSrc.m_status; } //程序崩溃:deteSrc无效
/***************************************************************************************/
解决方法:
于是我将工程设置(如:运行库\调试信息\RTTI等进行排查,发现当用了DEBUG版本的多线程运行库程序在
用户机器上运行就会崩溃,而换成非DEBUG版本的多线程运行库后程序运行无误.
我的困惑:
在开发机器上,程序在用了DEBUG版本的多线程运行库,程序总是运算正确,而在拷贝到客户机器上后,即使客户机器上装了VC还是会运行不了(只要一用到COleDateTime就出错),如果在客户机上重新编译程序,
程序就正确了.为什么???????????