我要在自己的资源管理器中复制文件到剪帖板上,在系统的资源管理器中可以粘贴文件但是如果运行了复制函数后,系统的资源管理器就不能用了,而且所有打开文件的地方都会出问题。(即双击C盘,D盘,或点右键一类的操作都会出现错误,并且关闭)在复制函数中,如果把下面注释掉,就不会出现系统中的错误了
if(hFileGlobal!=NULL)
{
  ::GlobalFree(hFileGlobal);
  hFileGlobal=NULL;
}
f = ::CloseClipboard();但是在系统资源管理器中,点右键的“粘贴”为灰。请帮帮忙吧,多谢了!

解决方案 »

  1.   

    现在暂时是这样子:这是复制的那一部分
    file_to_edit=GetFileSelected();
    HGLOBAL hFileGlobal ;
    BOOL f;
    f = ::OpenClipboard(GetSafeHwnd());
    EmptyClipboard();
    if(f)
    {
      if(hFileGlobal != NULL)
     {
    ::GlobalFree(hFileGlobal);
               hFileGlobal = NULL;
      }
    hFileGlobal = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, 1024 * MAX_PATH);
    CHAR *pFileBuf = (CHAR *)::GlobalLock(hFileGlobal);
    strcpy(pFileBuf, (LPCTSTR)file_to_edit);
    ::GlobalUnlock(hFileGlobal);
    ::SetClipboardData(CF_HDROP, hFileGlobal);
    /* if(hFileGlobal!=NULL)
    {
    ::GlobalFree(hFileGlobal);
    hFileGlobal=NULL;
    }  f = ::CloseClipboard();
      if(!f)
    AfxMessageBox("剪帖板操作失败!");*/
    }
      

  2.   

    试一试:
       ::SetClipboardData(CF_TEXT,pFileBuf);
      

  3.   

    错了,是:
      ::SetClipboardData(CF_TEXT,hFileGlobal);
      

  4.   

    可是我是要复制、粘贴一个文件呀
    用CF_TEXT能行吗?
      

  5.   

    注释掉这几句,保留最后一句,你不能手动释放字符串空间,要由系统自己释放
    /*if(hFileGlobal!=NULL)
    {
    ::GlobalFree(hFileGlobal);
    hFileGlobal=NULL;
    }
    */
      f = ::CloseClipboard();
      

  6.   

    P.S.如果你自己先释放了,粘贴时当然会出错。不掉用CLoseClipboard剪贴板里的数据是无效的(有点像对文件的操作那样,做后必须fclose)
      

  7.   

    如:Goesthe(点点云之外)所说的更改之后
    在我的程序中选择“复制”后,原系统中的资源管理器又都不能用了,除非重启才可以,出现错误:“发生内部错误,您正在使用的一个窗口即将被关闭”。
    确定后,这个窗口就被关闭了(资源管理器或文件夹)我的“复制”和“粘贴”不在块儿中,分别是两个函数,所以在“复制”时不free,在“粘贴”后再free,是吗?请问该怎么办了?我想先完成在自己的程序中“复制”,然后可以在系统中“粘贴”。多谢了,请帮忙。
      

  8.   

    我现在的问题就是:在“复制”文件到剪帖板上的函数中,
    如果执行 ::CloseClipboard(); ,则在操作系统中的资源管理器就出问题,不能打开文件夹,也不能点右键。如果不执行 ::CloseClipboard(); ,也不能完成“复制”、“粘贴”,在自己的程序中“复制”后,操作系统中的右键中的“粘贴”项还是灰的。请问:这是为什么呢?怎样改正呢?多谢指教。
      

  9.   

    如果不执行::CloseClipboard(),则在程序退出时,操作系统中的资源管理器出问题。为什么呢?奇怪的问题是不是退出时也会关闭剪帖板呀?那么说一关闭“剪帖板”就会出错?谢谢!
      

  10.   

    用CF_HDROP,SetClipboardData(CF_HDROP, hFileGlobal)的第二个参数要是HDROP类型数据不能用CHAR指针型。