RSS
热门关键字:
当前位置 : 主页>编程开发>VC/Visual C++>列表

用拷贝钩子实现对文件夹的监控

来源:我要研发网 作者:52rd.info 时间:2008-03-03 点击:



ICopyHook是一个用于创建拷贝钩子处理程序COM接口,它决定一个文件夹或者打印机对象是否可以被移动,拷贝,重命名或删除。Shell在执行这些操作之前,会调用ICopyHook接口的CopyCallback方法对它们进行验证。CopyCallback返回一个int值指示Shell是否应该继续执行这个操作。返回值IDYES表示继续,而返回值IDNO和IDCANCEL则表示终止。

字串2

一个文件夹对象可以安装多个拷贝钩子处理程序。如果出现这种情况,Shell会依次调用每个处理程序。只有当每个处理程序都返回IDYES时,Shell才真正执行用户请求的操作。

字串7

拷贝钩子处理程序的作用是在上述四种操作执行前对它们进行验证,但是Shell并不会把操作的结果通知给拷贝钩子处理程序。而windows提供的API函数FindFirstChangeNotification和FindNextChangeNotification却可以实现这个功能。因此,只有把这种两种方法结合起来,才能对一个文件夹的状态进行完全的监控。

字串4

拷贝钩子处理程序实现并不困难,首先创建一个作为进程内组件的COM对象,它只需要暴露一个ICopyHook接口(当然还有IUnknown)。然后用regsrv32.exe注册这个COM组件。最后一步是向Shell注册你的这个拷贝钩子处理程序,方法是在注册表HKEY_CLASSES_ROOT\Directory\Shellex\CopyHookHandlers下创建一个名称任意的sub key,在此sub key中创建一个类型为REG_SZ的项并将你的COM对象的CLSID作为它的默认值就可以了。 字串2

下面就是一个拷贝钩子的实现程序

字串5

字串2

// CCopyHook.h 字串4

//CCopyHook类实现了ICopyHook接口,CClassFactory实现了IClassFactory接口

字串7

#include 字串6

class CCopyHook: public ICopyHook 字串1

{

字串6

public: 字串1

CCopyHook():m_refcnt(0) { } 字串5

STDMETHODIMP QueryInterface(REFIID iid,void** ppvObject); 字串5

STDMETHODIMP_(ULONG) AddRef(); 字串7

STDMETHODIMP_(ULONG) Release();

字串6

STDMETHODIMP_(UINT) CopyCallback(HWND hwnd,UINT wFunc,UINT wFlags, 字串2

LPCTSTR pszSrcFile,DWORD dwSrcAttribs, 字串3

LPCTSTR pszDestFile,DWORD dwDestAttribs);

字串6

private:

字串5

int m_refcnt;

字串4

};

字串7

class CClassFactory:public IClassFactory

字串7

{

字串9

public:

字串6

CClassFactory():m_refcnt(0) { } 字串8

STDMETHODIMP QueryInterface(REFIID iid,void** ppvObject); 字串3

STDMETHODIMP_(ULONG) AddRef(); 字串7

STDMETHODIMP_(ULONG) Release(); 字串7

STDMETHODIMP CreateInstance(IUnknown * pUnkOuter,REFIID riid,void ** ppvObject); 字串3

STDMETHODIMP LockServer(BOOL fLock);

字串2

private:

字串8

int m_refcnt; 字串6

};

字串6

字串5

// CCopyHook.cpp 字串5

//CCopyHook对象和CClassFactory对象的实现文件 字串9

#include 字串6

#include "CCopyHook.h"

字串6

字串8

extern LONG nLocks; //对象计数,用于DllCanUnloadNow 字串8

字串9

ULONG __stdcall CCopyHook::AddRef(){

字串2

if(m_refcnt==0) 字串7

nLocks ; 字串3

m_refcnt ; 字串2

return m_refcnt;

字串9

} 字串8

ULONG __stdcall CCopyHook::Release(){

字串8

int nNewCnt=--m_refcnt; 字串5

if(nNewCnt<=0){

字串9

nLocks--; 字串2

delete this; 字串1

} 字串5

return nNewCnt;

字串9

} 字串3

HRESULT __stdcall CCopyHook::QueryInterface(REFIID iid,void** ppvObject){

字串5

if(iid==IID_IUnknown) 字串6

*ppvObject=static_cast(this); 字串2

else

字串1

if(iid==IID_IShellCopyHook)

字串6

*ppvObject=static_cast(this); 字串4

else 字串4

return E_NOINTERFACE;

字串5

reinterpret_cast(*ppvObject)->AddRef(); 字串9

return S_OK; 字串2

}

字串8

//这就是CopyCallback方法,拷贝钩子的所有功能由它实现。参数的具体值参看MSDN

字串4

UINT __stdcall CCopyHook::CopyCallback(HWND hwnd,UINT wFunc,UINT wFlags,

字串4

LPCTSTR pszSrcFile,DWORD dwSrcAttribs,

字串1

LPCTSTR pszDestFile,DWORD dwDestAttribs){

字串7

char szMessage[MAX_PATH 14];

字串6

sprintf(szMessage,"对%s进行的操作,是否继续?",pszSrcFile); 字串3

return MessageBox(NULL,szMessage,"确认",MB_YESNO|MB_ICONEXCLAMATION);

字串9

}

字串2

ULONG __stdcall CClassFactory::AddRef(){

字串5

if(m_refcnt==0)

字串5

nLocks ; 字串1

m_refcnt ;

字串7

return m_refcnt; 字串4

}

字串8

ULONG __stdcall CClassFactory::Release(){ 字串5

int nNewCnt=--m_refcnt; 字串8

if(nNewCnt<=0){

字串1

nLocks--;

字串8

delete this; 字串4

} 字串3

return nNewCnt; 字串2

} 字串7

HRESULT __stdcall CClassFactory::QueryInterface(REFIID iid,void** ppvObject){ 字串9

if(iid==IID_IUnknown)

字串9

*ppvObject=static_cast

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
相关文章