try to use IShellFolderViewCB::MessageSFVCB() in order to override explorer context menus
Modified: trunk/reactos/subsys/system/explorer/shell/shellbrowser.cpp
Modified: trunk/reactos/subsys/system/explorer/shell/shellbrowser.h
Modified: trunk/reactos/subsys/system/explorer/shell/webchild.h
Modified: trunk/reactos/subsys/system/explorer/utility/shellclasses.h

Modified: trunk/reactos/subsys/system/explorer/shell/shellbrowser.cpp
--- trunk/reactos/subsys/system/explorer/shell/shellbrowser.cpp	2005-09-25 13:58:27 UTC (rev 18054)
+++ trunk/reactos/subsys/system/explorer/shell/shellbrowser.cpp	2005-09-25 15:59:38 UTC (rev 18055)
@@ -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 @@
 		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 @@
 }
 
 
+#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()");

Modified: trunk/reactos/subsys/system/explorer/shell/shellbrowser.h
--- trunk/reactos/subsys/system/explorer/shell/shellbrowser.h	2005-09-25 13:58:27 UTC (rev 18054)
+++ trunk/reactos/subsys/system/explorer/shell/shellbrowser.h	2005-09-25 15:59:38 UTC (rev 18055)
@@ -57,6 +57,10 @@
 
  /// 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 @@
 
 	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
 };
 
 

Modified: trunk/reactos/subsys/system/explorer/shell/webchild.h
--- trunk/reactos/subsys/system/explorer/shell/webchild.h	2005-09-25 13:58:27 UTC (rev 18054)
+++ trunk/reactos/subsys/system/explorer/shell/webchild.h	2005-09-25 15:59:38 UTC (rev 18055)
@@ -79,94 +79,10 @@
 #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)

Modified: trunk/reactos/subsys/system/explorer/utility/shellclasses.h
--- trunk/reactos/subsys/system/explorer/utility/shellclasses.h	2005-09-25 13:58:27 UTC (rev 18054)
+++ trunk/reactos/subsys/system/explorer/utility/shellclasses.h	2005-09-25 15:59:38 UTC (rev 18055)
@@ -52,7 +52,14 @@
 #define	CFSTR_SHELLIDLIST sCFSTR_SHELLIDLIST
 #endif
 
+#ifdef _MSC_VER
+#define	NOVTABLE __declspec(novtable)
+#else
+#define	NOVTABLE
+#endif
+#define	ANSUNC
 
+
  // Exception Handling
 
 #ifndef _NO_COMUTIL
@@ -438,7 +445,84 @@
 };
 
 
+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;