Creating Icon Overlay Handlers

创建图标标记 Handlers (续)

1、新建一个ATL Project。

2、建议将 Project Property 中 Linker – General - “Register Output” 设为 no,C/C++ - “Code Generation” - “Runtime Library” 设为 /MTd。

3、在 Solution Explorer 中右键 Add Class,选择 ATL Simple Object。并在弹出的对话框中为该 Class 命名。

4、添加完成后建议 Build 一下 Project,MIDL compiler 将根据 .idl 文件生成 IIDs and CLSIDs。

5、切换到新增 Class 的 .h 文件中,使其继承接口 IShellIconOverlayIdentifier。

 1 // MyOverlay.h : Declaration of the CMyOverlay
 2
 3 #pragma once
 4 #include "resource.h"       // main symbols
 5
 6
 7
 8 #include "Example_i.h"
 9 #include <ShlObj.h>
10
11
12
13 #if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
14 #error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object‘s and allow use of it‘s single-threaded COM object implementations. The threading model in your rgs file was set to ‘Free‘ as that is the only threading model supported in non DCOM Windows CE platforms."
15 #endif
16
17 using namespace ATL;
18
19
20 // CMyOverlay
21
22 class ATL_NO_VTABLE CMyOverlay :
23     public CComObjectRootEx<CComSingleThreadModel>,
24     public CComCoClass<CMyOverlay, &CLSID_MyOverlay>,
25     public IDispatchImpl<IMyOverlay, &IID_IMyOverlay, &LIBID_ExampleLib,
26     /*wMajor =*/ 1, /*wMinor =*/ 0>,
27     public IShellIconOverlayIdentifier
28 {
29 public:
30     CMyOverlay()
31     {
32     }
33
34 DECLARE_REGISTRY_RESOURCEID(IDR_MYOVERLAY)
35
36
37 BEGIN_COM_MAP(CMyOverlay)
38     COM_INTERFACE_ENTRY(IMyOverlay)
39     COM_INTERFACE_ENTRY(IDispatch)
40     COM_INTERFACE_ENTRY(IShellIconOverlayIdentifier)
41 END_COM_MAP()
42
43
44
45     DECLARE_PROTECT_FINAL_CONSTRUCT()
46
47     STDMETHOD(IsMemberOf)(THIS_ _In_ PCWSTR pwszPath, DWORD dwAttrib);
48     STDMETHOD(GetOverlayInfo)(THIS_ _Out_writes_(cchMax) PWSTR pwszIconFile,
49         int cchMax, _Out_ int * pIndex, _Out_ DWORD * pdwFlags);
50     STDMETHOD(GetPriority)(THIS_ _Out_ int * pIPriority);
51
52     HRESULT FinalConstruct()
53     {
54         return S_OK;
55     }
56
57     void FinalRelease()
58     {
59     }
60
61 public:
62
63
64
65 };
66
67 OBJECT_ENTRY_AUTO(__uuidof(MyOverlay), CMyOverlay)

MyOverlay.h

6、根据 MSDN 实现该 Class。

 1 // MyOverlay.cpp : Implementation of CMyOverlay
 2
 3 #include "stdafx.h"
 4 #include "MyOverlay.h"
 5 #include <WinBase.h>
 6 #pragma comment(lib, "Kernel32.lib")
 7
 8 // CMyOverlay
 9
10 STDMETHODIMP CMyOverlay::IsMemberOf(THIS_ _In_ PCWSTR pwszPath, DWORD dwAttrib)
11 {
12     if (_tcscmp(pwszPath, L"test") == 0)
13     {
14         return S_OK;
15     }
16     else
17     {
18         return S_FALSE;
19     }
20 }
21
22 STDMETHODIMP CMyOverlay::GetOverlayInfo(
23     THIS_ _Out_writes_(cchMax) PWSTR pwszIconFile,
24     int cchMax,
25     _Out_ int * pIndex,
26     _Out_ DWORD * pdwFlags)
27 {
28
29     GetModuleFileNameW(_AtlBaseModule.GetModuleInstance(), pwszIconFile, cchMax);
30
31     *pIndex = 0;
32
33     *pdwFlags = ISIOI_ICONFILE | ISIOI_ICONINDEX;
34
35     return S_OK;
36 }
37
38 STDMETHODIMP CMyOverlay::GetPriority(THIS_ _Out_ int * pIPriority)
39 {
40     *pIPriority = 0;
41
42     return S_OK;
43 }

MyOverlay.cpp

7、在 .rgs 文件中添加注册表信息,确保各 GUID 与 .idl 文件中的一致。

 1 HKCR
 2 {
 3     NoRemove CLSID
 4     {
 5         ForceRemove {29913677-1662-46C5-8645-16F84DA6F438} = s ‘MyOverlay Class‘
 6         {
 7             ForceRemove Programmable
 8             InprocServer32 = s ‘%MODULE%‘
 9             {
10                 val ThreadingModel = s ‘Apartment‘
11             }
12             TypeLib = s ‘{942F4DBB-4667-4767-A35B-52F32F623C63}‘
13             Version = s ‘1.0‘
14         }
15     }
16 }
17
18 HKLM
19 {
20     NoRemove SOFTWARE
21     {
22         NoRemove Microsoft
23         {
24             NoRemove Windows
25             {
26                 NoRemove CurrentVersion
27                 {
28                     NoRemove Explorer
29                     {
30                         NoRemove ShellIconOverlayIdentifiers
31                         {
32                             ForceRemove ‘  MyOverlay‘ = s ‘{29913677-1662-46C5-8645-16F84DA6F438}‘
33                             {
34                             }
35                         }
36                     }
37                 }
38             }
39         }
40     }
41 }

8、Build Project 后通过 cmd.exe 注册或解注册生成的 .dll 文件。重启 explorer.exe 后生效。

9、由于 slots 数量有限,检查在注册表中添加的子项是否在有效范围内(目前为前15个)。可采用在子项名称前添加空格的方式将其位置提前。

10、查看效果如下图所示。

参考网址:http://www.codeproject.com/Articles/7484/How-to-overlay-an-icon-over-existing-shell-objects

—————————————————————————————————————

本文为本人原创,如需转载请注明出处。

时间: 2024-08-10 17:19:58

Creating Icon Overlay Handlers的相关文章

[翻译].NET Shell Extensions - Shell Context Menus---.net 外壳扩展之右键菜单

我自己的前言说明: 本文原作者为Dave Kerr,原文链接为.NET Shell Extensions - Shell Context Menus,我是在为了完成最新需求的时候查询资料的时候发现的,因为太久没有看外文资料了,所以为了锻炼一下翻译的,文中有一句未能翻译出来. Download SharpShell source code - 1.8 MB   Download SharpShell Tools - 181.1 KB  Download SharpShell core librar

qt application logging

“AnalysisPtsDataTool201905.exe”(Win32): 已加载“F:\OpencvProject\ZY-Project\x64\Debug\AnalysisPtsDataTool201905.exe”.已加载符号.“AnalysisPtsDataTool201905.exe”(Win32): 已加载“C:\Windows\System32\ntdll.dll”.无法查找或打开 PDB 文件.“AnalysisPtsDataTool201905.exe”(Win32): 已

Ehcache(2.9.x) - API Developer Guide, Cache Exception Handlers

About Exception Handlers By default, most cache operations will propagate a runtime CacheException on failure. An interceptor, using a dynamic proxy, may be configured so that a CacheExceptionHandler can be configured to intercept Exceptions. Errors

[No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图

行结束符和空白选项 在项目的生命周期中,有时可能会将行结束符由 CRLF 改为 LF,或者修改一段代码的缩进.不幸的是这样将会使大量的代码行被标记为已修改,尽管代码本身并没有被修改.这里列出的选项将会在比较差异 和应用补丁时帮助你应对这些修改.你将会在合并和追溯对话框中看到这些设置,它们同样也出现在TortoiseMerge 的设置中. 忽略行结束符 排除仅行结束符的差异. 比较空白 将所有缩进和行内空白差异视为增加/删除的行. 忽略空白修改 排除那些完全是针对空白数量或类型的修改,例如,修改缩

多分辨率适配

Supporting Different Screens 上一课下一课 This lesson teaches you to Create Different Layouts Create Different Bitmaps You should also read Designing for Multiple Screens Providing Resources Iconography design guide Android categorizes device screens using

初识CEF

介绍 CEF全称Chromium Embedded Framework,是一个基于Google Chromium 的开源项目.Google Chromium项目主要是为Google Chrome应用开发的,而CEF的目标则是为第三方应用提供可嵌入浏览器支持.CEF隔离底层Chromium和Blink的复杂代码,并提供一套产品级稳定的API,发布跟踪具体Chromium版本的分支,以及二进制包.CEF的大部分特性都提供了丰富的默认实现,让使用者做尽量少的定制即可满足需求.在本文发布的时候,世界上已

Git Manual / Git使用手册 / Git, GitLab, Git Bash, TortoiseGit

Git使用手册 目录 1     引言 2     Git.GitLab简介 2.1      Git 2.2      GitLab 2.3      Git基本概念 3     运行环境 4     基本操作 4.1      安装Git 4.2      使用GitLab服务器上的帐号 4.2.1      常见页面 4.2.2      设置头像 4.2.3      设置SSH Keys 4.2.4      新建项目 4.2.5      合并请求 4.3      使用Git Ba

在 Server 2008 企业版下, 安装 IIS 7 后,勾选好 请求筛选模块了。安装完毕后,&quot;请求筛选&quot;却不显示!

下载并安装 Administration Pack 到你的Windows Server 2008 上.可以通过下面的链接来下载Administration Pack. https://www.iis.net/downloads/microsoft/administration-pack https://www.iis.net/downloads/microsoft/administration-pack Overview The IIS 7.0 Administration Pack adds

API翻译 --- Supporting Different Devices 支持不同的设备

DEPENDENCIES AND PREREQUISITES  依赖和先决条件 Android 1.6 or higher YOU SHOULD ALSO READ Application Resources  应用资源 Designing for Multiple Screens 设计多屏幕 Android devices come in many shapes and sizes all around the world. With a wide range of device types,