| 发表于:2007-06-22 11:17:557楼 得分:0 |
我实现icopyhook,并且回调函数copycallback被调用了.但出现新的问题了.当我删除某个folder的时候,我在回调函数返回之前想拷贝要删除的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; } | | |
|