Lately, I had to implement ICopyHook
extension for my project. But, I could not get it working like other normal extensions. I tried searching for sample source code on the web/CodeProject with no success. So, I had no choice but to dig down to get it working. And success was not too far away.
ICopyHook
handler is a shell extension that determines if a folder or a printer can be moved/copied/renamed or deleted. It works with folder only and not with individual files. ICopyHook
should only approve or deny the operation by returning the appropriate value.
ICopyHook
interface has one method, CopyCallback
, that we need to implement as per our liking. ICopyHook
is really not the name of the interface, it is defined as follows:
#ifdef UNICODE#define ICopyHook ICopyHookW#else#define ICopyHook ICopyHookA#endif
CopyCallback
method in ICopyHookA
is defined as:
STDMETHOD_(UINT,CopyCallback) (THIS_ HWND hwnd, UINT wFunc, UINT wFlags,LPCSTR pszSrcFile, DWORD dwSrcAttribs,LPCSTR pszDestFile, DWORD dwDestAttribs) PURE;
and CopyCallback
method in ICopyHookW
is defined as:
STDMETHOD_(UINT,CopyCallback) (THIS_ HWND hwnd, UINT wFunc, UINT wFlags,LPCWSTR pszSrcFile, DWORD dwSrcAttribs,LPCWSTR pszDestFile, DWORD dwDestAttribs) PURE;
So you see, you need to implement the right CopyCallback
method for your type of compilation, i.e., for UNICODE or non-UNICODE.
CopyHook
. MyHook
). In the Properties, select Threading Model as 'Apartment
', and interface as 'Dual
'. ICopyHook
in the list of derivations of the class. class ATL_NO_VTABLE CMyHook : public ComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CMyHook, &CLSID_MyHook>, public ICopyHook, // ICopyHook interface. public IDispatchImpl<IMyHook, &IID_IMyHook, &LIBID_COPYHOOKLib>
BEGIN_COM_MAP(CMyHook) COM_INTERFACE_ENTRY(IMyHook) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY_IID(IID_IShellCopyHook , CMyHook) END_COM_MAP()
CopyCallBack
method to the class and implement it. My implementation of the CopyCallBack
is just to popup dialog. These are the two places where we need to put our entries.
HKEY_CLASSES_ROOT\Directory\ShellEx\CopyHookHandlers
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved
You can find these entries in MyHook.rgs file too in the sample project.
CopyCallBack
, and ANSI version has been implemented but commented. ICopyHook
, refer to MSDN. 联系客服