- 创建ATL项目
2.创建ATL简单对象
就会生产文件: MyShellExt.h
3. 查找lib的uuid
在文件dllmain.h中查找:
41eb5b41-952a-4209-a9ee-ec782e1c6e5b
- 查找对象UUID
查找方式***_i.h文件末尾, #ifdef __cpluscplus下方就是,得到的是:
50c05e80-a560-4732-8909-599a41f1e5ab
- 增加注册表
在文件MyShellExt.rgs增加如下信息:里面的uuid是上面提到的两个uuid
HKCR
{
NoRemove *
{
NoRemove ShellEx
{
NoRemove ContextMenuHandlers
{
ForceRemove MyShellExt = s '{50c05e80-a560-4732-8909-599a41f1e5ab}'
}
}
}
NoRemove lnkfile
{
NoRemove shellex
{
NoRemove ContextMenuHandlers
{
ForceRemove MyShellExt = s '{50c05e80-a560-4732-8909-599a41f1e5ab}'
}
}
}
NoRemove Directory
{
NoRemove Background
{
NoRemove ShellEx
{
NoRemove ContextMenuHandlers
{
ForceRemove MyShellExt = s '{50c05e80-a560-4732-8909-599a41f1e5ab}'
}
}
}
}
NoRemove CLSID
{
ForceRemove {50c05e80-a560-4732-8909-599a41f1e5ab} = s 'SudaMenu class'
{
ForceRemove Programmable
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
TypeLib = s '{41eb5b41-952a-4209-a9ee-ec782e1c6e5b}'
Version = s '1.0'
}
}
}
HKLM
{
NoRemove SOFTWARE
{
NoRemove Microsoft
{
NoRemove Windows
{
NoRemove CurrentVersion
{
NoRemove 'Shell Extensions'
{
NoRemove Approved
{
val {50c05e80-a560-4732-8909-599a41f1e5ab} = s '自定义鼠标右键 Shell Extension'
}
}
}
}
}
}
}
- 实现接口
public IContextMenu,
public IShellExtInit
- 代码如下:
- // MyShellExt.h: CMyShellExt 的声明
- #pragma once
- #include "resource.h" // 主符号
- #include "MyOsRightMenu_i.h"
- #if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
- #error "Windows CE 平台(如不提供完全 DCOM 支持的 Windows Mobile 平台)上无法正确支持单线程 COM 对象。定义 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制 ATL 支持创建单线程 COM 对象实现并允许使用其单线程 COM 对象实现。rgs 文件中的线程模型已被设置为“Free”,原因是该模型是非 DCOM Windows CE 平台支持的唯一线程模型。"
- #endif
- using namespace ATL;
- // CMyShellExt
- class ATL_NO_VTABLE CMyShellExt :
- public CComObjectRootEx<CComSingleThreadModel>,
- public CComCoClass<CMyShellExt, &CLSID_MyShellExt>,
- public IDispatchImpl<IMyShellExt, &IID_IMyShellExt, &LIBID_MyOsRightMenuLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
- public IContextMenu,
- public IShellExtInit
- {
- public:
- CMyShellExt()
- {
- }
- DECLARE_REGISTRY_RESOURCEID(106)
- BEGIN_COM_MAP(CMyShellExt)
- COM_INTERFACE_ENTRY(IMyShellExt)
- COM_INTERFACE_ENTRY(IDispatch)
- COM_INTERFACE_ENTRY(IContextMenu) // QueryContextMenu / InvokeCommand / GetCommandString
- COM_INTERFACE_ENTRY(IShellExtInit) // Initialize
- END_COM_MAP()
- DECLARE_PROTECT_FINAL_CONSTRUCT()
- HRESULT FinalConstruct()
- {
- return S_OK;
- }
- void FinalRelease()
- {
- }
- public:
- STDMETHODIMP QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
- {
- //MessageBox(NULL, L"123", L"456", MB_OK);
- AddCommand(hmenu, idCmdFirst, indexMenu, L"你好世界", NULL);
- return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 1);
- }
- STDMETHODIMP InvokeCommand(CMINVOKECOMMANDINFO* pici)
- {
- return E_INVALIDARG;
- }
- STDMETHODIMP GetCommandString(UINT_PTR idCmd, UINT uType, UINT* pReserved, LPSTR pszName, UINT cchMax)
- {
- return S_OK;
- }
- STDMETHODIMP Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject* pdtobj, HKEY hkeyProgID)
- {
- if (pidlFolder && !pidlFolder->mkid.cb)
- {
- //桌面
- }
- else if (pdtobj)
- InitializeShortCut(pdtobj);
- return S_OK;
- }
- private:
- private:
- HRESULT InitializeShortCut(IDataObject* pdtobj)
- {
- if (pdtobj == NULL)
- return E_INVALIDARG;
- FORMATETC fe = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
- STGMEDIUM stm;
- if (FAILED(pdtobj->GetData(&fe, &stm)))
- return E_INVALIDARG;
- HDROP hDrop = (HDROP)GlobalLock(stm.hGlobal);
- if (NULL == hDrop)
- {
- ReleaseStgMedium(&stm);
- return E_INVALIDARG;
- }
- UINT nFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
- if (nFiles != 1)
- {
- GlobalUnlock(stm.hGlobal);
- ReleaseStgMedium(&stm);
- return E_INVALIDARG;
- }
- WCHAR szFileBuf[0x1000];
- for (int i = 0; i < nFiles; i++)
- {
- if (DragQueryFile((HDROP)hDrop, 0, szFileBuf, _countof(szFileBuf)) != 0)
- {
- }
- }
- GlobalUnlock(stm.hGlobal);
- ReleaseStgMedium(&stm);
- return S_OK;
- }
- BOOL AddCommand(HMENU hPopupMenu, int nCommandId, int nPosition, LPCTSTR lpszDes, HBITMAP bmpItem)
- {
- MENUITEMINFOW info;
- info.dwTypeData = (LPTSTR)lpszDes;
- info.fMask = MIIM_STRING | MIIM_ID/* | MIIM_CHECKMARKS*/;
- info.wID = nCommandId;
- info.hbmpChecked = bmpItem;
- info.hbmpUnchecked = bmpItem;
- return InsertMenuItem(hPopupMenu, nPosition, TRUE, &info);
- }
- };
- OBJECT_ENTRY_AUTO(__uuidof(MyShellExt), CMyShellExt)