2016-08-29 9 views
0

VS2015 및 ATL 프로젝트 마법사를 사용하여 셸 확장자 Icon handler을 작성했습니다. IPersistIExtractIcon 인터페이스를 노출하는 COM 개체를 만들었습니다. 특정 파일 형식에 대한 레지스트리 항목을 보면 핸들러가 등록 된 것을 볼 수 있습니다. 내가 디버깅 세션을 시작 this 포스트의 지침을 사용아이콘 처리기 셸 확장이 호출되지 않았습니다.

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-Esc를 누르고 Windows 탐색기를 명령 대상으로 지정하는 디버거 세션을 시작합니다. 중단 점을 설정하고 테스트 파일을 탐색합니다. 중단 점 적중되지 않기 때문에

내 핸들러는로드되지 않습니다 그들은

는 "중단 점을 현재 히트되지 않습니다 말한다. 이 문서에 기호가 없습니다. "

내 확장 프로그램이로드되지 않는 이유에 대해 알려줄 수 있습니까?

답변

0

이 질문은 해결되었습니다.

셸 확장에서는 마법사가 생성 한 레지스트리 스크립트를 업데이트하여 특정 파일 형식에 사용해야하는 처리기를 식별해야합니다. 나는 (레지스트리 스크립트 내에서) 업데이트하고 있던 키에주의를 기울이지 않았고 키를 업데이트했다. 제 경우에는 처리기를 추가하려고하는 파일 형식이 "mcam"이었습니다. 그래서 "HKCR.mcam"키를 업데이트했습니다. 이 초기 키의 목적은로드 할 처리기를 결정하는 실제 레지스트리 키를 가리키는 것입니다 ("mcamFile"하위 키를 통해). "HKCR \ mcamFile"키를 업데이트하도록 스크립트를 변경하면 핸들러가로드되고 코드를 디버그 할 수있었습니다.