我在用MFC编一个文件内字符串统计的小程序,希望使用最简单的文件拖放的功能。
现在的问题是用静态编译到Debug目录可以运行(或者直接点VC6.0上面的感叹号),没问题。
但是静态编译到Release目录,第一次拖放没问题,但第二次把文件拖进去就会连续跳出三个Windows那种“发送错误报告”的对话框出来。
所以,我都没办法调试。我把其他语句都注释掉了,可以确定是拖放的问题。看哪位高手知不知道是什么原因,什么地方还需要设置。我做了以下工作:
afx_msg void OnDropFiles(HDROP hDropInfo);放入了对话框头文件ON_MESSAGE(WM_DROPFILES,OnDropFiles)放入了BEGIN_MESSAGE_MAP(CAaaDlg, CDialog)下面void CAaaDlg::OnDropFiles(HDROP hDropInfo) 
{
char lpszFileName[512];
int nFileCount, k;

nFileCount = DragQueryFile(hDropInfo,0,NULL,512); for(k = 0; k < nFileCount; k++)
{
DragQueryFile(hDropInfo, k, lpszFileName, 512);   
} DragFinish(hDropInfo);
}

解决方案 »

  1.   

    你的OnDropFiles函数应该先判断一下里面有没有已经拖放的文件
      

  2.   

    afx_msg void OnDropFiles(HDROP hDropInfo);ON_WM_DROPFILES()void CMYDlg::OnDropFiles(HDROP hDropInfo) 
    {
       nFileCount = DragQueryFile(hDropInfo, (UINT)-1, NULL, 0);
       ...
    }
      

  3.   

    如何判断?我确实是拖进去才报错的,说明里面是有东西。
    而且Debug目录下那个exe是没错的。
      

  4.   


    我程序一开始就是这么写的,就是不对,所以试着改了几次参数才改到了我上面的样子。
    会不会是Release内部什么机制导致的?
      

  5.   

    nFileCount = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0); 
    If the index value is 0xFFFFFFFF, the return value is a count of the dropped files. Note that the index variable itself returns unchanged, and will therefore remain 0xFFFFFFFF.If the index value is between zero and the total number of dropped files and the lpszFile buffer address is NULL, the return value is the required size, in characters, of the buffer, not including the terminating null character.
      

  6.   

    //获取文件总数。
    nFileCount = DragQueryFile(hDropInfo, (UINT)-1, NULL, 0); //如果第3个参数为NULL,返回的是文件路径缓冲区的大小。
      

  7.   

    其实所有参数的修改我都试过了,0、-1、0xFFFFFFFF,也都不行。所以我才发帖问的。
    而且在Debug目录下那个文件一直都是没问题的。这位高手能帮我解释一下怎么可能会出现,本来编译通过,但VC静态编译发布到Release目录下出错的情况?因为我换了一台电脑编译也还是这样的,两个不同的VC6.0版本安装的,不大可能是我电脑的问题。
      

  8.   

    终于在网上找到了,我把名字改成了我的函数名。果然是Release本身的原因。
    http://blog.csdn.net/bestbear/articles/47411.aspxMFC调用我们的OnDropFiles函数,于是错误出现了,首先我们看看ON_MESSAGE宏的定义;  
    #define  ON_MESSAGE(message,  memberFxn)  \  
               {  message,  0,  0,  0,  AfxSig_lwl,  \  
                           (AFX_PMSG)(AFX_PMSGW)(LRESULT  (AFX_MSG_CALL  CWnd::*)(WPARAM,  LPARAM))&memberFxn  }  
           熟悉宏定义的朋友一看就明白,这个宏在展开的时候实际上是将两个参数压栈(WPARAM和LPARAM),然后调用函数指针;  
           而我们的函数OnDropFiles确只有一个参数定义,换句话说,函数返回的时候不会平栈,这就是Release版程序非法操作的原因。
    要多加入一个没用的参数,改为:
    afx_msg void OnDropFiles(HDROP hDropInfo, LPARAM b);
    就好了。估计大家都不用VC6.0,都改用.net了,所以也不会知道这个bug了。感谢大家的回答,都给分吧!