Pure C++ 实现 Shell Context Menu Extention

| 分类 代码 

纯 C++ 实现的 Shell 上下文菜单扩展,既是一个小例子。也是一个很好的模板。

用 Visual C++ 建立一个空的 DLL 工程,加入附件中的两个文件,编译注册即可。

有关 Shell 扩展编程,这里有个详细的 CHM 文档: http://www.vckbase.com/tools/downtools.asp?id=105

附件下载:CxtMenu

////////////////////////////////////////////////////////////////////////////////////////////////////<br></br> // 文件: CxtMenu.h<br></br> // 更新: 2003.7.1<br></br> ////////////////////////////////////////////////////////////////////////////////////////////////////<br></br> <br></br> <br></br> <br></br> ////////////////////////////////////////////////////////////////////////////////////////////////////<br></br> // 编译预处理<br></br> #pragma once<br></br> #include <br></br> #include <br></br> <br></br> // 导出函数<br></br> #pragma comment(linker, "/EXPORT:DllRegisterServer=_DllRegisterServer@0,PRIVATE")<br></br> #pragma comment(linker, "/EXPORT:DllUnregisterServer=_DllUnregisterServer@0,PRIVATE")<br></br> #pragma comment(linker, "/EXPORT:DllGetClassObject=_DllGetClassObject@12,PRIVATE")<br></br> #pragma comment(linker, "/EXPORT:DllCanUnloadNow=_DllCanUnloadNow@0,PRIVATE")<br></br> ////////////////////////////////////////////////////////////////////////////////////////////////////<br></br> <br></br> <br></br> <br></br> ////////////////////////////////////////////////////////////////////////////////////////////////////<br></br> //  CCxtMenuFactory 类声明<br></br> class CCxtMenuFactory : public IClassFactory  <br></br> {<br></br> public:<br></br>   CCxtMenuFactory();<br></br>   ~CCxtMenuFactory();<br></br> <br></br>   // IUnknown<br></br>   ULONG WINAPI AddRef();<br></br>   ULONG WINAPI Release();<br></br>   HRESULT WINAPI QueryInterface(REFIID rIID, void ** ppvObject);<br></br> <br></br>   // IClassFactory<br></br>   HRESULT WINAPI CreateInstance(IUnknown * pUnknown, REFIID rIID, void ** ppvObject);<br></br>   HRESULT WINAPI LockServer(BOOL bLock);<br></br> <br></br> protected:<br></br>   // 引用计数器<br></br>   int m_iRefCount;<br></br> };<br></br> ////////////////////////////////////////////////////////////////////////////////////////////////////<br></br> <br></br> <br></br> <br></br> <br></br> ////////////////////////////////////////////////////////////////////////////////////////////////////<br></br> // <br></br> class CCxtMenu : public IShellExtInit, public IContextMenu<br></br> {<br></br> public:<br></br>   CCxtMenu();<br></br>   ~CCxtMenu();<br></br> <br></br>   // IUnknown 方法<br></br>   ULONG WINAPI AddRef();<br></br>   ULONG WINAPI Release();<br></br>   HRESULT WINAPI QueryInterface(REFIID rIID, void ** ppvObject);<br></br> <br></br>   // IShellExtMenuInit 方法<br></br>   HRESULT WINAPI Initialize(LPCITEMIDLIST pidlFolder, IDataObject * pDataObj, HKEY hProgID);<br></br> <br></br>   // IContextMenu 方法<br></br>   HRESULT WINAPI QueryContextMenu(HMENU hMenu, UINT indexMenu,<br></br>     UINT idCmdFirst, UINT idCmdLast,UINT uFlags);<br></br>   HRESULT WINAPI GetCommandString(UINT_PTR idCmd,UINT uFlags,<br></br>     UINT * pwReserved, LPSTR pszName, UINT cchMax);<br></br>   HRESULT WINAPI InvokeCommand(LPCMINVOKECOMMANDINFO pCmdInfo);<br></br> <br></br> protected:<br></br>   // 引用计数器<br></br>   int m_iRefCount;<br></br>   char m_szFileName[MAX_PATH];<br></br> <br></br> };<br></br> ////////////////////////////////////////////////////////////////////////////////////////////////////<br></br> 

上一篇     下一篇