{"id":93670,"date":"2026-08-13T00:48:57","date_gmt":"2026-08-12T16:48:57","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/93670.html"},"modified":"2026-08-13T00:48:57","modified_gmt":"2026-08-12T16:48:57","slug":"windows-%e5%a4%9a%e7%ba%a7%e5%8f%b3%e9%94%ae%e8%8f%9c%e5%8d%95%e6%96%b0%e7%89%88%e8%8f%9c%e5%8d%95iexplorercommand%e5%92%8c%e6%97%a7%e7%89%88%e8%8f%9c%e5%8d%95icontextmenu","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/93670.html","title":{"rendered":"windows \u591a\u7ea7\u53f3\u952e\u83dc\u5355(\u65b0\u7248\u83dc\u5355IExplorerCommand\u548c\u65e7\u7248\u83dc\u5355IContextMenu)"},"content":{"rendered":"<p id=\"main-toc\">\u76ee\u5f55<\/p>\n<p id=\"IContextMenu%E5%A4%9A%E7%BA%A7%E5%8F%B3%E9%94%AE%E8%8F%9C%E5%8D%95-toc\" style=\"margin-left:0px\">IContextMenu\u591a\u7ea7\u53f3\u952e\u83dc\u5355<\/p>\n<p id=\"%E7%AE%80%E8%BF%B0-toc\" style=\"margin-left:40px\">\u7b80\u8ff0<\/p>\n<p id=\"%E7%BB%93%E6%9E%84-toc\" style=\"margin-left:40px\">\u7ed3\u6784<\/p>\n<p id=\"%E6%A1%88%E4%BE%8B-toc\" style=\"margin-left:40px\">\u6848\u4f8b<\/p>\n<p id=\"IExplorerCommand%E5%A4%9A%E7%BA%A7%E8%8F%9C%E5%8D%95-toc\" style=\"margin-left:0px\">IExplorerCommand\u591a\u7ea7\u83dc\u5355<\/p>\n<p id=\"%E7%AE%80%E8%BF%B0-toc\" style=\"margin-left:40px\">\u7b80\u8ff0<\/p>\n<p id=\"%E7%BB%93%E6%9E%84-toc\" style=\"margin-left:40px\">\u7ed3\u6784<\/p>\n<p id=\"%E6%96%B9%E6%B3%95%E5%87%BD%E6%95%B0%E8%AF%A6%E8%A7%A3-toc\" style=\"margin-left:40px\">\u65b9\u6cd5\u51fd\u6570\u8be6\u89e3<\/p>\n<p id=\"%E6%96%B9%E6%B3%95%E5%87%BD%E6%95%B0-toc\" style=\"margin-left:80px\">\u65b9\u6cd5\u51fd\u6570<\/p>\n<p id=\"%E6%96%B9%E6%B3%95%E8%AF%A6%E8%A7%A3-toc\" style=\"margin-left:80px\">\u65b9\u6cd5\u8be6\u89e3<\/p>\n<p id=\"%E5%B8%B8%E7%94%A8%E6%96%B9%E6%B3%95%E6%A1%88%E4%BE%8B%EF%BC%88%E4%BE%BF%E4%BA%8E%E7%9B%B4%E6%8E%A5%E5%A4%8D%E5%88%B6%E4%BD%BF%E7%94%A8%EF%BC%89-toc\" style=\"margin-left:80px\">\u5e38\u7528\u65b9\u6cd5\u6848\u4f8b&#xff08;\u4fbf\u4e8e\u76f4\u63a5\u590d\u5236\u4f7f\u7528&#xff09;<\/p>\n<p id=\"%E6%A1%88%E4%BE%8B-toc\" style=\"margin-left:40px\">\u6848\u4f8b<\/p>\n<p id=\"%E6%96%87%E4%BB%B6%E7%BB%93%E6%9E%84-toc\" style=\"margin-left:80px\">\u6587\u4ef6\u7ed3\u6784<\/p>\n<p id=\"IExCmdMainMenus.h-toc\" style=\"margin-left:80px\">IExCmdMainMenus.h<\/p>\n<p id=\"IExCmdSubMenus.h-toc\" style=\"margin-left:80px\">IExCmdSubMenus.h<\/p>\n<p id=\"IExCmdSubMenus.cpp-toc\" style=\"margin-left:80px\">IExCmdSubMenus.cpp<\/p>\n<hr id=\"hr-toc\" \/>\n<\/p>\n<h2 id=\"IContextMenu%E5%A4%9A%E7%BA%A7%E5%8F%B3%E9%94%AE%E8%8F%9C%E5%8D%95\">IContextMenu\u591a\u7ea7\u53f3\u952e\u83dc\u5355<\/h2>\n<\/p>\n<h3 id=\"%E7%AE%80%E8%BF%B0\">\u7b80\u8ff0<\/h3>\n<p>IContextMenu&#xff08;\u65e7\u7248\u83dc\u5355&#xff09;\u7684\u53f3\u952e\u83dc\u5355\u4f9d\u8d56\u4e8eQueryContextMenu&#xff0c;\u901a\u5e38\u4f7f\u7528CreatePopupMenu()\u548cInsertMenuItem()\u6765\u6dfb\u52a0\u5b50\u83dc\u5355&#xff0c;\u4e4b\u540e\u901a\u8fc7InvokeCommand\u7684lpici\u7684\u9ad8\u4f4e\u4f4d\u6765\u7b5b\u9009\u54ea\u4e2a\u83dc\u5355\u7684\u54cd\u5e94\u6765\u54cd\u5e94\u83dc\u5355\u3002<\/p>\n<h3 id=\"%E7%BB%93%E6%9E%84\">\u7ed3\u6784<\/h3>\n<p>QueryContextMenu(HMENU,UINT,UINT,UINT,UINT);<br \/>\n                  |<br \/>\n            InsertMenuItem<br \/>\n      |<br \/>\nCreatePopupMenu<br \/>\n  |<br \/>\nInsertMenuItem<br \/>\nInsertMenuItem<br \/>\nInsertMenuItem<\/p>\n<p>InvokeCommand(LPCMINVOKECOMMANDINFO lpici)<br \/>\n||<br \/>\nHIWORD(lpici-&gt;lpVerb)LOWORD(lpici-&gt;lpVerb)<br \/>\n||<br \/>\n\u8c13\u8bcd\u5b57\u7b26\u4e32\u8c03\u7528                   \u901a\u8fc7\u547d\u4ee4ID\u8c03\u7528<br \/>\n||<br \/>\ncommandcommand<\/p>\n<h3 id=\"%E6%A1%88%E4%BE%8B\">\u6848\u4f8b<\/h3>\n<h4 id=\"QueryContextMenu\">QueryContextMenu<\/h4>\n<p>STDMETHODIMP_(HRESULT __stdcall) CDllRegEx::QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)<br \/>\n{<br \/>\n    bool bAllDll &#061; true;<br \/>\n    \/\/ \u904d\u5386\u786e\u8ba4\u6587\u4ef6\u662f\u4e0d\u662f.dll\u7a0b\u5e8f<br \/>\n    for (const auto&amp; path : m_selectedFiles)<br \/>\n    {<br \/>\n        const TCHAR* ext &#061; PathFindExtension(path.c_str());<br \/>\n        if (ext &amp;&amp; _wcsicmp(ext, _T(&#034;.dll&#034;)) !&#061; 0)<br \/>\n        {<br \/>\n            bAllDll &#061; false;<br \/>\n            break;<br \/>\n        }<br \/>\n    }<br \/>\n    \/\/ \u5982\u679c\u6709\u4e0d\u4e3adll\u7684\u5219\u6b64\u62d3\u5c55\u4e0d\u751f\u6548<br \/>\n    if (!bAllDll)<br \/>\n    {<br \/>\n        return E_FAIL;<br \/>\n    }<br \/>\n    initRegMenu(hmenu, indexMenu, idCmdFirst);<br \/>\n    return MAKE_HRESULT(SEVERITY_SUCCESS, 0, CMD_END &#043; 1);;<br \/>\n}<br \/>\nvoid CDllRegEx::initRegMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst)<br \/>\n{<br \/>\n    HMENU uhmenu &#061; CreatePopupMenu();<br \/>\n    MENUITEMINFO hmenu_lpmi{ sizeof(MENUITEMINFO),MIIM_TYPE | MIIM_STATE | MIIM_SUBMENU,MFT_STRING,MFS_ENABLED };<br \/>\n    hmenu_lpmi.cch &#061; idCmdFirst;<br \/>\n    hmenu_lpmi.hSubMenu &#061; uhmenu;<br \/>\n    hmenu_lpmi.dwTypeData &#061; _T(&#034;\u6ce8\u518cdll&#034;);<\/p>\n<p>    MENUITEMINFO uhmenu_lpmi0{ sizeof(MENUITEMINFO),MIIM_TYPE | MIIM_STATE | MIIM_ID ,MFT_STRING,MFS_ENABLED ,idCmdFirst &#043; CMD_REG };<br \/>\n    MENUITEMINFO uhmenu_lpmi1{ sizeof(MENUITEMINFO),MIIM_TYPE | MIIM_STATE | MIIM_ID ,MFT_STRING,MFS_ENABLED, idCmdFirst &#043; CMD_UREG };<br \/>\n    uhmenu_lpmi0.dwTypeData &#061; _T(&#034;\u6ce8\u518c&#034;);<br \/>\n    uhmenu_lpmi1.dwTypeData &#061; _T(&#034;\u6ce8\u9500&#034;);<br \/>\n    InsertMenuItem(uhmenu, idCmdFirst &#043; CMD_REG, TRUE, (LPCMENUITEMINFO)&amp;uhmenu_lpmi0);<br \/>\n    InsertMenuItem(uhmenu, idCmdFirst &#043; CMD_UREG, TRUE, (LPCMENUITEMINFO)&amp;uhmenu_lpmi1);<\/p>\n<p>    InsertMenuItem(hmenu, indexMenu, TRUE, (LPCMENUITEMINFO)&amp;hmenu_lpmi);<br \/>\n}<\/p>\n<h4 id=\"InvokeCommand\">InvokeCommand<\/h4>\n<p>STDMETHODIMP_(HRESULT __stdcall) CDllRegEx::InvokeCommand(LPCMINVOKECOMMANDINFO lpici)<br \/>\n{<br \/>\n    \/\/ 1. \u57fa\u672c\u53c2\u6570\u9a8c\u8bc1<br \/>\n    if (!lpici)<br \/>\n        return E_INVALIDARG;<\/p>\n<p>    \/\/ 2. \u68c0\u67e5\u662f\u5426\u901a\u8fc7\u8c13\u8bcd\u5b57\u7b26\u4e32\u8c03\u7528<br \/>\n    if (HIWORD(lpici-&gt;lpVerb) !&#061; 0)<br \/>\n    {<br \/>\n        \/\/ \u6839\u636efMask\u5224\u65ad\u4f7f\u7528ANSI\u8fd8\u662fUnicode<br \/>\n        if (lpici-&gt;fMask &amp; CMIC_MASK_UNICODE)<br \/>\n        {<br \/>\n            if (wcscmp((LPCWSTR)lpici-&gt;lpVerb, L&#034;\u6ce8\u518c&#034;) &#061;&#061; 0)<br \/>\n            {<br \/>\n                RegCommand(CMD_REG);<br \/>\n                return S_OK;<br \/>\n            }<br \/>\n            else if (wcscmp((LPCWSTR)lpici-&gt;lpVerb, L&#034;\u6ce8\u9500&#034;) &#061;&#061; 0)<br \/>\n            {<br \/>\n                RegCommand(CMD_UREG);<br \/>\n                return S_OK;<br \/>\n            }<br \/>\n        }<br \/>\n        else<br \/>\n        {<br \/>\n            if (lstrcmpA((LPCSTR)lpici-&gt;lpVerb, &#034;\u6ce8\u518c&#034;) &#061;&#061; 0)<br \/>\n            {<br \/>\n                RegCommand(CMD_REG);<br \/>\n                return S_OK;<br \/>\n            }<br \/>\n            else if (lstrcmpA((LPCSTR)lpici-&gt;lpVerb, &#034;\u6ce8\u9500&#034;) &#061;&#061; 0)<br \/>\n            {<br \/>\n                RegCommand(CMD_UREG);<br \/>\n                return S_OK;<br \/>\n            }<br \/>\n        }<\/p>\n<p>        \/\/ \u5b57\u7b26\u4e32\u4e0d\u5339\u914d\u65f6\u660e\u786e\u8fd4\u56de\u9519\u8bef<br \/>\n        return E_INVALIDARG;<br \/>\n    }<br \/>\n    \/\/ 3. \u68c0\u67e5\u662f\u5426\u901a\u8fc7\u547d\u4ee4ID\u8c03\u7528<br \/>\n    else<br \/>\n    {<br \/>\n        switch (LOWORD(lpici-&gt;lpVerb))<br \/>\n        {<br \/>\n        case CMD_REG:<br \/>\n            RegCommand(CMD_REG);<br \/>\n            return S_OK;<br \/>\n        case CMD_UREG:<br \/>\n            RegCommand(CMD_UREG);<br \/>\n            return S_OK;<br \/>\n        default:<br \/>\n            return E_INVALIDARG;<br \/>\n        }<br \/>\n    }<br \/>\n}<\/p>\n<h2 id=\"IExplorerCommand%E5%A4%9A%E7%BA%A7%E8%8F%9C%E5%8D%95\" style=\"background-color:transparent\">IExplorerCommand\u591a\u7ea7\u83dc\u5355<\/h2>\n<h3 id=\"%E7%AE%80%E8%BF%B0\">\u7b80\u8ff0<\/h3>\n<p>\u4e0a\u6587&#xff1a; windows\u5feb\u6377\u83dc\u5355(\u7b80\u5316\u83dc\u5355\/\u65b0\u7248\u83dc\u5355\/IExplorerCommand)\u5f00\u53d1\u6307\u5357-CSDN\u535a\u5ba2 IExplorerCommand\u672c\u8eab\u65e0\u6cd5\u50cfIContextMenu\u4e00\u6837\u76f4\u63a5\u5b9e\u73b0\u591a\u7ea7\u83dc\u5355\u529f\u80fd&#xff0c;\u4f46\u5b58\u5728EnumSubCommands\u65b9\u6cd5\u6765\u4f20\u9012IEnumExplorerCommand\u6765\u95f4\u63a5\u5b9e\u73b0\u3002<\/p>\n<h3 id=\"%E7%BB%93%E6%9E%84\">\u7ed3\u6784<\/h3>\n<p>\/\/ IExplorerCommand<br \/>\nSTDMETHODIMP EnumSubCommands(IEnumExplorerCommand** ppEnum)<br \/>\n|<br \/>\nV<br \/>\n\/\/ IEnumExplorerCommand<br \/>\nSTDMETHOD(Next)(ULONG celt, IExplorerCommand** pUICommand, ULONG* pceltFetched)<br \/>\n|<br \/>\nV<br \/>\n\u5b50IExplorerCommand<\/p>\n<h3 id=\"%E6%96%B9%E6%B3%95%E5%87%BD%E6%95%B0%E8%AF%A6%E8%A7%A3\">\u65b9\u6cd5\u51fd\u6570\u8be6\u89e3<\/h3>\n<\/p>\n<h4 id=\"%E6%96%B9%E6%B3%95%E5%87%BD%E6%95%B0\" style=\"background-color:transparent\">\u65b9\u6cd5\u51fd\u6570<\/h4>\n<p>IFACEMETHOD(EnumSubCommands)(IEnumExplorerCommand** ppEnum) override;<br \/>\nIFACEMETHOD(GetCanonicalName)(GUID* pguidCommandName) override;<br \/>\nIFACEMETHOD(GetFlags)(EXPCMDFLAGS* pFlags) override;<br \/>\nIFACEMETHOD(GetIcon)(IShellItemArray* psiItemArray, LPWSTR* ppszIcon) override;<br \/>\nIFACEMETHOD(GetState)(IShellItemArray* psiItemArray, BOOL fOkToBeSlow, EXPCMDSTATE* pCmdState) override;<br \/>\nIFACEMETHOD(GetTitle)(IShellItemArray* psiItemArray, LPWSTR* ppszName) override;<br \/>\nIFACEMETHOD(GetToolTip)(IShellItemArray* psiItemArray, LPWSTR* ppszInfotip) override;<br \/>\nIFACEMETHOD(Invoke)(IShellItemArray* psiItemArray, IBindCtx* pbc) override;<\/p>\n<h4 id=\"%E6%96%B9%E6%B3%95%E8%AF%A6%E8%A7%A3\" style=\"background-color:transparent\">\u65b9\u6cd5\u8be6\u89e3<\/h4>\n<p>\/**<br \/>\n * \u7528\u4e8e\u914d\u7f6e\u5b50\u547d\u4ee4\u96c6<br \/>\n * &#064;param ppEnum _out_ IEnumExplorerCommand**  \u8fd4\u56de\u5305\u542b\u53ef\u7528\u4e8e\u904d\u5386\u5b50\u547d\u4ee4\u96c6<br \/>\n * &#064;return HRESULT<br \/>\n *\/<br \/>\nHRESULT EnumSubCommands(<br \/>\nIEnumExplorerCommand** ppEnum<br \/>\n);<br \/>\n\/**<br \/>\n * \u68c0\u7d22 \u5f53\u524d\u547d\u4ee4\u7684 GUID<br \/>\n * &#064;param pguidCommandName [out] \u5f53\u6b64\u65b9\u6cd5\u6210\u529f\u8fd4\u56de\u65f6&#xff0c;\u5c06\u63a5\u6536\u547d\u4ee4\u7684 GUID&#xff0c;\u8be5 GUID \u5728\u6ce8\u518c\u8868\u4e2d\u58f0\u660e\u5b83<br \/>\n * &#064;return S_OK<br \/>\n *\/<br \/>\nHRESULT GetCanonicalName(<br \/>\nGUID* pguidCommandName<br \/>\n);<br \/>\n\/**<br \/>\n *\u83b7\u53d6\u4e0e\u6307\u5b9a\u7684 Windows \u8d44\u6e90\u7ba1\u7406\u5668\u547d\u4ee4\u9879\u5173\u8054\u7684\u6807\u5fd7\u3002<br \/>\n *&#064;param pFlags [out] \u6b64\u65b9\u6cd5\u8fd4\u56de\u65f6&#xff0c;\u6b64\u503c\u6307\u5411\u5f53\u524d\u547d\u4ee4\u6807\u5fd7\u3002<br \/>\n ECF_DEFAULT (0x000)\u9ed8\u8ba4\u503c<br \/>\nECF_HASSUBCOMMANDS (0x001)\u5b50\u547d\u4ee4<br \/>\nECF_HASSPLITBUTTON (0x002)\u62c6\u5206\u6309\u94ae<br \/>\nECF_HIDELABEL (0x004)\u9690\u85cf\u6309\u94ae<br \/>\nECF_ISSEPARATOR (0x008)\u547d\u4ee4\u662f\u5206\u9694\u7b26\u3002<br \/>\nECF_HASLUASHIELD (0x010)\u663e\u793a UAC \u9632\u62a4\u677f\u3002<br \/>\nECF_SEPARATORBEFORE (0x020)\u547d\u4ee4\u4f4d\u4e8e\u7d27\u90bb\u5206\u9694\u7b26\u4e0b\u65b9\u7684\u83dc\u5355\u4e2d\u3002<br \/>\nECF_SEPARATORAFTER (0x040)\u547d\u4ee4\u4f4d\u4e8e\u7d27\u9760\u5206\u9694\u7b26\u4e0a\u65b9\u7684\u83dc\u5355\u4e2d\u3002<br \/>\nECF_ISDROPDOWN (0x080)\u9009\u62e9\u547d\u4ee4\u4f1a\u6253\u5f00\u4e00\u4e2a\u4e0b\u62c9\u5b50\u83dc\u5355&#xff0c; (\u4f8b\u5982\u201c \u5305\u542b\u5728\u5e93) \u4e2d\u201d\u3002<br \/>\nECF_TOGGLEABLE (0x100)<br \/>\nECF_AUTOMENUICONS (0x200)<br \/>\n *\/<br \/>\nHRESULT GetFlags(<br \/>\nEXPCMDFLAGS* pFlags<br \/>\n);<br \/>\n\/**<br \/>\n * \u8fd4\u56de\u8be5\u547d\u4ee4\u9879\u7684\u56fe\u6807\u8def\u5f84<br \/>\n * &#064;param psiItemArray _In_ IShellItemArray* \u6307\u5411 IShellItemArray \u7684\u6307\u9488<br \/>\n * &#064;param ppszIcon _out_ LPWSTR* \u63a5\u6536\u6307\u5411\u5305\u542b\u56fe\u6807\u8def\u5f84\u7684\u5b57\u7b26\u4e32\u7684\u6307\u9488\u3002<br \/>\n * &#064;return<br \/>\n *\/<br \/>\nHRESULT GetIcon(<br \/>\nIShellItemArray* psiItemArray,<br \/>\nLPWSTR* ppszIcon<br \/>\n);<br \/>\n\/**<br \/>\n * \u8fd4\u56de\u8be5\u547d\u4ee4\u9879\u7684\u72b6\u6001<br \/>\n * &#064;param psiItemArray _In_ IShellItemArray* \u6307\u5411 IShellItemArray \u7684\u6307\u9488<br \/>\n * &#064;param fOkToBeSlow _In_ BOOL \u6307\u793a\u662f\u5426\u53ef\u4ee5\u7b49\u5f85\u3002<br \/>\n * &#064;param pCmdState _Out_ EXPCMDSTATE*<br \/>\n   ECS_ENABLED &#061; 0,  \/\/ \u8be5\u9879\u5df2\u542f\u7528<br \/>\n  ECS_DISABLED &#061; 0x1, \/\/ \u7070\u663e\u4e14\u4e0d\u53ef\u8bbf\u95ee\u7684\u9879<br \/>\n  ECS_HIDDEN &#061; 0x2,  \/\/ \u9690\u85cf\u72b6\u6001<br \/>\n  ECS_CHECKBOX &#061; 0x4, \/\/ \u68c0\u67e5\u6846\u663e\u793a<br \/>\n  ECS_CHECKED &#061; 0x8, \/\/ \u5e26\u6709\u68c0\u67e5\u6846\u7684\u9879&#xff0c;\u5e76\u9009\u4e2d\u8be5\u68c0\u67e5\u6846<br \/>\n  ECS_RADIOCHECK &#061; 0x10 \/\/ \u9879\u662f\u901a\u8fc7\u5355\u9009\u6309\u94ae\u9009\u62e9\u7684\u4e00\u7ec4\u4e92\u65a5\u9009\u9879\u4e4b\u4e00\u3002<br \/>\n * &#064;return<br \/>\n *\/<br \/>\nHRESULT GetState(<br \/>\nIShellItemArray* psiItemArray,<br \/>\nBOOL            fOkToBeSlow,<br \/>\nEXPCMDSTATE* pCmdState<br \/>\n);<br \/>\n\/**<br \/>\n * \u63d0\u4f9b\u8be5\u547d\u4ee4\u9879\u7684\u540d\u79f0<br \/>\n * &#064;param psiItemArray _In_ IShellItemArray* \u6307\u5411 IShellItemArray \u7684\u6307\u9488<br \/>\n * &#064;param ppszName _Out_ LPWSTR* \u83b7\u53d6\u6307\u5411\u5305\u542b\u547d\u4ee4\u9879\u540d\u79f0\u7684\u5b57\u7b26\u4e32\u7684\u6307\u9488\u3002<br \/>\n * &#064;return<br \/>\n *\/<br \/>\nHRESULT GetTitle(<br \/>\nIShellItemArray* psiItemArray,<br \/>\nLPWSTR* ppszName<br \/>\n);<br \/>\n\/**<br \/>\n * \u63d0\u4f9b\u8be5\u547d\u4ee4\u9879\u7684\u63d0\u793a<br \/>\n * &#064;param psiItemArray _In_ IShellItemArray* \u6307\u5411 IShellItemArray \u7684\u6307\u9488<br \/>\n * &#064;param ppszInfotip _Out_ LPWSTR* \u83b7\u53d6\u6307\u5411\u5305\u542b\u547d\u4ee4\u9879\u4fe1\u606f\u63d0\u793a\u7684\u5b57\u7b26\u4e32\u7684\u6307\u9488\u3002<br \/>\n * &#064;return<br \/>\n *\/<br \/>\nHRESULT GetToolTip(<br \/>\nIShellItemArray* psiItemArray,<br \/>\nLPWSTR* ppszInfotip<br \/>\n);<br \/>\n\/**<br \/>\n * \u547d\u4ee4\u51fd\u6570<br \/>\n * &#064;param psiItemArray _In_ IShellItemArray* \u4f60\u7684\u4ee3\u7801\u901a\u8fc7\u5b83\u83b7\u53d6&#034;\u64cd\u4f5c\u5bf9\u8c61\u662f\u8c01&#034;<br \/>\npsiItemArray-&gt;EnumItems(&amp;pEnum)\/\/&lt;\u83b7\u53d6 IEnumShellItems \u679a\u4e3e\u5668(\u5305\u62ec\u6bcf\u4e2a\u6587\u4ef6\u7684\u4fe1\u606f)<br \/>\npEnum-&gt;Clone()<br \/>\npEnum-&gt;Next()<br \/>\npEnum-&gt;Reset()<br \/>\npEnum-&gt;Skip()<br \/>\npsiItemArray-&gt;GetAttributes();\/\/&lt;\u83b7\u53d6\u9879\u96c6\u7684\u5c5e\u6027\u6807\u5fd7<br \/>\npsiItemArray-&gt;GetCount(&amp;a);\/\/&lt;\u83b7\u53d6\u5bf9\u8c61\u6570\u91cf<br \/>\npsiItemArray-&gt;GetItemAt(0, &amp;psi);\/\/&lt;\u83b7\u53d6\u7d22\u5f15\u5904\u7684\u9879<br \/>\npsi-&gt;Compare()<br \/>\npsi-&gt;GetAttributes()<br \/>\npsi-&gt;GetDisplayName()<br \/>\npsi-&gt;GetParent()<br \/>\npsiItemArray-&gt;GetPropertyDescriptionList(); \/\/&lt;\u5c5e\u6027\u63cf\u8ff0\u5217\u8868<br \/>\npsiItemArray-&gt;GetPropertyStore();\/\/&lt;\u5c5e\u6027\u5b58\u50a8\u533a<br \/>\n * &#064;param pbc _In_ IBindCtx* \u63d0\u4f9b&#034;\u5728\u4ec0\u4e48\u4e0a\u4e0b\u6587\/\u6761\u4ef6\u4e0b\u64cd\u4f5c&#034;<br \/>\n\u901a\u5e38\u53ef\u4e3a nullptr&#xff0c;\u5927\u90e8\u5206\u573a\u666f\u4e0d\u9700\u8981\u4f7f\u7528<br \/>\npbc-&gt;SetBindOptions();\/\/&lt;\u8bbe\u7f6e\u7ed1\u5b9a\u9009\u9879<br \/>\npbc-&gt;GetBindOptions();\/\/&lt;\u83b7\u53d6\u7ed1\u5b9a\u9009\u9879<\/p>\n<p>pbc-&gt;EnumObjectParam();\/\/&lt;\u679a\u4e3e\u5bf9\u8c61\u53c2\u6570<br \/>\npbc-&gt;RegisterObjectParam();\/\/&lt;\u6ce8\u518c\u5bf9\u8c61\u53c2\u6570<br \/>\npbc-&gt;GetObjectParam();\/\/&lt;\u83b7\u53d6\u5bf9\u8c61\u53c2\u6570<br \/>\npbc-&gt;RevokeObjectParam();\/\/&lt;\u64a4\u9500\u5bf9\u8c61\u53c2\u6570<\/p>\n<p>pbc-&gt;RegisterObjectBound();\/\/&lt;\u6ce8\u518c\u5bf9\u8c61\u7ed1\u5b9a<br \/>\npbc-&gt;RevokeObjectBound();\/\/&lt;\u64a4\u9500\u5bf9\u8c61\u7ed1\u5b9a<br \/>\npbc-&gt;ReleaseBoundObjects();\/\/&lt;\u91ca\u653e\u7ed1\u5b9a\u5bf9\u8c61<\/p>\n<p>pbc-&gt;GetRunningObjectTable();\/\/&lt;\u83b7\u53d6\u8fd0\u884c\u5bf9\u8c61\u8868<br \/>\n * &#064;return<br \/>\n *\/<br \/>\nHRESULT Invoke(<br \/>\nIShellItemArray* psiItemArray,<br \/>\nIBindCtx* pbc<br \/>\n);<\/p>\n<h4 id=\"%E5%B8%B8%E7%94%A8%E6%96%B9%E6%B3%95%E6%A1%88%E4%BE%8B%EF%BC%88%E4%BE%BF%E4%BA%8E%E7%9B%B4%E6%8E%A5%E5%A4%8D%E5%88%B6%E4%BD%BF%E7%94%A8%EF%BC%89\" style=\"background-color:transparent\">\u5e38\u7528\u65b9\u6cd5\u6848\u4f8b&#xff08;\u4fbf\u4e8e\u76f4\u63a5\u590d\u5236\u4f7f\u7528&#xff09;<\/h4>\n<p>\/\/ \u6a21\u677f<br \/>\nIFACEMETHOD(EnumSubCommands)(IEnumExplorerCommand** ppEnum) override{*ppEnum &#061; nullptr; return E_NOTIMPL;}<br \/>\nIFACEMETHOD(GetCanonicalName)(GUID* pguidCommandName) {*pguidCommandName&#061;GetObjectCLSID();return S_OK;}<br \/>\nIFACEMETHOD(GetFlags)(EXPCMDFLAGS* pFlags){*pFlags&#061;ECF_DEFAULT;return S_OK;}<br \/>\nIFACEMETHOD(GetIcon)(IShellItemArray* psiItemArray, LPWSTR* ppszIcon){return SHStrDup(_T(&#034;Resource.dll,201&#034;), ppszIcon);}<br \/>\nIFACEMETHOD(GetState)(IShellItemArray* psiItemArray, BOOL fOkToBeSlow, EXPCMDSTATE* pCmdState){*pCmdState&#061;ECS_ENABLED;return S_OK;}<br \/>\nIFACEMETHOD(GetTitle)(IShellItemArray* psiItemArray, LPWSTR* ppszName){std::wstring titlename&#061;_T( &#034;test&#034;);return SHStrDup(titlename.c_str(), ppszName);}<br \/>\nIFACEMETHOD(GetToolTip)(IShellItemArray* psiItemArray, LPWSTR* ppszInfotip){std::wstring tooltip&#061;_T( &#034;test&#034;);return SHStrDup(tooltip.c_str(), ppszInfotip);}<br \/>\nIFACEMETHOD(Invoke)(IShellItemArray* psiItemArray, IBindCtx* pbc) override{return E_NOTIMPL;}<\/p>\n<h5 id=\"EnumSubCommands\" style=\"background-color:transparent\">EnumSubCommands<\/h5>\n<p>IFACEMETHOD(EnumSubCommands)(IEnumExplorerCommand** ppEnum) override<br \/>\n{<br \/>\nif (!ppEnum)<br \/>\n    return E_POINTER;<\/p>\n<p>m_currentIndex &#061; 0;   \/\/ \u91cd\u7f6e\u679a\u4e3e\u4f4d\u7f6e<br \/>\nthis-&gt;AddRef();        \/\/ \u8fd4\u56de\u524d\u589e\u52a0\u5f15\u7528\u8ba1\u6570<br \/>\n*ppEnum &#061; static_cast&lt;IEnumExplorerCommand*&gt;(this);<br \/>\nreturn S_OK;<br \/>\n}<\/p>\n<h5 id=\"Clone\">Clone<\/h5>\n<p>IFACEMETHOD(Clone)(IEnumExplorerCommand** ppenum) override<br \/>\n{<br \/>\n    *ppenum &#061; NULL;<br \/>\n    CComObject&lt;CIExCmdMainMenus&gt;* pNew;<br \/>\n    HRESULT hr &#061; CComObject&lt;CIExCmdMainMenus&gt;::CreateInstance(&amp;pNew);<br \/>\n    if (SUCCEEDED(hr)) {<br \/>\n        pNew-&gt;AddRef();<br \/>\n        pNew-&gt;m_currentIndex &#061; m_currentIndex;<br \/>\n        pNew-&gt;m_subCommands &#061; m_subCommands;  \/\/ \u5171\u4eab\u5b50\u547d\u4ee4<br \/>\n        *ppenum &#061; static_cast&lt;IEnumExplorerCommand*&gt;(pNew);<br \/>\n    }<br \/>\n    return hr;<br \/>\n}<\/p>\n<h5 id=\"Next\">Next<\/h5>\n<p>IFACEMETHOD(Next)(ULONG celt, IExplorerCommand** pUICommand, ULONG* pceltFetched) override<br \/>\n{<br \/>\n    if (!pUICommand)<br \/>\n        return E_POINTER;<br \/>\n    ULONG fetched &#061; 0;<br \/>\n    while (fetched &lt; celt &amp;&amp; m_currentIndex &lt; m_subCommands.size()) {<br \/>\n        pUICommand[fetched] &#061; m_subCommands[m_currentIndex];<br \/>\n        pUICommand[fetched]-&gt;AddRef(); \/\/ \u5fc5\u987b\u589e\u52a0\u5f15\u7528\u8ba1\u6570<br \/>\n        m_currentIndex&#043;&#043;;<br \/>\n        fetched&#043;&#043;;<br \/>\n    }<br \/>\n    if (pceltFetched) *pceltFetched &#061; fetched;<br \/>\n    return (fetched &#061;&#061; celt) ? S_OK : S_FALSE;<br \/>\n}<\/p>\n<h5 id=\"Invoke\" style=\"background-color:transparent\">Invoke<\/h5>\n<p>#include &lt;windows.h&gt;<br \/>\n#include &lt;shobjidl_core.h&gt;<br \/>\n#include &lt;shlobj.h&gt;<br \/>\n#include &lt;shellapi.h&gt;<br \/>\n#include &lt;atlbase.h&gt;<br \/>\n#include &lt;string&gt;<br \/>\n#include &lt;vector&gt;<br \/>\n#include &lt;propvarutil.h&gt;<br \/>\n#include &lt;propkey.h&gt;<\/p>\n<p>\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n\/\/ IExplorerCommand::Invoke \u5b8c\u6574\u5b9e\u73b0<br \/>\n\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\nSTDMETHODIMP CMyExplorerCommand::Invoke(<br \/>\n    _In_ IShellItemArray* psiItemArray,<br \/>\n    _In_ IBindCtx* pbc)<br \/>\n{<br \/>\n    \/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n    \/\/ \u4e00\u3001\u53c2\u6570\u6821\u9a8c<br \/>\n    \/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n    if (!psiItemArray)<br \/>\n        return E_INVALIDARG;<\/p>\n<p>    \/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n    \/\/ \u4e8c\u3001\u4ece psiItemArray \u83b7\u53d6\u9009\u4e2d\u9879\u6570\u91cf<br \/>\n    \/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n    DWORD dwCount &#061; 0;<br \/>\n    HRESULT hr &#061; psiItemArray-&gt;GetCount(&amp;dwCount);<br \/>\n    if (FAILED(hr) || dwCount &#061;&#061; 0)<br \/>\n        return S_OK; \/\/ \u6ca1\u6709\u9009\u4e2d\u9879&#xff0c;\u9759\u9ed8\u8fd4\u56de<\/p>\n<p>    \/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n    \/\/ \u4e09\u3001\u65b9\u5f0f\u4e00&#xff1a;\u901a\u8fc7 GetItemAt \u6309\u7d22\u5f15\u904d\u5386&#xff08;\u63a8\u8350&#xff0c;\u7b80\u5355\u76f4\u89c2&#xff09;<br \/>\n    \/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n    std::vector&lt;std::wstring&gt; filePaths;<br \/>\n    filePaths.reserve(dwCount);<\/p>\n<p>    for (DWORD i &#061; 0; i &lt; dwCount; &#043;&#043;i)<br \/>\n    {<br \/>\n        CComPtr&lt;IShellItem&gt; psi;<br \/>\n        hr &#061; psiItemArray-&gt;GetItemAt(i, &amp;psi);<br \/>\n        if (FAILED(hr) || !psi)<br \/>\n            continue;<\/p>\n<p>        \/\/ &#8212;&#8212; 3.1 \u83b7\u53d6\u6587\u4ef6\u7cfb\u7edf\u5b8c\u6574\u8def\u5f84&#xff08;\u6700\u5e38\u7528&#xff09; &#8212;&#8212;<br \/>\n        PWSTR pszPath &#061; nullptr;<br \/>\n        hr &#061; psi-&gt;GetDisplayName(SIGDN_FILESYSPATH, &amp;pszPath);<br \/>\n        if (SUCCEEDED(hr) &amp;&amp; pszPath)<br \/>\n        {<br \/>\n            filePaths.emplace_back(pszPath);<br \/>\n            CoTaskMemFree(pszPath); \/\/ \u5fc5\u987b\u91ca\u653e&#xff01;<br \/>\n        }<br \/>\n        else<br \/>\n        {<br \/>\n            \/\/ \u975e\u6587\u4ef6\u7cfb\u7edf\u9879&#xff08;\u5982\u865a\u62df\u6587\u4ef6\u5939&#xff09;&#xff0c;\u56de\u9000\u83b7\u53d6\u663e\u793a\u540d\u79f0<br \/>\n            PWSTR pszName &#061; nullptr;<br \/>\n            hr &#061; psi-&gt;GetDisplayName(SIGDN_NORMALDISPLAY, &amp;pszName);<br \/>\n            if (SUCCEEDED(hr) &amp;&amp; pszName)<br \/>\n            {<br \/>\n                filePaths.emplace_back(pszName);<br \/>\n                CoTaskMemFree(pszName);<br \/>\n            }<br \/>\n        }<\/p>\n<p>        \/\/ &#8212;&#8212; 3.2 \u83b7\u53d6\u9879\u7684\u5c5e\u6027\u6807\u5fd7&#xff08;\u5224\u65ad\u662f\u6587\u4ef6\u8fd8\u662f\u6587\u4ef6\u5939&#xff09; &#8212;&#8212;<br \/>\n        SFGAOF sfgaoAttrs &#061; 0;<br \/>\n        hr &#061; psi-&gt;GetAttributes(<br \/>\n            SFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_LINK,<br \/>\n            &amp;sfgaoAttrs);<br \/>\n        if (SUCCEEDED(hr))<br \/>\n        {<br \/>\n            bool bIsFolder &#061; (sfgaoAttrs &amp; SFGAO_FOLDER) !&#061; 0;<br \/>\n            bool bIsFileSystem &#061; (sfgaoAttrs &amp; SFGAO_FILESYSTEM) !&#061; 0;<br \/>\n            bool bIsLink &#061; (sfgaoAttrs &amp; SFGAO_LINK) !&#061; 0;<br \/>\n            \/\/ \u53ef\u6839\u636e bIsFolder \/ bIsFileSystem \/ bIsLink \u505a\u5206\u652f\u5904\u7406<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n    \/\/ \u56db\u3001\u65b9\u5f0f\u4e8c&#xff1a;\u901a\u8fc7 EnumItems \u679a\u4e3e\u5668\u904d\u5386&#xff08;\u9002\u5408\u6d41\u5f0f\u5904\u7406&#xff09;<br \/>\n    \/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n    \/*<br \/>\n    CComPtr&lt;IEnumShellItems&gt; pEnum;<br \/>\n    hr &#061; psiItemArray-&gt;EnumItems(&amp;pEnum);<br \/>\n    if (SUCCEEDED(hr) &amp;&amp; pEnum)<br \/>\n    {<br \/>\n        CComPtr&lt;IShellItem&gt; psi;<br \/>\n        while (pEnum-&gt;Next(1, &amp;psi, nullptr) &#061;&#061; S_OK)<br \/>\n        {<br \/>\n            PWSTR pszPath &#061; nullptr;<br \/>\n            hr &#061; psi-&gt;GetDisplayName(SIGDN_FILESYSPATH, &amp;pszPath);<br \/>\n            if (SUCCEEDED(hr) &amp;&amp; pszPath)<br \/>\n            {<br \/>\n                \/\/ \u5904\u7406 pszPath &#8230;<br \/>\n                CoTaskMemFree(pszPath);<br \/>\n            }<br \/>\n            psi.Release(); \/\/ \u91ca\u653e\u5f53\u524d\u9879&#xff0c;\u51c6\u5907\u83b7\u53d6\u4e0b\u4e00\u9879<br \/>\n        }<br \/>\n        \/\/ \u679a\u4e3e\u5668\u5176\u4ed6\u65b9\u6cd5&#xff1a;<br \/>\n        \/\/ pEnum-&gt;Reset();  \/\/ \u91cd\u7f6e\u5230\u5f00\u5934&#xff0c;\u53ef\u91cd\u65b0\u904d\u5386<br \/>\n        \/\/ pEnum-&gt;Skip(n);  \/\/ \u8df3\u8fc7 n \u9879<br \/>\n        \/\/ pEnum-&gt;Clone(&amp;pEnum2); \/\/ \u514b\u9686\u679a\u4e3e\u5668&#xff08;\u6ce8\u610f&#xff1a;\u90e8\u5206\u5b9e\u73b0\u4e0d\u652f\u6301&#xff09;<br \/>\n    }<br \/>\n    *\/<\/p>\n<p>    \/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n    \/\/ \u4e94\u3001\u65b9\u5f0f\u4e09&#xff1a;\u6279\u91cf\u83b7\u53d6\u5c5e\u6027\u6807\u5fd7&#xff08;\u9002\u5408\u9700\u8981\u6574\u4f53\u5224\u65ad\u7684\u573a\u666f&#xff09;<br \/>\n    \/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n    \/*<br \/>\n    SFGAOF bulkAttrs &#061; 0;<br \/>\n    \/\/ SIATTRIBFLAGS_AND: \u6240\u6709\u9879\u90fd\u6709\u7684\u5c5e\u6027\u4f4d\u624d\u7f6e1<br \/>\n    \/\/ SIATTRIBFLAGS_OR:  \u4efb\u4e00\u9879\u6709\u7684\u5c5e\u6027\u4f4d\u5c31\u7f6e1<br \/>\n    \/\/ SIATTRIBFLAGS_APPCOMPAT: \u517c\u5bb9\u6027\u6a21\u5f0f<br \/>\n    hr &#061; psiItemArray-&gt;GetAttributes(<br \/>\n        SIATTRIBFLAGS_AND,<br \/>\n        SFGAO_FOLDER | SFGAO_FILESYSTEM,<br \/>\n        &amp;bulkAttrs);<br \/>\n    if (SUCCEEDED(hr))<br \/>\n    {<br \/>\n        bool allFolders &#061; (bulkAttrs &amp; SFGAO_FOLDER) !&#061; 0;<br \/>\n        \/\/ \u5982\u679c\u6240\u6709\u9009\u4e2d\u9879\u90fd\u662f\u6587\u4ef6\u5939&#xff0c;\u6267\u884c\u6587\u4ef6\u5939\u4e13\u5c5e\u903b\u8f91<br \/>\n    }<br \/>\n    *\/<\/p>\n<p>    \/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n    \/\/ \u516d\u3001\u65b9\u5f0f\u56db&#xff1a;\u901a\u8fc7\u5c5e\u6027\u5b58\u50a8\u83b7\u53d6\u6587\u4ef6\u5143\u6570\u636e&#xff08;\u9ad8\u7ea7\u7528\u6cd5&#xff09;<br \/>\n    \/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n    \/*<br \/>\n    CComPtr&lt;IPropertyStore&gt; pPropStore;<br \/>\n    hr &#061; psiItemArray-&gt;GetPropertyStore(<br \/>\n        GPS_DEFAULT,                    \/\/ \u9ed8\u8ba4\u5c5e\u6027\u5b58\u50a8<br \/>\n        IID_PPV_ARGS(&amp;pPropStore));<br \/>\n    if (SUCCEEDED(hr) &amp;&amp; pPropStore)<br \/>\n    {<br \/>\n        PROPVARIANT var;<br \/>\n        PropVariantInit(&amp;var);<br \/>\n        \/\/ \u83b7\u53d6\u6587\u4ef6\u4fee\u6539\u65f6\u95f4<br \/>\n        hr &#061; pPropStore-&gt;GetValue(PKEY_DateModified, &amp;var);<br \/>\n        if (SUCCEEDED(hr))<br \/>\n        {<br \/>\n            \/\/ \u4f7f\u7528 var \u4e2d\u7684\u503c&#8230;<br \/>\n            PropVariantClear(&amp;var);<br \/>\n        }<br \/>\n    }<br \/>\n    *\/<\/p>\n<p>    \/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n    \/\/ \u4e03\u3001\u5904\u7406 pbc&#xff08;IBindCtx \u7ed1\u5b9a\u4e0a\u4e0b\u6587&#xff09;<br \/>\n    \/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n    \/\/ pbc \u5728\u5927\u591a\u6570 Invoke \u573a\u666f\u4e2d\u4e3a nullptr&#xff0c;\u4e0d\u9700\u8981\u5904\u7406\u3002<br \/>\n    \/\/ \u4ee5\u4e0b\u5c55\u793a pbc \u4e0d\u4e3a\u7a7a\u65f6\u53ef\u505a\u7684\u64cd\u4f5c&#xff1a;<br \/>\n    if (pbc)<br \/>\n    {<br \/>\n        \/\/ &#8212;&#8212; 7.1 \u83b7\u53d6\u7ed1\u5b9a\u9009\u9879 &#8212;&#8212;<br \/>\n        BIND_OPTS bindOpts &#061; {};<br \/>\n        bindOpts.cbStruct &#061; sizeof(BIND_OPTS);<br \/>\n        hr &#061; pbc-&gt;GetBindOptions(&amp;bindOpts);<br \/>\n        if (SUCCEEDED(hr))<br \/>\n        {<br \/>\n            \/\/ bindOpts.grfFlags   &#8211; \u7ed1\u5b9a\u6807\u5fd7<br \/>\n            \/\/ bindOpts.grfMode    &#8211; \u5b58\u50a8\u6253\u5f00\u6a21\u5f0f&#xff08;STGM_READ \u7b49&#xff09;<br \/>\n            \/\/ bindOpts.dwTickCountDeadline &#8211; \u8d85\u65f6\u9650\u5236<br \/>\n        }<\/p>\n<p>        \/\/ &#8212;&#8212; 7.2 \u8bfb\u53d6\u81ea\u5b9a\u4e49\u5bf9\u8c61\u53c2\u6570 &#8212;&#8212;<br \/>\n        \/\/ Shell \u53ef\u80fd\u901a\u8fc7 RegisterObjectParam \u6ce8\u518c\u4e86\u4e0a\u4e0b\u6587\u4fe1\u606f<br \/>\n        CComPtr&lt;IUnknown&gt; pUnkParam;<br \/>\n        hr &#061; pbc-&gt;GetObjectParam(L&#034;MyCustomParam&#034;, &amp;pUnkParam);<br \/>\n        if (SUCCEEDED(hr) &amp;&amp; pUnkParam)<br \/>\n        {<br \/>\n            \/\/ \u4f7f\u7528\u81ea\u5b9a\u4e49\u53c2\u6570&#8230;<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n    \/\/ \u516b\u3001\u6267\u884c\u5b9e\u9645\u4e1a\u52a1\u64cd\u4f5c&#xff08;\u793a\u4f8b&#xff1a;\u7528\u9ed8\u8ba4\u7a0b\u5e8f\u6253\u5f00\u6240\u6709\u9009\u4e2d\u6587\u4ef6&#xff09;<br \/>\n    \/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n    for (const auto&amp; path : filePaths)<br \/>\n    {<br \/>\n        \/\/ ShellExecuteW \u4f1a\u81ea\u52a8\u4f7f\u7528\u6587\u4ef6\u5173\u8054\u7684\u9ed8\u8ba4\u7a0b\u5e8f\u6253\u5f00<br \/>\n        HINSTANCE hInst &#061; ShellExecuteW(<br \/>\n            nullptr,        \/\/ \u65e0\u7236\u7a97\u53e3<br \/>\n            L&#034;open&#034;,        \/\/ \u64cd\u4f5c\u7c7b\u578b<br \/>\n            path.c_str(),   \/\/ \u6587\u4ef6\u8def\u5f84<br \/>\n            nullptr,        \/\/ \u65e0\u989d\u5916\u53c2\u6570<br \/>\n            nullptr,        \/\/ \u4f7f\u7528\u6587\u4ef6\u6240\u5728\u76ee\u5f55<br \/>\n            SW_SHOWNORMAL   \/\/ \u6b63\u5e38\u663e\u793a\u7a97\u53e3<br \/>\n        );<br \/>\n        \/\/ \u8fd4\u56de\u503c &gt; 32 \u8868\u793a\u6210\u529f<br \/>\n        if ((INT_PTR)hInst &lt;&#061; 32)<br \/>\n        {<br \/>\n            \/\/ \u5904\u7406\u9519\u8bef&#8230;<br \/>\n        }<br \/>\n    }<\/p>\n<p>    return S_OK;<br \/>\n}<\/p>\n<h3 id=\"%E6%A1%88%E4%BE%8B\">\u6848\u4f8b<\/h3>\n<p>\u901a\u8fc7\u53f3\u952e\u5feb\u6377\u83dc\u5355(\u7b80\u5316\u83dc\u5355\/win11\u83dc\u5355)\u5b9e\u73b0dll\u7ec4\u4ef6\u7684\u6ce8\u518c\u4e0e\u6ce8\u9500\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"437\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/08\/20260812164855-6a7ca3f7c8bbc.png\" width=\"797\" \/><\/p>\n<h4 id=\"%E6%96%87%E4%BB%B6%E7%BB%93%E6%9E%84\">\u6587\u4ef6\u7ed3\u6784<\/h4>\n<p>\/\/ IExCmdMainMenus.h<br \/>\n\/\/ \u7236\u83dc\u5355<br \/>\n\/\/ \u540c\u65f6\u5b9e\u73b0\u7236 IExplorerCommand \u4e0e IEnumExplorerCommand<br \/>\n\/\/ \u9884\u5904\u7406\u4e00\u4e2astd::vector&lt;CComPtr&lt;CIExCmdSubMenus&gt;&gt;\u7ed1\u5b9a\u5b50\u83dc\u5355\u4f5c\u4e3aIEnumExplorerCommand::Next\u7684\u53c2\u6570<br \/>\n\/\/ \u7236 IExplorerCommand \u5b9e\u73b0\u7236\u83dc\u5355\u4fe1\u606f\u5e76\u901a\u8fc7IExplorerCommand::EnumSubCommands\u83b7\u53d6\u672c\u8eab\u6240\u62e5\u6709\u7684IEnumExplorerCommand\u73af\u5883<br \/>\n\/\/ IEnumExplorerCommand <\/p>\n<p>\/\/ IExCmdSubMenus.h<br \/>\n\/\/ \u5b50\u83dc\u5355<br \/>\n\/\/ \u5b9e\u73b0\u5b50 IExplorerCommand<br \/>\n\/\/ \u6839\u636e\u7236\u83dc\u5355\u4f20\u9012\u7684\u83dc\u5355\u7f16\u53f7(\u53ef\u81ea\u5b9a\u4e49)\u6765\u9488\u5bf9\u6027\u6267\u884c Invoke<\/p>\n<p>\/\/ IExCmdSubMenus.cpp<br \/>\n\/\/ \u5355\u72ec\u5904\u7406IExplorerCommand::Invoke<\/p>\n<h4 id=\"IExCmdMainMenus.h\">IExCmdMainMenus.h<\/h4>\n<p>\/\/ IExCmdMainMenus.h: CIExCmdMainMenus \u7684\u58f0\u660e<\/p>\n<p>#pragma once<br \/>\n#include &lt;string&gt;<br \/>\n#include &lt;vector&gt;<br \/>\n#include &#034;resource.h&#034;       \/\/ \u4e3b\u7b26\u53f7<\/p>\n<p>#include &#034;DllRegIExCmdExt_i.h&#034;<br \/>\n#include &#034;IExCmdSubMenus.h&#034;<\/p>\n<p>#if defined(_WIN32_WCE) &amp;&amp; !defined(_CE_DCOM) &amp;&amp; !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)<br \/>\n#error &#034;Windows CE \u5e73\u53f0(\u5982\u4e0d\u63d0\u4f9b\u5b8c\u5168 DCOM \u652f\u6301\u7684 Windows Mobile \u5e73\u53f0)\u4e0a\u65e0\u6cd5\u6b63\u786e\u652f\u6301\u5355\u7ebf\u7a0b COM \u5bf9\u8c61\u3002\u5b9a\u4e49 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA \u53ef\u5f3a\u5236 ATL \u652f\u6301\u521b\u5efa\u5355\u7ebf\u7a0b COM \u5bf9\u8c61\u5b9e\u73b0\u5e76\u5141\u8bb8\u4f7f\u7528\u5176\u5355\u7ebf\u7a0b COM \u5bf9\u8c61\u5b9e\u73b0\u3002rgs \u6587\u4ef6\u4e2d\u7684\u7ebf\u7a0b\u6a21\u578b\u5df2\u88ab\u8bbe\u7f6e\u4e3a\u201cFree\u201d&#xff0c;\u539f\u56e0\u662f\u8be5\u6a21\u578b\u662f\u975e DCOM Windows CE \u5e73\u53f0\u652f\u6301\u7684\u552f\u4e00\u7ebf\u7a0b\u6a21\u578b\u3002&#034;<br \/>\n#endif<\/p>\n<p>using namespace ATL;<\/p>\n<p>\/\/ CIExCmdMainMenus<\/p>\n<p>class ATL_NO_VTABLE CIExCmdMainMenus :<br \/>\npublic CComObjectRootEx&lt;CComSingleThreadModel&gt;,<br \/>\npublic CComCoClass&lt;CIExCmdMainMenus, &amp;CLSID_IExCmdMainMenus&gt;,<br \/>\npublic IDispatchImpl&lt;IIExCmdMainMenus, &amp;IID_IIExCmdMainMenus, &amp;LIBID_DllRegIExCmdExtLib, \/*wMajor &#061;*\/ 1, \/*wMinor &#061;*\/ 0&gt;,<br \/>\npublic IExplorerCommand,<br \/>\npublic IEnumExplorerCommand<br \/>\n{<br \/>\npublic:<br \/>\nDECLARE_REGISTRY_RESOURCEID(106)<br \/>\nBEGIN_COM_MAP(CIExCmdMainMenus)<br \/>\nCOM_INTERFACE_ENTRY(IIExCmdMainMenus)<br \/>\nCOM_INTERFACE_ENTRY(IDispatch)<br \/>\nCOM_INTERFACE_ENTRY(IExplorerCommand)<br \/>\nCOM_INTERFACE_ENTRY(IEnumExplorerCommand)<br \/>\nEND_COM_MAP()<br \/>\nDECLARE_PROTECT_FINAL_CONSTRUCT()<br \/>\nHRESULT FinalConstruct()<br \/>\n{<br \/>\nm_subCommands.clear();<br \/>\nfor (int i &#061; 1; i &lt; CMD_END; i&#043;&#043;)<br \/>\n{<\/p>\n<p>CComObject&lt;CIExCmdSubMenus&gt;* pRaw &#061; nullptr;<br \/>\nHRESULT hr &#061; CComObject&lt;CIExCmdSubMenus&gt;::CreateInstance(&amp;pRaw);<br \/>\nif (FAILED(hr))<br \/>\ncontinue;<\/p>\n<p>pRaw-&gt;set_m_size(i);<br \/>\n\/\/ CComPtr \u6784\u9020\u51fd\u6570\u4f1a AddRef&#xff0c;refcount: 0 \u2192 1<br \/>\nCComPtr&lt;CIExCmdSubMenus&gt; pSubCmd(pRaw);<br \/>\nm_subCommands.push_back(pSubCmd);<br \/>\n}<br \/>\nreturn S_OK;<br \/>\n}<\/p>\n<p>void FinalRelease()<br \/>\n{<br \/>\nm_subCommands.clear();<br \/>\n}<\/p>\n<p>private:<br \/>\nsize_t m_currentIndex &#061; 0;<br \/>\nstd::vector&lt;CComPtr&lt;CIExCmdSubMenus&gt;&gt; m_subCommands;<br \/>\npublic:<br \/>\n\/\/ Init<\/p>\n<p>\/\/ IExplorerCommand<br \/>\nIFACEMETHOD(EnumSubCommands)(IEnumExplorerCommand** ppEnum) override<br \/>\n{<br \/>\nif (!ppEnum)<br \/>\nreturn E_POINTER;<\/p>\n<p>m_currentIndex &#061; 0;   \/\/ \u91cd\u7f6e\u679a\u4e3e\u4f4d\u7f6e<br \/>\nthis-&gt;AddRef();        \/\/ \u8fd4\u56de\u524d\u589e\u52a0\u5f15\u7528\u8ba1\u6570<br \/>\n*ppEnum &#061; static_cast&lt;IEnumExplorerCommand*&gt;(this);<br \/>\nreturn S_OK;<br \/>\n}<br \/>\nIFACEMETHOD(GetCanonicalName)(GUID* pguidCommandName)override { *pguidCommandName &#061; GetObjectCLSID(); return S_OK; }<br \/>\nIFACEMETHOD(GetFlags)(EXPCMDFLAGS* pFlags)override { *pFlags &#061; ECF_HASSUBCOMMANDS; return S_OK; }<br \/>\nIFACEMETHOD(GetIcon)(IShellItemArray* psiItemArray, LPWSTR* ppszIcon)override { return SHStrDup(_T(&#034;Resource.dll,201&#034;), ppszIcon); }<br \/>\nIFACEMETHOD(GetState)(IShellItemArray* psiItemArray, BOOL fOkToBeSlow, EXPCMDSTATE* pCmdState)override { *pCmdState &#061; ECS_ENABLED; return S_OK; }<br \/>\nIFACEMETHOD(GetTitle)(IShellItemArray* psiItemArray, LPWSTR* ppszName) override { std::wstring titlename &#061; _T(&#034;IExCmd\u4e3b\u6ce8\u518c&#034;); return SHStrDup(titlename.c_str(), ppszName); }<br \/>\nIFACEMETHOD(GetToolTip)(IShellItemArray* psiItemArray, LPWSTR* ppszInfotip)override { std::wstring tooltip &#061; _T(&#034;IExplorerCommand\u6ce8\u518c\u4e3b\u7a0b\u5e8f&#034;); return SHStrDup(tooltip.c_str(), ppszInfotip); }<br \/>\nIFACEMETHOD(Invoke)(IShellItemArray* psiItemArray, IBindCtx* pbc) override { return E_NOTIMPL; }<br \/>\n\/\/ IEnumExplorerCommand<br \/>\nIFACEMETHOD(Clone)(IEnumExplorerCommand** ppenum) override<br \/>\n{<br \/>\n*ppenum &#061; NULL;<br \/>\nCComObject&lt;CIExCmdMainMenus&gt;* pNew;<br \/>\nHRESULT hr &#061; CComObject&lt;CIExCmdMainMenus&gt;::CreateInstance(&amp;pNew);<br \/>\nif (SUCCEEDED(hr)) {<br \/>\npNew-&gt;AddRef();<br \/>\npNew-&gt;m_currentIndex &#061; m_currentIndex;<br \/>\npNew-&gt;m_subCommands &#061; m_subCommands;  \/\/ \u5171\u4eab\u5b50\u547d\u4ee4<br \/>\n*ppenum &#061; static_cast&lt;IEnumExplorerCommand*&gt;(pNew);<br \/>\n}<br \/>\nreturn hr;<br \/>\n}<br \/>\nIFACEMETHOD(Next)(ULONG celt, IExplorerCommand** pUICommand, ULONG* pceltFetched) override<br \/>\n{<br \/>\nif (!pUICommand)<br \/>\nreturn E_POINTER;<br \/>\nULONG fetched &#061; 0;<br \/>\nwhile (fetched &lt; celt &amp;&amp; m_currentIndex &lt; m_subCommands.size()) {<br \/>\npUICommand[fetched] &#061; m_subCommands[m_currentIndex];<br \/>\npUICommand[fetched]-&gt;AddRef(); \/\/ \u5fc5\u987b\u589e\u52a0\u5f15\u7528\u8ba1\u6570<br \/>\nm_currentIndex&#043;&#043;;<br \/>\nfetched&#043;&#043;;<br \/>\n}<br \/>\nif (pceltFetched) *pceltFetched &#061; fetched;<br \/>\nreturn (fetched &#061;&#061; celt) ? S_OK : S_FALSE;<br \/>\n}<br \/>\nIFACEMETHOD(Reset)() override { m_currentIndex &#061; 0; return S_OK; }<br \/>\nIFACEMETHOD(Skip)(ULONG celt) override { return E_NOTIMPL; }<br \/>\n\/\/ Private<\/p>\n<p>};<\/p>\n<p>OBJECT_ENTRY_AUTO(__uuidof(IExCmdMainMenus), CIExCmdMainMenus)<\/p>\n<h4 id=\"IExCmdSubMenus.h\">IExCmdSubMenus.h<\/h4>\n<p>\/\/ IExCmdSubMenus.h: CIExCmdSubMenus \u7684\u58f0\u660e<\/p>\n<p>#pragma once<br \/>\n#include &lt;string&gt;<br \/>\n#include &lt;vector&gt;<br \/>\n#include &#034;resource.h&#034;       \/\/ \u4e3b\u7b26\u53f7<br \/>\n#include &lt;ShlObj_core.h&gt;<br \/>\n#include &#034;DllRegIExCmdExt_i.h&#034;<\/p>\n<p>#if defined(_WIN32_WCE) &amp;&amp; !defined(_CE_DCOM) &amp;&amp; !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)<br \/>\n#error &#034;Windows CE \u5e73\u53f0(\u5982\u4e0d\u63d0\u4f9b\u5b8c\u5168 DCOM \u652f\u6301\u7684 Windows Mobile \u5e73\u53f0)\u4e0a\u65e0\u6cd5\u6b63\u786e\u652f\u6301\u5355\u7ebf\u7a0b COM \u5bf9\u8c61\u3002\u5b9a\u4e49 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA \u53ef\u5f3a\u5236 ATL \u652f\u6301\u521b\u5efa\u5355\u7ebf\u7a0b COM \u5bf9\u8c61\u5b9e\u73b0\u5e76\u5141\u8bb8\u4f7f\u7528\u5176\u5355\u7ebf\u7a0b COM \u5bf9\u8c61\u5b9e\u73b0\u3002rgs \u6587\u4ef6\u4e2d\u7684\u7ebf\u7a0b\u6a21\u578b\u5df2\u88ab\u8bbe\u7f6e\u4e3a\u201cFree\u201d&#xff0c;\u539f\u56e0\u662f\u8be5\u6a21\u578b\u662f\u975e DCOM Windows CE \u5e73\u53f0\u652f\u6301\u7684\u552f\u4e00\u7ebf\u7a0b\u6a21\u578b\u3002&#034;<br \/>\n#endif<\/p>\n<p>using namespace ATL;<\/p>\n<p>enum MyCmd {<br \/>\nCMD_ROOT &#061; 0,          \/\/\/&lt; \u6839\u547d\u4ee4<br \/>\nCMD_REG,            \/\/\/&lt; \u6ce8\u518c<br \/>\nCMD_UREG,         \/\/\/&lt; \u53cd\u6ce8\u518c<br \/>\nCMD_END             \/\/\/&lt; \u7ed3\u675f<br \/>\n};<br \/>\nstruct ExplorerCommand {<br \/>\nGUID            guid;<br \/>\nEXPCMDFLAGS     flags; \/\/\/&lt; GetFlags<br \/>\nconst TCHAR* icon;         \/\/\/&lt; GetIcon<br \/>\nEXPCMDSTATE     state; \/\/\/&lt; GetState<br \/>\nconst TCHAR* title;          \/\/\/&lt; GetTitle<br \/>\nconst TCHAR* tooltip;     \/\/\/&lt; GetToolTip<br \/>\n};<\/p>\n<p>const ExplorerCommand IExCmdInfoRegistry[CMD_END] &#061; {<br \/>\n{<br \/>\n{ 0, 0, 0, {0,0,0,0,0,0,0,0} },   \/\/ guid<br \/>\nECF_DEFAULT,                        \/\/ flags<br \/>\nnullptr,                            \/\/ icon<br \/>\nECS_ENABLED,                        \/\/ state<br \/>\nnullptr,                            \/\/ title<br \/>\nnullptr                            \/\/ tooltip<br \/>\n},<br \/>\n{<br \/>\n\/\/ {5087E382-421C-487A-841E-4B219BDA0DD4}<br \/>\n{0x5087e382, 0x421c, 0x487a, { 0x84, 0x1e, 0x4b, 0x21, 0x9b, 0xda, 0xd, 0xd4 }},<br \/>\nECF_DEFAULT,<br \/>\nnullptr,<br \/>\nECS_ENABLED,<br \/>\n_T(&#034;\u6ce8\u518c\u7ec4\u4ef6&#034;),<br \/>\n_T(&#034;\u6ce8\u518c\u7ec4\u4ef6&#034;)<br \/>\n},<br \/>\n\/\/ \u2500\u2500 \u6ce8\u9500\u7ec4\u4ef6 \u2500\u2500<br \/>\n{<br \/>\n\/\/ {39FB48D9-5E73-4533-B0C3-565857AFF622}<br \/>\n{ 0x39fb48d9, 0x5e73, 0x4533, { 0xb0, 0xc3, 0x56, 0x58, 0x57, 0xaf, 0xf6, 0x22 } },<br \/>\nECF_DEFAULT,<br \/>\n_T(&#034;&#034;),<br \/>\nECS_ENABLED,<br \/>\n_T(&#034;\u6ce8\u9500\u7ec4\u4ef6&#034;),<br \/>\n_T(&#034;\u6ce8\u9500\u7ec4\u4ef6&#034;)<br \/>\n},<br \/>\n};<br \/>\n\/\/ CIExCmdSubMenus<\/p>\n<p>class ATL_NO_VTABLE CIExCmdSubMenus :<br \/>\npublic CComObjectRootEx&lt;CComSingleThreadModel&gt;,<br \/>\npublic CComCoClass&lt;CIExCmdSubMenus, &amp;CLSID_IExCmdSubMenus&gt;,<br \/>\npublic IDispatchImpl&lt;IIExCmdSubMenus, &amp;IID_IIExCmdSubMenus, &amp;LIBID_DllRegIExCmdExtLib, \/*wMajor &#061;*\/ 1, \/*wMinor &#061;*\/ 0&gt;,<br \/>\npublic IExplorerCommand<br \/>\n{<br \/>\npublic:<br \/>\nCIExCmdSubMenus()<br \/>\n{<br \/>\n}<\/p>\n<p>DECLARE_REGISTRY_RESOURCEID(107)<\/p>\n<p>BEGIN_COM_MAP(CIExCmdSubMenus)<br \/>\nCOM_INTERFACE_ENTRY(IIExCmdSubMenus)<br \/>\nCOM_INTERFACE_ENTRY(IDispatch)<br \/>\nCOM_INTERFACE_ENTRY(IExplorerCommand)<br \/>\nEND_COM_MAP()<\/p>\n<p>DECLARE_PROTECT_FINAL_CONSTRUCT()<\/p>\n<p>HRESULT FinalConstruct()<br \/>\n{<\/p>\n<p>return S_OK;<br \/>\n}<\/p>\n<p>void FinalRelease()<br \/>\n{<br \/>\n}<br \/>\nprivate:<br \/>\nsize_t m_size_&#061;NULL;<br \/>\npublic:<br \/>\nvoid set_m_size(size_t m_size) { m_size_ &#061; m_size; }<br \/>\n\/\/ IExplorerCommand<br \/>\nIFACEMETHOD(EnumSubCommands)(IEnumExplorerCommand** ppEnum) override { *ppEnum &#061; nullptr; return E_NOTIMPL; }<br \/>\nIFACEMETHOD(GetCanonicalName)(GUID* pguidCommandName) { *pguidCommandName &#061;IExCmdInfoRegistry[m_size_].guid; return S_OK; }<br \/>\nIFACEMETHOD(GetFlags)(EXPCMDFLAGS* pFlags) { *pFlags &#061; ECF_DEFAULT; return S_OK; }<br \/>\nIFACEMETHOD(GetIcon)(IShellItemArray* psiItemArray, LPWSTR* ppszIcon) { return SHStrDup(IExCmdInfoRegistry[m_size_].icon, ppszIcon); }<br \/>\nIFACEMETHOD(GetState)(IShellItemArray* psiItemArray, BOOL fOkToBeSlow, EXPCMDSTATE* pCmdState) { *pCmdState &#061; ECS_ENABLED; return S_OK; }<br \/>\nIFACEMETHOD(GetTitle)(IShellItemArray* psiItemArray, LPWSTR* ppszName) { std::wstring titlename &#061; IExCmdInfoRegistry[m_size_].title; return SHStrDup(titlename.c_str(), ppszName); }<br \/>\nIFACEMETHOD(GetToolTip)(IShellItemArray* psiItemArray, LPWSTR* ppszInfotip) { std::wstring tooltip &#061; IExCmdInfoRegistry[m_size_].tooltip; return SHStrDup(tooltip.c_str(), ppszInfotip); }<br \/>\nIFACEMETHOD(Invoke)(IShellItemArray* psiItemArray, IBindCtx* pbc) override;<\/p>\n<p>};<\/p>\n<p>OBJECT_ENTRY_AUTO(__uuidof(IExCmdSubMenus), CIExCmdSubMenus)<\/p>\n<h4 id=\"IExCmdSubMenus.cpp\">IExCmdSubMenus.cpp<\/h4>\n<p>\/\/ IExCmdSubMenus.cpp: CIExCmdSubMenus \u7684\u5b9e\u73b0<\/p>\n<p>#include &#034;pch.h&#034;<br \/>\n#include &#034;IExCmdSubMenus.h&#034;<\/p>\n<p>\/\/ CIExCmdSubMenus<\/p>\n<p>IFACEMETHODIMP CIExCmdSubMenus::Invoke(IShellItemArray* psiItemArray, IBindCtx* pbc)<br \/>\n{<br \/>\n\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n\/\/ \u4e00\u3001\u53c2\u6570\u6821\u9a8c<br \/>\n\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\nif (!psiItemArray)<br \/>\nreturn E_INVALIDARG;<\/p>\n<p>\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n\/\/ \u4e8c\u3001\u4ece psiItemArray \u83b7\u53d6\u9009\u4e2d\u9879\u6570\u91cf<br \/>\n\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\nDWORD dwCount &#061; 0;<br \/>\nHRESULT hr &#061; psiItemArray-&gt;GetCount(&amp;dwCount);<br \/>\nif (FAILED(hr) || dwCount &#061;&#061; 0)<br \/>\nreturn S_OK; \/\/ \u6ca1\u6709\u9009\u4e2d\u9879&#xff0c;\u9759\u9ed8\u8fd4\u56de<br \/>\n\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n\/\/ \u4e09\u3001\u65b9\u5f0f\u4e00&#xff1a;\u901a\u8fc7 GetItemAt \u6309\u7d22\u5f15\u904d\u5386&#xff08;\u63a8\u8350&#xff0c;\u7b80\u5355\u76f4\u89c2&#xff09;<br \/>\n\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\nstd::vector&lt;std::wstring&gt; filePaths;<br \/>\nfilePaths.reserve(dwCount);<\/p>\n<p>for (DWORD i &#061; 0; i &lt; dwCount; &#043;&#043;i)<br \/>\n{<br \/>\nCComPtr&lt;IShellItem&gt; psi;<br \/>\nhr &#061; psiItemArray-&gt;GetItemAt(i, &amp;psi);<br \/>\nif (FAILED(hr) || !psi)<br \/>\ncontinue;<\/p>\n<p>\/\/ &#8212;&#8212; 3.1 \u83b7\u53d6\u6587\u4ef6\u7cfb\u7edf\u5b8c\u6574\u8def\u5f84&#xff08;\u6700\u5e38\u7528&#xff09; &#8212;&#8212;<br \/>\nPWSTR pszPath &#061; nullptr;<br \/>\nhr &#061; psi-&gt;GetDisplayName(SIGDN_FILESYSPATH, &amp;pszPath);<br \/>\nif (SUCCEEDED(hr) &amp;&amp; pszPath)<br \/>\n{<br \/>\nfilePaths.emplace_back(pszPath);<br \/>\nCoTaskMemFree(pszPath); \/\/ \u5fc5\u987b\u91ca\u653e&#xff01;<br \/>\n}<br \/>\nelse<br \/>\n{<br \/>\n\/\/ \u975e\u6587\u4ef6\u7cfb\u7edf\u9879&#xff08;\u5982\u865a\u62df\u6587\u4ef6\u5939&#xff09;&#xff0c;\u56de\u9000\u83b7\u53d6\u663e\u793a\u540d\u79f0<br \/>\nPWSTR pszName &#061; nullptr;<br \/>\nhr &#061; psi-&gt;GetDisplayName(SIGDN_NORMALDISPLAY, &amp;pszName);<br \/>\nif (SUCCEEDED(hr) &amp;&amp; pszName)<br \/>\n{<br \/>\nfilePaths.emplace_back(pszName);<br \/>\nCoTaskMemFree(pszName);<br \/>\n}<br \/>\n}<\/p>\n<p>\/\/ &#8212;&#8212; 3.2 \u83b7\u53d6\u9879\u7684\u5c5e\u6027\u6807\u5fd7&#xff08;\u5224\u65ad\u662f\u6587\u4ef6\u8fd8\u662f\u6587\u4ef6\u5939&#xff09; &#8212;&#8212;<br \/>\nSFGAOF sfgaoAttrs &#061; 0;<br \/>\nhr &#061; psi-&gt;GetAttributes(<br \/>\nSFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_LINK,<br \/>\n&amp;sfgaoAttrs);<br \/>\nif (SUCCEEDED(hr))<br \/>\n{<br \/>\nbool bIsFolder &#061; (sfgaoAttrs &amp; SFGAO_FOLDER) !&#061; 0;<br \/>\nbool bIsFileSystem &#061; (sfgaoAttrs &amp; SFGAO_FILESYSTEM) !&#061; 0;<br \/>\nbool bIsLink &#061; (sfgaoAttrs &amp; SFGAO_LINK) !&#061; 0;<br \/>\n\/\/ \u53ef\u6839\u636e bIsFolder \/ bIsFileSystem \/ bIsLink \u505a\u5206\u652f\u5904\u7406<br \/>\n}<br \/>\n}<br \/>\nSHELLEXECUTEINFO RegCmdInfo;<br \/>\nstd::wstring cmd;<br \/>\nfor (const auto&amp; path : filePaths)<br \/>\n{<br \/>\ncmd &#061; (m_size_ &#061;&#061; CMD_REG)<br \/>\n? L&#034;\\\\&#034;&#034; &#043; path &#043; L&#034;\\\\&#034;&#034;       \/\/ \u6ce8\u518c&#xff1a;\u4ec5\u4f20\u9012DLL\u8def\u5f84<br \/>\n: L&#034;\/u \\\\&#034;&#034; &#043; path &#043; L&#034;\\\\&#034;&#034;;   \/\/ \u53cd\u6ce8\u518c&#xff1a;\u6dfb\u52a0 \/u \u53c2\u6570<br \/>\nRegCmdInfo &#061; {<br \/>\nsizeof(SHELLEXECUTEINFO),<br \/>\nSEE_MASK_DEFAULT,<br \/>\nnullptr,<br \/>\n_T(&#034;runas&#034;),<br \/>\n_T(&#034;regsvr32.exe&#034;),<br \/>\ncmd.c_str(),<br \/>\nNULL,<br \/>\nSW_SHOW,<br \/>\nnullptr,<br \/>\nnullptr,<br \/>\nnullptr,<br \/>\nnullptr<br \/>\n};<br \/>\nBOOL hInst &#061; ShellExecuteEx(&amp;RegCmdInfo);<br \/>\nif (!hInst)<br \/>\n{<br \/>\nreturn E_FAIL;<br \/>\n}<br \/>\n}<\/p>\n<p>return S_OK;<\/p>\n<p>}<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u76ee\u5f55<br \/>\nIContextMenu\u591a\u7ea7\u53f3\u952e\u83dc\u5355<br \/>\n\u7b80\u8ff0<br \/>\n\u7ed3\u6784<br \/>\n\u6848\u4f8b<br \/>\nIExplorerCommand\u591a\u7ea7\u83dc\u5355<br \/>\n\u7b80\u8ff0<br \/>\n\u7ed3\u6784<br \/>\n\u65b9\u6cd5\u51fd\u6570\u8be6\u89e3<br \/>\n\u65b9\u6cd5\u51fd\u6570<br \/>\n\u65b9\u6cd5\u8be6\u89e3<br \/>\n\u5e38\u7528\u65b9\u6cd5\u6848\u4f8b&#xff08;\u4fbf\u4e8e\u76f4\u63a5\u590d\u5236\u4f7f\u7528&#xff09;<br \/>\n\u6848\u4f8b<br \/>\n\u6587\u4ef6\u7ed3\u6784<br \/>\nIExCmdMainMenus.h<br \/>\nIExCmdSubMenus.h<br \/>\nIExCmdSubMenus.cpp IContextMenu\u591a\u7ea7\u53f3\u952e\u83dc\u5355 \u7b80\u8ff0<br \/>\nIContextMenu&#xff08;\u65e7\u7248\u83dc\u5355&#xff09;\u7684<\/p>\n","protected":false},"author":2,"featured_media":93669,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[10336,55,666,149,2076],"topic":[],"class_list":["post-93670","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server","tag-10336","tag-c","tag-microsoft","tag-windows","tag-2076"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>windows \u591a\u7ea7\u53f3\u952e\u83dc\u5355(\u65b0\u7248\u83dc\u5355IExplorerCommand\u548c\u65e7\u7248\u83dc\u5355IContextMenu) - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/93670.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"windows \u591a\u7ea7\u53f3\u952e\u83dc\u5355(\u65b0\u7248\u83dc\u5355IExplorerCommand\u548c\u65e7\u7248\u83dc\u5355IContextMenu) - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u76ee\u5f55 IContextMenu\u591a\u7ea7\u53f3\u952e\u83dc\u5355 \u7b80\u8ff0 \u7ed3\u6784 \u6848\u4f8b IExplorerCommand\u591a\u7ea7\u83dc\u5355 \u7b80\u8ff0 \u7ed3\u6784 \u65b9\u6cd5\u51fd\u6570\u8be6\u89e3 \u65b9\u6cd5\u51fd\u6570 \u65b9\u6cd5\u8be6\u89e3 \u5e38\u7528\u65b9\u6cd5\u6848\u4f8b&#xff08;\u4fbf\u4e8e\u76f4\u63a5\u590d\u5236\u4f7f\u7528&#xff09; \u6848\u4f8b \u6587\u4ef6\u7ed3\u6784 IExCmdMainMenus.h IExCmdSubMenus.h IExCmdSubMenus.cpp IContextMenu\u591a\u7ea7\u53f3\u952e\u83dc\u5355 \u7b80\u8ff0 IContextMenu&#xff08;\u65e7\u7248\u83dc\u5355&#xff09;\u7684\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/93670.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-12T16:48:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/08\/20260812164855-6a7ca3f7c8bbc.png\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/93670.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/93670.html\",\"name\":\"windows \u591a\u7ea7\u53f3\u952e\u83dc\u5355(\u65b0\u7248\u83dc\u5355IExplorerCommand\u548c\u65e7\u7248\u83dc\u5355IContextMenu) - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-08-12T16:48:57+00:00\",\"dateModified\":\"2026-08-12T16:48:57+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/93670.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/93670.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/93670.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"windows \u591a\u7ea7\u53f3\u952e\u83dc\u5355(\u65b0\u7248\u83dc\u5355IExplorerCommand\u548c\u65e7\u7248\u83dc\u5355IContextMenu)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"windows \u591a\u7ea7\u53f3\u952e\u83dc\u5355(\u65b0\u7248\u83dc\u5355IExplorerCommand\u548c\u65e7\u7248\u83dc\u5355IContextMenu) - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/93670.html","og_locale":"zh_CN","og_type":"article","og_title":"windows \u591a\u7ea7\u53f3\u952e\u83dc\u5355(\u65b0\u7248\u83dc\u5355IExplorerCommand\u548c\u65e7\u7248\u83dc\u5355IContextMenu) - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u76ee\u5f55 IContextMenu\u591a\u7ea7\u53f3\u952e\u83dc\u5355 \u7b80\u8ff0 \u7ed3\u6784 \u6848\u4f8b IExplorerCommand\u591a\u7ea7\u83dc\u5355 \u7b80\u8ff0 \u7ed3\u6784 \u65b9\u6cd5\u51fd\u6570\u8be6\u89e3 \u65b9\u6cd5\u51fd\u6570 \u65b9\u6cd5\u8be6\u89e3 \u5e38\u7528\u65b9\u6cd5\u6848\u4f8b&#xff08;\u4fbf\u4e8e\u76f4\u63a5\u590d\u5236\u4f7f\u7528&#xff09; \u6848\u4f8b \u6587\u4ef6\u7ed3\u6784 IExCmdMainMenus.h IExCmdSubMenus.h IExCmdSubMenus.cpp IContextMenu\u591a\u7ea7\u53f3\u952e\u83dc\u5355 \u7b80\u8ff0 IContextMenu&#xff08;\u65e7\u7248\u83dc\u5355&#xff09;\u7684","og_url":"https:\/\/www.wsisp.com\/helps\/93670.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-08-12T16:48:57+00:00","og_image":[{"url":"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/08\/20260812164855-6a7ca3f7c8bbc.png"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"13 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/93670.html","url":"https:\/\/www.wsisp.com\/helps\/93670.html","name":"windows \u591a\u7ea7\u53f3\u952e\u83dc\u5355(\u65b0\u7248\u83dc\u5355IExplorerCommand\u548c\u65e7\u7248\u83dc\u5355IContextMenu) - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-08-12T16:48:57+00:00","dateModified":"2026-08-12T16:48:57+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/93670.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/93670.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/93670.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"windows \u591a\u7ea7\u53f3\u952e\u83dc\u5355(\u65b0\u7248\u83dc\u5355IExplorerCommand\u548c\u65e7\u7248\u83dc\u5355IContextMenu)"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/93670","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=93670"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/93670\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media\/93669"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=93670"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=93670"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=93670"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=93670"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}