在Windows操作系统中,Shell扩展是一种允许开发者为文件和文件夹添加自定义属性页和上下文菜单项的技术。本文将介绍如何创建这些扩展,并提供必要的安装和使用指南。
要安装Shell扩展向导,首先需要下载名为shellext_dll.zip
的压缩包。下载完成后,将文件解压到'C:\Program Files\MicrosoftVisual Studio\Common\MSDev98\Template\ATL'
目录下。然后,使用regsvr32.exe
注册atlshlex.dll
。注册完成后,Shell扩展组件应该可以从ATL对象向导中获取。
安装完成后,Shell扩展组件将出现在ATL对象向导中。这些组件被分组在一起,因为它们在对象创建表单中使用相同的页面。这个额外的页面是通过ATL对象向导中的属性页组件创建的,该组件也可以从本网站获取。该页面允许选择Shell扩展对象是应用于文件夹还是文件,以及在多选文件/文件夹时是否可用。还有一个选项是Shell扩展对象是否适用于所有文件(*)还是特定文件类型。如果需要,开发者需要添加额外的文件类型。
在开发Shell扩展时,需要熟悉一些关键的接口,如IShellExt
、IShellPropSheetExt
和IContextMenu
。这些接口的详细信息可以在MSDN上找到。此外,还有一篇名为"Q223439 - HOWTO: Using Class Wrappers to Access Windows Common Controls inATL"的文章,提供了如何使用类包装器访问Windows公共控件的指导。
尽管代码已经在Unicode格式下进行了测试,但作者决定不使用Unicode,因为希望向导在VC6下运行,无论它们是在NT还是Win9x下运行。此外,作者使用了STL来提供额外的功能,如映射和列表等。但是,当在'Warning Level 4'下编译时,这段代码会产生已知的警告。
以下是一个简单的代码示例,展示了如何创建一个简单的Shell扩展对象。
#include <atlbase.h>
#include <atlcomcli.h>
// 定义COM对象的类
class CMyShellExt : public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMyShellExt, &CLSID_MyShellExt>,
public IShellExt
{
public:
// 实现IShellExt接口的方法
STDMETHODIMP Initialize(LPCITEMIDLIST pidlFolder, LPDATAOBJECT pdtobj, HKEY hkeyProgID);
STDMETHODIMP AddToFolder(IShellFolder* psf, HWND hwnd, IDataObject* pdtobj);
STDMETHODIMP ParseDisplayName(IShellFolder* psf, HWND hwnd, LPBC pbc, LPOLESTR lpszDisplayName, ULONG* pchEaten, LPITEMIDLIST* ppidl, ULONG* pdwAttributes);
STDMETHODIMP GetUIObjectOf(HWND hwndOwner, IShellFolder* psf, IDataObject* pdtobj, REFIID riid, UINT* prgfInOut, void** ppv);
STDMETHODIMP GetDisplayNameOf(IShellFolder* psf, LPCITEMIDLIST pidl, DWORD uFlags, STRRET* lpName);
STDMETHODIMP SetNameOf(HWND hwnd, IShellFolder* psf, LPCITEMIDLIST pidl, LPCOLESTR lpName, DWORD uFlags, LPITEMIDLIST* ppidlOut);
};