未调用图标处理程序Shell扩展

时间:2016-08-29 14:51:23

标签: c++ windows-8 com atl shell-extensions

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

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)

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

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

  

“断点当前不会被击中。没有符号   已加载此文档。“

有人可以解释为什么我的扩展程序无法加载吗?

1 个答案:

答案 0 :(得分:0)

这个问题已经解决了。

Shell扩展需要对向导生成的注册表脚本进行更新,以标识应该用于特定文件类型的处理程序。我没有注意我正在更新的密钥(来自注册表脚本)并更新了错误的密钥。在我的例子中,我试图添加处理程序的文件类型是“mcam”。所以,我更新了“HKCR.mcam”键。这是不正确的,因为此初始密钥的目的是将(通过“mcamFile”子键)指向确定要加载的处理程序的实际注册表项。一旦我更改了脚本以更新“HKCR \ mcamFile”键,处理程序就被加载了,我能够调试我的代码。