try to use IShellFolderViewCB::MessageSFVCB() in order to override explorer context menus

svn path=/trunk/; revision=18055
This commit is contained in:
Martin Fuchs 2005-09-25 15:59:38 +00:00
parent edd28d722f
commit b59af67517
4 changed files with 129 additions and 85 deletions

View file

@ -33,7 +33,12 @@
ShellBrowser::ShellBrowser(HWND hwnd, HWND left_hwnd, WindowHandle& right_hwnd, ShellPathInfo& create_info,
HIMAGELIST himl, BrowserCallback* cb, CtxMenuInterfaces& cm_ifs)
: _hwnd(hwnd),
#ifndef __MINGW32__ // IShellFolderViewCB missing in MinGW (as of 25.09.2005)
: super(IID_IShellFolderViewCB),
#else
:
#endif
_hwnd(hwnd),
_left_hwnd(left_hwnd),
_right_hwnd(right_hwnd),
_create_info(create_info),
@ -357,7 +362,18 @@ void ShellBrowser::UpdateFolderView(IShellFolder* folder)
fs.fFlags = FWF_NOCLIENTEDGE|FWF_BESTFITWINDOW;
}
#ifndef __MINGW32__ // IShellFolderViewCB missing in MinGW (as of 25.09.2005)
SFV_CREATE sfv_create;
sfv_create.cbSize = sizeof(SFV_CREATE);
sfv_create.pshf = folder;
sfv_create.psvOuter = NULL;
sfv_create.psfvcb = this;
HRESULT hr = SHCreateShellFolderView(&sfv_create, &_pShellView);
#else
HRESULT hr = folder->CreateViewObject(_hwnd, IID_IShellView, (void**)&_pShellView);
#endif
if (FAILED(hr)) {
_pShellView = NULL;
@ -378,6 +394,23 @@ void ShellBrowser::UpdateFolderView(IShellFolder* folder)
}
#ifndef __MINGW32__ // IShellFolderViewCB missing in MinGW (as of 25.09.2005)
/// shell view callback
HRESULT STDMETHODCALLTYPE ShellBrowser::MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == SFVM_INITMENUPOPUP) {
//@todo never reached
InsertMenu((HMENU)lParam, 0, MF_BYPOSITION, 12345, TEXT("TEST ENTRY"));
return S_OK;
}
return E_NOTIMPL;
}
#endif
HRESULT ShellBrowser::OnDefaultCommand(LPIDA pida)
{
CONTEXT("ShellBrowser::OnDefaultCommand()");

View file

@ -57,6 +57,10 @@ struct BrowserCallback
/// Implementation of IShellBrowserImpl interface in explorer child windows
struct ShellBrowser : public IShellBrowserImpl
#ifndef __MINGW32__ // IShellFolderViewCB missing in MinGW (as of 25.09.2005)
, public IComSrvBase<IShellFolderViewCB, ShellBrowser>,
public SimpleComObject
#endif
{
ShellBrowser(HWND hwnd, HWND left_hwnd, WindowHandle& right_hwnd, ShellPathInfo& create_info,
HIMAGELIST himl, BrowserCallback* cb, CtxMenuInterfaces& cm_ifs);
@ -162,6 +166,13 @@ protected:
void InitializeTree(HIMAGELIST himl);
bool InitDragDrop();
#ifndef __MINGW32__ // IShellFolderViewCB missing in MinGW (as of 25.09.2005)
typedef IComSrvBase<IShellFolderViewCB, ShellBrowser> super;
// IShellFolderViewCB
virtual HRESULT STDMETHODCALLTYPE MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam);
#endif
};

View file

@ -78,95 +78,11 @@
#define V_INT(x) V_UNION(x, intVal)
#endif
#ifdef _MSC_VER
#define NOVTABLE __declspec(novtable)
#else
#define NOVTABLE
#endif
#define ANSUNC
#ifdef _MSC_VER
#pragma warning(disable: 4355) // use of 'this' for initialization of _connector
#endif
struct NOVTABLE ComSrvObject // NOVTABLE erlaubt, da protected Destruktor
{
protected:
ComSrvObject() : _ref(1) {}
virtual ~ComSrvObject() {}
ULONG _ref;
};
struct SimpleComObject : public ComSrvObject
{
ULONG IncRef() {return ++_ref;}
ULONG DecRef() {ULONG ref=--_ref; if (!ref) {_ref++; delete this;} return ref;}
};
// server object interfaces
template<typename BASE> struct IComSrvQI : public BASE
{
IComSrvQI(REFIID uuid_base)
: _uuid_base(uuid_base)
{
}
STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppv)
{
*ppv = NULL;
if (IsEqualIID(riid, _uuid_base) || IsEqualIID(riid, IID_IUnknown))
{*ppv=static_cast<BASE*>(this); this->AddRef(); return S_OK;}
return E_NOINTERFACE;
}
protected:
IComSrvQI() {}
virtual ~IComSrvQI() {}
REFIID _uuid_base;
};
template<> struct IComSrvQI<IUnknown> : public IUnknown
{
STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppv)
{
*ppv = NULL;
if (IsEqualIID(riid, IID_IUnknown))
{*ppv=this; AddRef(); return S_OK;}
return E_NOINTERFACE;
}
protected:
IComSrvQI<IUnknown>() {}
virtual ~IComSrvQI<IUnknown>() {}
};
template<typename BASE, typename OBJ>
class IComSrvBase : public IComSrvQI<BASE>
{
typedef IComSrvQI<BASE> super;
protected:
IComSrvBase(REFIID uuid_base)
: super(uuid_base)
{
}
public:
STDMETHODIMP_(ULONG) AddRef() {return static_cast<OBJ*>(this)->IncRef();}
STDMETHODIMP_(ULONG) Release() {return static_cast<OBJ*>(this)->DecRef();}
};
template<typename T> struct ConnectionPoint : public SIfacePtr<T>
{
ConnectionPoint(IConnectionPointContainer* pCPC, REFIID riid)

View file

@ -52,6 +52,13 @@ extern const LPCTSTR sCFSTR_SHELLIDLIST;
#define CFSTR_SHELLIDLIST sCFSTR_SHELLIDLIST
#endif
#ifdef _MSC_VER
#define NOVTABLE __declspec(novtable)
#else
#define NOVTABLE
#endif
#define ANSUNC
// Exception Handling
@ -438,6 +445,83 @@ protected:
};
struct NOVTABLE ComSrvObject // NOVTABLE erlaubt, da protected Destruktor
{
protected:
ComSrvObject() : _ref(1) {}
virtual ~ComSrvObject() {}
ULONG _ref;
};
struct SimpleComObject : public ComSrvObject
{
ULONG IncRef() {return ++_ref;}
ULONG DecRef() {ULONG ref=--_ref; if (!ref) {_ref++; delete this;} return ref;}
};
// server object interfaces
template<typename BASE> struct IComSrvQI : public BASE
{
IComSrvQI(REFIID uuid_base)
: _uuid_base(uuid_base)
{
}
STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppv)
{
*ppv = NULL;
if (IsEqualIID(riid, _uuid_base) || IsEqualIID(riid, IID_IUnknown))
{*ppv=static_cast<BASE*>(this); this->AddRef(); return S_OK;}
return E_NOINTERFACE;
}
protected:
IComSrvQI() {}
virtual ~IComSrvQI() {}
REFIID _uuid_base;
};
template<> struct IComSrvQI<IUnknown> : public IUnknown
{
STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppv)
{
*ppv = NULL;
if (IsEqualIID(riid, IID_IUnknown))
{*ppv=this; AddRef(); return S_OK;}
return E_NOINTERFACE;
}
protected:
IComSrvQI<IUnknown>() {}
virtual ~IComSrvQI<IUnknown>() {}
};
template<typename BASE, typename OBJ>
class IComSrvBase : public IComSrvQI<BASE>
{
typedef IComSrvQI<BASE> super;
protected:
IComSrvBase(REFIID uuid_base)
: super(uuid_base)
{
}
public:
STDMETHODIMP_(ULONG) AddRef() {return static_cast<OBJ*>(this)->IncRef();}
STDMETHODIMP_(ULONG) Release() {return static_cast<OBJ*>(this)->DecRef();}
};
struct ShellFolder;