2016-08-29 9 views
0

Я использовал VS2015 и мастер проекта ATL для написания расширения оболочки Icon handler. Я создал COM-объект, чтобы выставить IPersist и Интерфейсы IExtractIcon. Я вижу, что обработчик зарегистрирован, когда я смотрю запись реестра для определенного типа файла. Вот что класс выглядит следующим образом:Расширение оболочки Icon Handler не называется

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 в качестве целевой команды. Я установил точки останова и перейду к тестовому файлу.

Мой обработчик никогда не загружен, так как контрольные точки не хит, и они говорят

«Точка останова будет не в настоящее время будет хит. Никаких символов не было , загруженных для этого документа. "

Может ли кто-нибудь пролить свет на то, почему мое расширение не загружается?

ответ

0

Этот вопрос был решен.

Расширение Shell требует внесения изменений в созданный мастером сценарий реестра, чтобы идентифицировать обработчик, который должен использоваться для конкретного типа файла. Я не обращал внимания на ключ, который я обновлял (из скрипта реестра), и обновил неправильный ключ. В моем случае тип файла, который я пытался добавить обработчиком, был «mcam». Итак, я обновил ключ «HKCR.mcam». Это неверно, поскольку цель этого начального ключа состоит в том, чтобы указать (через подкачку «mcamFile») на фактический раздел реестра, который определяет, какой обработчик загружается. Как только я сменил скрипт на обновление ключа «HKCR \ mcamFile», обработчик был загружен, и я смог отладить мой код.

 Смежные вопросы

  • Нет связанных вопросов^_^