s.pFrom=str.GetBuffer(256和s.pFrom="e:\\t.txt"的确一样,
难道你单步调试时s.pFrom的值不同吗?

解决方案 »

  1.   

    改为以下形式就对了
    CString str("e:\\t.txt");
    str+=(TCHAR)0;//s.pFrom可以指向多个文件,每个文件名以0分隔,字符串的最后以2个0结束
    SHFILEOPSTRUCT s;
    s.hwnd=NULL;
    s.wFunc=FO_DELETE;
    s.pFrom=str.GetBuffer(256);
    s.fFlags=FOF_ALLOWUNDO  and  FOF_NOCONFIRMATION ;
    SHFileOperation(&s);以s.pFrom="e:\\t.txt"的形式调用时,"e:\\t.txt"位于数据段,长度为9(加上结束符),因为字符串数据是按4字节边界对齐的,所以其后的3个字节都为0,所以符合pForm的要求,可以通过.
    以s.pFrom=str.GetBuffer(256)的方式就不同了,其对应的内存是动态分配的,在堆中,所以其结束符后的数据是随机的,很可能不为0.(该内存若是分配过又释放了的,还保留有上次的数据)
      

  2.   

    可以直接将str的值给s.pFrom
    因为CString有operator const char *()的成员函数
      

  3.   

    s.pFrom需要以两个NULL字符结束
      

  4.   

    可以把s.pFrom=str.GetBuffer(256)改为s.pFrom=str.GetBuffer(str.Getlength());