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)的进程里面,用户最后无法进行目录操作,只能重启动,然后删除的时候又被你锁死。:) 倒是个保护方法。
在实现了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)的进程里面,用户最后无法进行目录操作,只能重启动,然后删除的时候又被你锁死。:) 倒是个保护方法。