这个方法的目的就是通过打开文件对话框来打开文件,并显示到文档上,这是一个MFC的单文档程序,初学VC,摆求大家帮帮忙 
编译没有错误,运行程序后在执行到打开文件显示试报错(内存不能READ)
void CWin32Test21App::OnFileOpen() 

//CWinApp::OnFileOpen(); 
CFileDialog *fd=new CFileDialog(true); 
fd->DoModal(); 
CString filename=fd->GetPathName(); 
HANDLE hFile=CreateFile(filename,GENERIC_READ,0,NULL,OPEN_ALWAYS, 
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_RANDOM_ACCESS|SECURITY_ANONYMOUS,NULL); 
if(hFile==NULL) 
return; 
const int buffersize=2048; 
DWORD readsize=0; 
char buffer[buffersize]; 
ReadFile(hFile,buffer,buffersize/2,&readsize,NULL); 
LPPAINTSTRUCT ps; 
CMainFrame * cf; 
CView * cv=cf->GetActiveView(); 
CDC * cdc=cv->BeginPaint(ps); 
CDC * cdc=cv->GetDC(); 
cdc->TextOut(0,0,buffer); 
cv->EndPaint(ps); 
}

解决方案 »

  1.   

    在activeview中的onpaint处理函授中,textout 你读入的字符内容,否则当窗口移动的时候,会差掉你写的内容。
      

  2.   

    CFileDialog *fd=new CFileDialog(true);
    为什么要动态创建呢?CFileDialog fd(TRUE,"*.exe",NULL,OFN_HIDEREADONLY   |   OFN_OVERWRITEPROMPT,"Exe   files(*.exe)|*.exe|All   files   (*.*)|*.*||"); 
    fd.DoModal();
    就可以了。
      

  3.   

    1.
    if(hFile==NULL) 
    return; 这句不对, 应该是
    if(hFile == INVALID_HANDLE_VALUE)2. ReadFile 对字符串不会加结束标记 '\0', (需要自己加)
     TextOut(0,0,buffer); 时就会越界,  (内存不能READ)
      

  4.   

    对源程序修改:
    buffer[1024]='\0';
    cdc->TextOut(0,0,buffer,1024);还是报错,调试时发现错误在:
    cdc->TextOut(0,0,buffer,1024);
    错误是: Access Violation.
      

  5.   

    刚才加个判断,cdc是0,
    该怎么解决啊?
      

  6.   

    你的函数是在CWinApp类中的啊,显示工作不应该放在这里啊,改到CView中看看