icopyhook

场景:在实现了ICopyHook的CopyCallback()函数中copy Folder后,Folder无法删除.解决思路

在实现了ICopyHook的CopyCallback()函数中copy Folder后,Folder无法删除.
我想实现的功能是,在用户对Folder做 "Delete "操作的时候把Folder拷贝到一个特定的地方(D:\TestHook).在删除之前Folder是拷贝过去了.但删除操作无法继续执行了.系统提示 "要删除的Folder被其他用户或进程占用,无法删除. ".请高手指教.是什么原因?怎么解决呢?

我的回调函数代码是:
UINT   __stdcall   CCopyHook::CopyCallback(HWND   hwnd,UINT   wFunc,UINT   wFlags,
                                                              LPCTSTR   pszSrcFile,DWORD   dwSrcAttribs,
                                                              LPCTSTR   pszDestFile,DWORD   dwDestAttribs)
{
        TCHAR   szMsg[MAX_PATH+14];
        TCHAR   szFolerArg[MAX_PATH+14];

        LPTSTR   pszSrcFolder   =   (LPTSTR)pszSrcFile;
        LPTSTR   pszDestFolder   =   _T( "D:\\TestHOOK ");

        //在回调函数里面实现拷贝功能
        CopyDirectory(pszSrcFolder,pszDestFolder);

        //开始时我以为是需要点延迟时间,所以加上一段循环,但好像不是这个原因.
        int   i=10000;
        while(i)
        {
                i--;
        }

        //拷贝完毕后提示用户是否继续删除
        wsprintf(szMsg,_T( "对%s进行的操作 "),pszSrcFile);
        return   MessageBox(NULL,szMsg,_T( "确认 "),MB_YESNO|MB_ICONEXCLAMATION);
}

//CopyDirectory函数的实现:
BOOL   CopyDirectory(LPTSTR       strSrcPath,       LPTSTR       strDestPath)      
{      
        HANDLE   HResult;      
        WIN32_FIND_DATA       FindFileData;      
        TCHAR     strSrcFileName[MAX_PATH],strDestFileName[MAX_PATH];      
        BOOL     blResult;      
        HResult   =   FindFirstFile(strSrcPath,&FindFileData);      

        if(HResult   ==   INVALID_HANDLE_VALUE)          
return   FALSE       ;      
   
        if(strSrcPath[strlen(strSrcPath)   -   1]   ==   '\\ ')      
strSrcPath[strlen(strSrcPath)   -   1]   =   '\0 ';      

        if(strSrcPath[strlen(strDestPath)   -   1]       ==       '\\ ')      
strSrcPath[strlen(strDestPath)   -   1]       =       '\0 ';      

        HResult   =   FindFirstFile(strDestPath,   &FindFileData);      

        if(HResult   ==   INVALID_HANDLE_VALUE)        
CreateDirectory(strDestPath       ,NULL);      

        StrCpy(strSrcFileName,strSrcPath);      
        StrCat(strSrcFileName, "\\* ");      

        HResult   =   FindFirstFile(strSrcFileName,&FindFileData);      
        if(HResult   ==   INVALID_HANDLE_VALUE)          
return   FALSE;        

        if(StrCmp(FindFileData.cFileName,   _T( ". "))  
                &&   StrCmp(FindFileData.cFileName,_T( ".. ")))      
        {      
StrCpy(strSrcFileName,strSrcPath);      
StrCat(strSrcFileName, "\\ ");      
StrCat(strSrcFileName,FindFileData.cFileName);      
StrCpy(strDestFileName,strDestPath);      
StrCat(strDestFileName, "\\ ");      
StrCat(strDestFileName,FindFileData.cFileName);      

if(FindFileData.dwFileAttributes  
                          &   FILE_ATTRIBUTE_DIRECTORY   ==   FILE_ATTRIBUTE_DIRECTORY)          
CopyDirectory(strSrcFileName,strDestFileName);        
else          
CopyFile(strSrcFileName,strDestFileName,FALSE);          
        }      
        while(1)      
        {      
blResult   =   FindNextFile(HResult,&FindFileData);      
if(!blResult)      
        break;      

if(StrCmp(FindFileData.cFileName,_T( ". "))
                            &&StrCmp(FindFileData.cFileName,_T( ".. ")))              
                  {      
        StrCpy(strSrcFileName,strSrcPath);      
        StrCat(strSrcFileName, "\\ ");      
        StrCat(strSrcFileName,FindFileData.cFileName);      
        StrCpy(strDestFileName,strDestPath);      
        StrCat(strDestFileName, "\\ ");      
        StrCat(strDestFileName,FindFileData.cFileName);      

        DWORD   wFlag   =   FindFileData.dwFileAttributes  
                                                          &   FILE_ATTRIBUTE_DIRECTORY;
        if(wFlag   ==   FILE_ATTRIBUTE_DIRECTORY)                   CopyDirectory(strSrcFileName,strDestFileName);          
        else            
                CopyFile(strSrcFileName,strDestFileName,FALSE);        
}      
          }      
          return   TRUE;      
}

------解决方案--------------------
我在另外一篇回答你了,你没有调用FindClose,这样就把你的hResult leak了,直接导致目录被锁死。

用完Handle一定要关掉,这个Leak比Memory Leak还有危害。你的程序被调用到Shell(Explorer)的进程里面,用户最后无法进行目录操作,只能重启动,然后删除的时候又被你锁死。:) 倒是个保护方法。