VS2015 및 ATL 프로젝트 마법사를 사용하여 셸 확장자 Icon handler을 작성했습니다. IPersist 및 IExtractIcon 인터페이스를 노출하는 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 탐색기를 명령 대상으로 지정하는 디버거 세션을 시작합니다. 중단 점을 설정하고 테스트 파일을 탐색합니다. 중단 점 적중되지 않기 때문에
내 핸들러는로드되지 않습니다 그들은
는 "중단 점을 현재 히트되지 않습니다 말한다. 이 문서에 기호가 없습니다. "
내 확장 프로그램이로드되지 않는 이유에 대해 알려줄 수 있습니까?