不使用ATL,如何使用IShellIconOverlayIdentifier组件?

一魅 一魅 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我实现了一个Shell扩展,需要增加一个像SVN标识文件状态的功能,我定义了一个类如下:
class ATL_NO_VTABLE COverlayIcon : 
public CComObjectRootEx<CComSingleThreadModel>,
public IShellIconOverlayIdentifier
{
public:
COverlayIcon()
{
}

CRefPtr<CShellFolder> m_spFolder;


BEGIN_COM_MAP(COverlayIcon)
COM_INTERFACE_ENTRY(IShellIconOverlayIdentifier)
END_COM_MAP()

HRESULT Init(CShellFolder* pFolder);

// IShellIconOverlayIdentifier Methods
STDMETHOD(GetOverlayInfo)(LPWSTR pwszIconFile,int cchMax,int *pIndex,DWORD* pdwFlags);
STDMETHOD(GetPriority)(int* pPriority);
STDMETHOD(IsMemberOf)(LPCWSTR pwszPath,DWORD dwAttrib);

HRESULT FinalConstruct()
{
return S_OK;
}

void FinalRelease()
{
}

public:

};


STDMETHODIMP COverlayIcon::GetOverlayInfo(
LPWSTR pwszIconFile,
int cchMax,int* pIndex,
DWORD* pdwFlags)
{
return S_OK;
}

// IShellIconOverlayIdentifier Method Implementation

// returns the priority of this overlay 0 being the highest.
// this overlay is always selected do to its high priority
STDMETHODIMP COverlayIcon::GetPriority(int* pPriority)
{
// highest priority
*pPriority=0;
return S_OK;
}

// IShellIconOverlayIdentifier Method Implementation
// IShellIconOverlayIdentifier::IsMemberOf
// Returns Whether the object should have this overlay or not
STDMETHODIMP COverlayIcon::IsMemberOf(LPCWSTR pwszPath, DWORD dwAttrib)
{
return S_OK;
}


并且在IShellFolder组件 函数里面GetUIObjectOf、CreateViewObject都使用了下面的代码
		if (riid == IID_IShellIconOverlayIdentifier)
{
DMMessageBox(NULL,L"1",L"2",0);
CComObject<COverlayIcon>* pOverlayIcon = NULL;
HR( CComObject<COverlayIcon>::CreateInstance(&pOverlayIcon) );
CComPtr<IUnknown> spKeepAlive = pOverlayIcon->GetUnknown();
HR( pOverlayIcon->Init(this) );
return pOverlayIcon->QueryInterface(riid, ppRetVal);
}


注册表也增加成功了,但是调试的时候发现根本就没有走到
		if (riid == IID_IShellIconOverlayIdentifier)
{
DMMessageBox(NULL,L"1",L"2",0);
CComObject<COverlayIcon>* pOverlayIcon = NULL;
HR( CComObject<COverlayIcon>::CreateInstance(&pOverlayIcon) );
CComPtr<IUnknown> spKeepAlive = pOverlayIcon->GetUnknown();
HR( pOverlayIcon->Init(this) );
return pOverlayIcon->QueryInterface(riid, ppRetVal);
}
里面,请问有谁知道怎么回事么
...全文
评论 1
收藏 已收藏
分享
返回顶部
一魅
非技术区 1,510 成员 11,417 内容