вам нужно реализовать IObjectWithSite
интерфейс o вашего объекта контекстного меню:
class CMenuExtension : IShellExtInit, IContextMenu, IObjectWithSite {.. };
в результате SetSite
будет вызываться после CMenuExtension::Initialize
и до CMenuExtension::QueryContextMenu
.здесь вы можете использовать переданный pUnkSite
для получения интерфейса IFolderView
и / или IShellView
.что-то вроде этого
virtual HRESULT STDMETHODCALLTYPE SetSite(
/* [in] */ __RPC__in_opt IUnknown *pUnkSite)
{
if (_pUnkSite)
{
_pUnkSite->Release();
if (_pfv)
{
_pfv->Release();
_pfv = 0;
}
}
_pUnkSite = pUnkSite;
if (pUnkSite)
{
pUnkSite->AddRef();
IServiceProvider* psp;
if (0 <= pUnkSite->QueryInterface(IID_PPV_ARGS(&psp)))
{
IFolderView* pfv;
if (0 <= psp->QueryService(__uuidof(IFolderView), IID_PPV_ARGS(&pfv)))
{
_pfv = pfv;
IShellFolder* psf;
if (0 <= pfv->GetFolder(IID_PPV_ARGS(&psf)))
{
STRRET sr;
if (0 <= psf->GetDisplayNameOf(0, SHGDN_FORPARSING , &sr))
{
...
}
psf->Release();
}
}
psp->Release();
}
}
return S_OK;
}
, поэтому вам нужно сначала спросить интерфейс сайта для IServiceProvider
интерфейса, а затем позвонить
QueryService(__uuidof(IFolderView), IID_PPV_ARGS(&pfv)
для __uuidof(IFolderView)
для IFolderView
и / или IShellView
интерфейс.
, скажем, IFolderView
tou также может получить интерфейс IShellFolder
.запомните эти интерфейсы в объекте, а затем используйте от InvokeCommand