一个超难的问题.出错居然是在lpBuf[dwAddress+i]=iData这样的语句. 请大家对程序的稳定性提点建议

auly403 2006-08-08 12:15:44
BOOL CFileConvert::Mif2Bin(CFile * m_lpTarget,CStdioFile * m_lpSoure)
{
char * lpBuf=new char[m_lpTarget->GetLength()/2+100];
memset(lpBuf,0,m_lpTarget->GetLength()/2+100);
DWORD dwWriteLen=ConverToBin(lpBuf,m_lpTarget,m_lpSoure);
m_lpTarget->WriteHuge(lpBuf,dwWriteLen);
return TRUE;
}

DWORD CFileConvert::ConverToBin(LPSTR lpBuf,CFile * m_lpSoure,CStdioFile * m_lpTarge)
{
CString m_ReadString;
BOOL bEnd;
DWORD dwAddress;
UINT nLen;
UINT nPos=0;
UINT nProgressLenght=0;
while(m_lpTarge->ReadString(m_ReadString)){
nProgressLenght++;
}
SetProgressLenght(nProgressLenght/0x800);
m_lpTarge->SeekToBegin();
char * lpRead=new char[255];
do{
memset(lpRead,0,255);
m_lpTarge->ReadString(lpRead,255);
if(strlen(lpRead)==0) break;
TRACE("%s\n",lpRead);
if(*(lpRead+1)=='1'||*(lpRead+1)=='2'||*(lpRead+1)=='3')
{
char lpAddress[9]="";
memcpy(lpAddress,lpRead+4,(*(lpRead+1)+1-'0')*2);
dwAddress=strtoul(lpAddress,NULL,16);
static UINT dwHeadAddress=dwAddress;
char lpLen[3]="";
memcpy(lpLen,lpRead+2,2);
nLen=strtoul(lpLen,NULL,16)-5;
SetProgress(nPos/0x800);
FillBin(lpBuf,dwAddress-dwHeadAddress,lpRead+12,nLen);
nPos++;
}
}while(bEnd);
delete []lpRead;
if(bExchangeHILO) ExChangeHiLo(lpBuf,dwAddress+nLen);
return dwAddress+nLen;
}
void CFileConvert::FillBin(LPSTR lpBuf, DWORD dwAddress, LPCSTR lpRead, UINT nLen)
{
char lpData[3]="";
BYTE iData;
for(UINT i=0;i<nLen-1;i++){
memcpy(lpData,lpRead+i*2,2);
iData=strtoul(lpData,NULL,16);
lpBuf[dwAddress+i]=iData;
}
TRACE("0x%x___0x%x\n",lpBuf+dwAddress+i,iData);

}

这三个函数实现文件格式转换功能. 一般是把一个10M左右的mif读入.再转成一种BIN格式.
本来上一个版本.是没有任何.能正常使用.
现在这个版本改了一点代码.与这些代码无任何相关内容..
但是新的这个版本出现无效的句柄访问.

PS: 如果把第三个函数的 lpBuf[dwAddress+i]=iData; 这句注释掉.运行正常...
...全文
229 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
DentistryDoctor 2006-08-08
  • 打赏
  • 举报
回复
看来是越界了。造成了堆被破坏。
dick_song 2006-08-08
  • 打赏
  • 举报
回复
留意static UINT dwHeadAddress=dwAddress;那句,整个程序只会执行一次,如果ConverToBin执行了两次或以上,FillBin(lpBuf,dwAddress-dwHeadAddress,lpRead+12,nLen);那句里dwAddress-dwHeadAddress就有可能是一个很大的数(其实是负数),这样就会造成lpBuf[dwAddress+i]=iData;那句的数组lpBuf越界!
syy64 2006-08-08
  • 打赏
  • 举报
回复
跟内存有关。
常用MFC和API函数 索引 CArchive类:用于二进制保存档案 CBitmap类:封装Windows的图形设备接口(GDI)位图 CBrush类:封装图形设备接口(GDI)中的画刷 CButton类:提供Windows按钮控件的功能 CByteArray类:该类支持动态的字节数组 CCmdUI类:该类仅用于ON_UPDATE_COMMAND_UI处理函数中 CColorDialog类:封装标准颜色对话框 CDC类:定义设备环境对象类 CDialog类:所有对话框(模态或非模态)的基类 CDocument类:提供用户定义的文档类的基本功能 CEdit类:是一个用于编辑控件的类 CFile类:该类是基本文件类的基类 CFileDialog类:封装了打开和保存文件的标准对话框 CFindReplaceDialog类:封装了标准查找/替换对话框 CFont类:封装了Windows图形设备接口(GDI)中的字体对象 CFontDialog类:封装了字体选择对话框 CGdiObject类:GDI绘图工具的基类 CIPAddressCtrl类:提供了IP地址控件的功能 CImageList类:管理大小相同的图标或位图集 CMenu类:封装应用程序菜单栏和弹出式菜单 CPen类:封装了Windows图形设备接口(GDI)中的画笔对象 CPoint类:操作CPoint和POINT结构 CRect类:封装了一个矩形区域及相关操作 CRgn类:封装用于操作窗口中的椭圆、多边形或者不规则区域的GDI区域 CSize类:用于表示相对坐标或位置 CSpinButtonCtrl类:旋转控件Spin的控制类 CStatusBar类:状态栏窗口的基类 CString类:处理字符串 CStringList类:支持CString对象的列表 CWinApp类:派生的程序对象的基类 CWnd类:提供所有窗口类的基本函数 API函数 CArchive类:用于二进制保存档案 CArchive::CArchive 建立一个CArchive对象 CArchive(CFile* pFile,UINT nMode,int nBufSize=4096,void* lpBuf=NULL); 参数:pFile 指向CFile对象的指针,这个CFile对象
RS232 串口模块 //Reading / Writing Methods DWORD Read(void* lpBuf, DWORD dwCount); BOOL Read(void* lpBuf, DWORD dwCount, OVERLAPPED& overlapped); void ReadEx(void* lpBuf, DWORD dwCount); DWORD Write(const void* lpBuf, DWORD dwCount); BOOL Write(const void* lpBuf, DWORD dwCount, OVERLAPPED& overlapped); void WriteEx(const void* lpBuf, DWORD dwCount); void TransmitChar(char cChar); void GetOverlappedResult(OVERLAPPED& overlapped, DWORD& dwBytesTransferred, BOOL bWait); void CancelIo(); //Configuration Methods void GetConfig(COMMCONFIG& config); static void GetDefaultConfig(int nPort, COMMCONFIG& config); void SetConfig(COMMCONFIG& Config); static void SetDefaultConfig(int nPort, COMMCONFIG& config); //Misc RS232 Methods void ClearBreak(); void SetBreak(); void ClearError(DWORD& dwErrors); void GetStatus(COMSTAT& stat); void GetState(DCB& dcb); void SetState(DCB& dcb); void Escape(DWORD dwFunc); void ClearDTR(); void ClearRTS(); void SetDTR(); void SetRTS(); void SetXOFF(); void SetXON(); void GetProperties(COMMPROP& properties); void GetModemStatus(DWORD& dwModemStatus); //Timeouts void SetTimeouts(COMMTIMEOUTS& timeouts); void GetTimeouts(COMMTIMEOUTS& timeouts); void Set0Timeout(); void Set0WriteTimeout(); void Set0ReadTimeout(); //Event Methods void SetMask(DWORD dwMask); void GetMask(DWORD& dwMask); void WaitEvent(DWORD& dwMask); void WaitEvent(DWORD& dwMask, OVERLAPPED& overlapped); //Queue Methods void Flush(); void Purge(DWORD dwFlags); void TerminateOutstandingWrites(); void TerminateOutstandingReads(); void ClearWriteBuffer(); void ClearReadBuffer(); void Setup(DWORD dwInQueue, DWORD dwOutQueue); //Overridables virtual void OnCompletion(DWORD dwErrorCode, DWORD dwCount, LPOVERLAPPED lpOverlapped);

16,471

社区成员

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

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

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