在WinCE下使用ReadFile的问题?

luckyboy1979 2006-04-04 02:59:43
界面程序,一个button,点击弹出CFileDialog,选择打开文件,程序实现如下:
#define MAX_BUFFER 1024*10
void CDLLTestDlg::OnSelfileBtn()
{
// TODO: Add your control notification handler code here
MessageBox(_T("AAA"));
m_strCode = _T("");

CFileDialog dlg(TRUE,_T("*.cnc,*.*"),NULL,NULL,_T("*.cnc|*.cnc|*.*|*.*||"));
if(dlg.DoModal() == IDOK)
{
m_strFileName = dlg.m_ofn.lpstrFile;

HANDLE hFile = NULL;
hFile = CreateFile(m_strFileName,GENERIC_READ,TRUE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
//Error
DWORD Error = GetLastError();
CloseHandle(hFile);
return ;
}
CHAR readBuffer[MAX_BUFFER] ;
memset(readBuffer,0,MAX_BUFFER);
//WinCE
WCHAR m_FileBuffer[MAX_BUFFER];
memset(m_FileBuffer,0,MAX_BUFFER);

DWORD Read,HaveReaded;
int times;
Read = 100;
HaveReaded = 0;
times = 0;
do
{
ReadFile(hFile,&readBuffer[times*Read],Read,&HaveReaded,NULL);
times++;
}while(HaveReaded == Read);
CloseHandle(hFile);
MultiByteToWideChar(CP_ACP,0,readBuffer,MAX_BUFFER,m_FileBuffer,MAX_BUFFER);
m_strCode.Format(_T("%s"),m_FileBuffer);
m_strCode += _T("\r\n\0"); //很重要
m_FileCodeEdit.SetWindowText(m_strCode);
m_InputCodeEdit.SetWindowText(m_strCode);

GetDlgItem(IDC_RUNCODE_BTN)->EnableWindow(FALSE);
}
}
当MAX_BUFFER定义为1024*20或者更大时,点击button按键,Wince系统死掉;当MAX_BUFFER定义为1024*10时程序运行正常,打开文件,读取文件内容多很好,不过只能读取10K文件字符。
问题:
1。为什么会出现这种情况,是不是申请的内存太大了?(我时由VC转到做evc的,时间不长)
2。如果是申请的内存过大也应该运行到定义readBuffer的地方死掉啊,一点buton就死,MessageBox没有弹出来,而定义MAX_BUFFER是1024*10的时候,程序运行很好。不解?
3。要一次读取大文件中所有内容该如何实现?
望高人解答!
...全文
361 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
luckyboy1979 2006-04-04
  • 打赏
  • 举报
回复
非常感谢!
无聊客 2006-04-04
  • 打赏
  • 举报
回复
另外个人感觉你应该先判断文件的大小,再分配内存,否则一旦文件超出你定义的MAX_BUFFER,就可能DOWN 机了
无聊客 2006-04-04
  • 打赏
  • 举报
回复
CHAR readBuffer[MAX_BUFFER] ;
memset(readBuffer,0,MAX_BUFFER);
//WinCE
WCHAR m_FileBuffer[MAX_BUFFER];
memset(m_FileBuffer,0,MAX_BUFFER);
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
可以改成
LPSTR readBuffer = new CHAR[MAX_BUFFER];
...
WCHAR* m_FileBuffer = new WCHAR[MAX_BUFFER];
...
用完以后记的释放:
delete ....
无聊客 2006-04-04
  • 打赏
  • 举报
回复
尽量动态分配内存(使用new/delete或者malloc/free),在堆上分配,你这样在栈上申请这么大的空间,估计是栈溢出了

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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