ICopyHook 实现






3.26/5 (21投票s)
实现 ICopyHook Windows 扩展
引言
最近,我需要为我的项目实现 ICopyHook
扩展。但是,我无法像其他正常扩展一样使其工作。我在网上/CodeProject 搜索示例源代码,但没有找到。所以,我别无选择,只能深入研究以使其工作。成功也很快就到来了。
ICopyHook 接口简介
ICopyHook
处理程序是一个 shell 扩展,用于确定是否可以移动/复制/重命名或删除文件夹或打印机。它仅适用于文件夹,不适用于单个文件。ICopyHook
应该只通过返回适当的值来批准或拒绝操作。
ICopyHook
接口有一个方法,CopyCallback
,我们需要根据自己的喜好来实现它。实际上,ICopyHook
不是接口的名称,它是这样定义的
#ifdef UNICODE
#define ICopyHook ICopyHookW
#else
#define ICopyHook ICopyHookA
#endif
CopyCallback
方法在 ICopyHookA
中定义如下:
STDMETHOD_(UINT,CopyCallback) (THIS_ HWND hwnd, UINT wFunc, UINT wFlags,
LPCSTR pszSrcFile, DWORD dwSrcAttribs,
LPCSTR pszDestFile, DWORD dwDestAttribs) PURE;
而 CopyCallback
方法在 ICopyHookW
中定义如下:
STDMETHOD_(UINT,CopyCallback) (THIS_ HWND hwnd, UINT wFunc, UINT wFlags,
LPCWSTR pszSrcFile, DWORD dwSrcAttribs,
LPCWSTR pszDestFile, DWORD dwDestAttribs) PURE;
因此,您需要为您的编译类型(即,UNICODE 或非 UNICODE)实现正确的 CopyCallback
方法。
实现 ICopyHook
- 创建一个 ATL DLL 项目。我将其命名为
CopyHook
。 - 从“插入”菜单添加一个新的 ATL 对象。
- 在类别中,选择“对象”,并在对象列表中选择“简单对象”。
- 给出一个名称(我将其命名为
MyHook
)。在“属性”中,将线程模型选择为“Apartment
”,将接口选择为“Dual
”。 - 将
ICopyHook
添加到类的派生列表中。class ATL_NO_VTABLE CMyHook : public ComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CMyHook, &CLSID_MyHook>, public ICopyHook, // ICopyHook interface. public IDispatchImpl<IMyHook, &IID_IMyHook, &LIBID_COPYHOOKLib>
- 将以下内容添加到 COM 映射中
BEGIN_COM_MAP(CMyHook) COM_INTERFACE_ENTRY(IMyHook) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY_IID(IID_IShellCopyHook , CMyHook) END_COM_MAP()
- 将适当的
CopyCallBack
方法添加到类并实现它。我对CopyCallBack
的实现只是弹出一个对话框。 - 当然,包含 shlobj.h。
注册
这是我们需要放置条目的地方。
HKEY_CLASSES_ROOT\Directory\ShellEx\CopyHookHandlers
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved
您也可以在示例项目的 MyHook.rgs 文件中找到这些条目。
作者说明
- 我已在 Win2K Prof 和 VC6 下进行了测试,不了解其他操作系统,但其他 Visual Studio 版本应该没有问题。
- 在示例中,我实现了
CopyCallBack
的 Unicode 版本,并实现了 ANSI 版本但已注释掉。 - 有关
ICopyHook
的更多帮助,请参阅 MSDN。