繁体   English   中英

图标处理程序外壳扩展未调用

[英]Icon Handler Shell Extension not called

我使用VS2015和ATL项目向导编写了Shell Extension Icon处理程序 我创建了一个COM对象来公开IPersistIExtractIcon接口。 当我查看特定文件类型的注册表项时,可以看到该处理程序已注册。 这是该类的样子:

class ATL_NO_VTABLE CIconHandlerExt :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CIconHandlerExt, &CLSID_IconHandlerExt>,
    public IIconHandlerExt,
    public IPersistFile,
    public IExtractIcon
{
public:
    CIconHandlerExt()
    {
    }

    DECLARE_PROTECT_FINAL_CONSTRUCT()

    HRESULT FinalConstruct()
    {
        return S_OK;
    }

    void FinalRelease()
    {
    }

DECLARE_REGISTRY_RESOURCEID(IDR_ICONHANDLEREXT)

DECLARE_NOT_AGGREGATABLE(CIconHandlerExt)

BEGIN_COM_MAP(CIconHandlerExt)
    COM_INTERFACE_ENTRY(IIconHandlerExt)
    COM_INTERFACE_ENTRY(IPersistFile)
    COM_INTERFACE_ENTRY(IExtractIcon)
END_COM_MAP()

// IIconHandlerExt
public:

    // IExtractIcon
    STDMETHODIMP GetIconLocation(UINT uFlags, LPTSTR szIconFile, UINT cchMax, int* piIndex, UINT* pwFlags);
    STDMETHODIMP Extract(LPCTSTR pszFile, UINT nIconIndex, HICON* phiconLarge, HICON* phiconSmall, UINT nIconSize);

public:
    // IPersistFile
    //xxxSTDMETHOD(GetClassID)(CLSID*) { return E_NOTIMPL; }
    STDMETHOD(GetClassID)(CLSID *pClsId) { *pClsId = CLSID_IconHandlerExt;  return S_OK; }
    STDMETHOD(IsDirty)() { return E_NOTIMPL; }
    STDMETHOD(Save)(LPCOLESTR, BOOL) { return E_NOTIMPL; }
    STDMETHOD(SaveCompleted)(LPCOLESTR) { return E_NOTIMPL; }
    STDMETHOD(GetCurFile)(LPOLESTR*) { return E_NOTIMPL; }
    STDMETHOD(Load)(LPCOLESTR wszFile, DWORD /*dwMode*/)
    {
        USES_CONVERSION;
        lstrcpyn(m_szFilename, OLE2CT(wszFile), MAX_PATH);
        return S_OK;
    }

protected:
    TCHAR     m_szFilename[MAX_PATH];  // Full path to the file in question.

};

OBJECT_ENTRY_AUTO(__uuidof(IconHandlerExt), CIconHandlerExt)

我使用了这篇文章中的说明来启动调试会话。 即,我单击任务栏,单击Alt-F4,按Ctrl-Alt-Shift-Escape,然后启动将Windows资源管理器指定为命令目标的调试器会话。 我设置断点并导航到测试文件。

我的处理程序永远不会加载,因为没有命中断点,他们说

“断点目前不会被击中。 该文档尚未加载任何符号。”

任何人都可以阐明为什么我的扩展程序无法加载吗?

这个问题已经解决。

Shell扩展程序需要更新向导生成的注册表脚本,以标识应用于特定文件类型的处理程序。 我没有注意我正在更新的密钥(从注册表脚本中)并更新了错误的密钥。 就我而言,我试图为其添加处理程序的文件类型为“ mcam”。 因此,我更新了“ HKCR.mcam”键。 这是不正确的,因为此初始键的目的是(通过“ mcamFile”子键)指向确定要加载哪个处理程序的实际注册表键。 更改脚本以更新“ HKCR \\ mcamFile”密钥后,处理程序已加载,并且能够调试代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM