65.9K
CodeProject 正在变化。 阅读更多。
Home

ICopyHook 实现

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.26/5 (21投票s)

2004年6月5日

CPOL

2分钟阅读

viewsIcon

165669

downloadIcon

2079

实现 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

  1. 创建一个 ATL DLL 项目。我将其命名为 CopyHook
  2. 从“插入”菜单添加一个新的 ATL 对象。
  3. 在类别中,选择“对象”,并在对象列表中选择“简单对象”。
  4. 给出一个名称(我将其命名为 MyHook)。在“属性”中,将线程模型选择为“Apartment”,将接口选择为“Dual”。
  5. 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>
  6. 将以下内容添加到 COM 映射中
    BEGIN_COM_MAP(CMyHook)
      COM_INTERFACE_ENTRY(IMyHook)
      COM_INTERFACE_ENTRY(IDispatch)
      COM_INTERFACE_ENTRY_IID(IID_IShellCopyHook , CMyHook)
    END_COM_MAP()
  7. 将适当的 CopyCallBack 方法添加到类并实现它。我对 CopyCallBack 的实现只是弹出一个对话框。
  8. 当然,包含 shlobj.h

注册

这是我们需要放置条目的地方。

  1. HKEY_CLASSES_ROOT\Directory\ShellEx\CopyHookHandlers
  2. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved

您也可以在示例项目的 MyHook.rgs 文件中找到这些条目。

作者说明

  1. 我已在 Win2K Prof 和 VC6 下进行了测试,不了解其他操作系统,但其他 Visual Studio 版本应该没有问题。
  2. 在示例中,我实现了 CopyCallBack 的 Unicode 版本,并实现了 ANSI 版本但已注释掉。
  3. 有关 ICopyHook 的更多帮助,请参阅 MSDN。
© . All rights reserved.