不使用ATL,如何使用IShellIconOverlayIdentifier组件?
我实现了一个Shell扩展,需要增加一个像SVN标识文件状态的功能,我定义了一个类如下:
并且在IShellFolder组件 函数里面GetUIObjectOf、CreateViewObject都使用了下面的代码
注册表也增加成功了,但是调试的时候发现根本就没有走到
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);
}里面,请问有谁知道怎么回事么
...全文
相关推荐
基于ATL的COM组件开发实例(VS2010)
使用ATL工具设计COM组件实现对串口的操作
COM初学者,使用ATL创建COM组件
初学COM,使用ATL创建COM组件,并测试COM组件的小例子
VS2012创建ATL工程及使用MFC测试COM组件
这篇文章首先介绍了如何创建一个ATL工程,并为其添加接口类和实现接口方法;然后介绍了如何利用自动化的方式调用由ATL生成的dll,即在程序中获取CLSID和IID然后创建接口实例;最后分析了在程序中CLSID和IID获取时候的索引,由于.idl文件中库声明中接口类的声明顺序不一样,就导致了获取类型信息时候的索引不一样,这在自动化COM组件的使用中需要注意。
使用属性ATL构建丰富的组件
有关如何使用归因ATL构建具有丰富功能的组件的教程文章。
ATL设计组件
使用ATL设计组件,写了例子和测试例子,简单明了。


非技术区
