大家好,初学vc++,希望大家多多指教。
在编写动态打开一个.bmp文件的程序时,我的程序段如下:
void CCDYnSplitView::OnOpen() 
{
  if(FileDialog.DoModal()==IDOK)   
{   
         FileName=(LPSTR)(LPCTSTR)FileDialog.GetFileName();//FileName是我定义的一个字符指针型的全局变量,我的原意是在这里获取选中的文件。
  
}
}
然后我在void CCDYnSplitView::OnDraw(CDC* pDC)函数中
{
  extern char* FileName;
  dib.LoadFile(FileName);//dib是我定义的一个类,用来显示图像。我想把上面程序中的文件传到这里来。
.
.
.
下面的程序我省略了
}在编译链接的时候都没有问题,但是运行时就会出问题。大家能给我一个原因和建议吗?不胜感激!

解决方案 »

  1.   

    在使用FileName前,一定要判断它的合法性
      

  2.   

    to wjywyh9:你好!我在stdafx.h中定义如下:extern char* FileName;
      在stdafx.cpp中声明如下:char* FileName;
    不知道这样是否可以?等你的答复。谢谢!
      

  3.   

    为什么你要加一个extern呢?即便这是一个全局变量。
    运行是什么问题,能不能详细说一下。
      

  4.   

    我在void   CCDYnSplitView::OnOpen() 
    {
      CFileDialog FileDialog(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
         "JPEG(*.JPG,*.JPE),BMP(*.BMP,*.RLE),TIFF(*.TIF)|*.BMP;*.RLE;*.JPG;JPE;*.TIF;*.TIFF|BMP(*.BMP,*.RLE)|*.BMP;*.RLE|JPEG(*.JPG,*.JPE)|*.JPG;JPE|TIFF(*.TIF)|*.TIF;*.TIFF|*.*|", NULL);   
        
        if(FileDialog.DoModal()==IDOK)
          FileName=(LPSTR)(LPCTSTR)FileDialog.GetFileName();//FileName是我定义的一个字符指针型的全局变量,我的原意是在这里获取选中的文件。 
    }
       在这里获得打开对话框中的文件后我想把它传到void CCDYnSplitView::OnDraw(CDC* pDC)函数中,即给dib.LoadFile((LPSTR)(LPCTSTR)Bmpname),目的是传给dib这个类的LoadFile函数。LoadFile()这个函数是提取一幅.bmp图像。
    编译链接的时候没有问题,执行的时候会跳出一个出错的对话框,说0x102179db引用指令为0x00000000,不能为read,终止程序点“确定”,要调试点取消。请分析一下原因,谢谢!!!
      

  5.   

    最好把FileName定义成TCHAR型, 给它new一个空间,然后用_tcscpy把文件名拷贝过去,这是比较稳妥的办法。
      

  6.   

    void   CCDYnSplitView::OnOpen()   

         TCHAR strFilter[] = { TEXT("Picture Files (*.bmp)|*.bmp||") };
         CFileDialog dlg(TRUE, TEXT(".bmp"), NULL, 0, strFilter);      if( dlg.DoModal() == IDOK )
    {
    strFilename = dlg.GetFileName();
    Invalidate();
    }
    }
    应该没问题的  我做过
      

  7.   

    你把FileName定义为一个指针的话,在OnOpen里面没有分配指针,即使分配了,给它赋值后也是没有用的,离开OnOpen后FileName指向的内存也被释放了,所以离开OnOpen后FileName是无效的。
    如果一定要用指针,可以给FileName分配合适的大小,然后用lstrcpy等函数将字符串拷贝到里面;或者,用CString类型来定义FileName(最好改成别的变量名,比如m_strFileName):
    void   CCDYnSplitView::OnOpen()   

        if(FileDialog.DoModal()==IDOK)       
    {       
                    m_strFileNameFileDialog.GetFilePath();//注意GetFileName和GetFilePath的区别。 
        


      

  8.   

    http://www.functionx.com/visualc/views/DisplayBitmap.htm