Added IOleAdviseHoler interface (still a dummy) and fixed
CreateOleAdviseHolder().

diff --git a/include/oleobj.h b/include/oleobj.h
new file mode 100644
index 0000000..2105318
--- /dev/null
+++ b/include/oleobj.h
@@ -0,0 +1,71 @@
+#ifndef _WINE_OLEOBJ_H
+#define _WINE_OLEOBJ_H
+
+#include "ole.h"
+#include "ole2.h"
+#include "compobj.h"
+// #include "interfaces.h"
+
+#define STDMETHOD(xfn) HRESULT (CALLBACK *fn##xfn)
+#define STDMETHOD_(type,xfn) type (CALLBACK *fn##xfn)
+#define PURE
+#define FAR
+#define THIS_ THIS,
+
+#define __T(x)      x
+#define _T(x)       __T(x)
+#define TEXT        _T
+
+
+/* forward declaration of the objects*/
+typedef struct tagOLEADVISEHOLDER	*LPOLEADVISEHOLDER,	IOleAdviseHolder;
+typedef struct tagADVISESINK		*LPADVISESINK,		IAdviseSink;
+typedef struct tagENUMSTATDATA		*LPENUMSTATDATA,	IEnumSTATDATA;
+
+
+/****************************************************************************
+ *  OLE ID
+ */
+
+DEFINE_OLEGUID(IID_IOleAdviseHolder, 0x00000111L, 0, 0);
+
+
+/*****************************************************************************
+ * IOleAdviseHolder interface
+ */
+#define THIS LPOLEADVISEHOLDER this
+
+typedef struct IOleAdviseHolder_VTable
+{
+    /*** IUnknown methods ***/
+    STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+    STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
+    STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+    /*** IOleAdviseHolder methods ***/
+    STDMETHOD(Advise)(THIS_ IAdviseSink *pAdvise, DWORD *pdwConnection) PURE;
+    STDMETHOD(Unadvise)(THIS_ DWORD dwConnection) PURE;
+    STDMETHOD(Enum_Advise)(THIS_ IEnumSTATDATA**ppenumAdvise) PURE;
+    STDMETHOD(SendOnRename)(THIS_ IMoniker *pmk) PURE;
+    STDMETHOD(SendOnSave)(THIS) PURE;
+    STDMETHOD(SendOnClose)(THIS) PURE;
+} IOleAdviseHolder_VTable, *LPOLEADVISEHOLDER_VTABLE;
+
+struct tagOLEADVISEHOLDER
+{
+    LPOLEADVISEHOLDER_VTABLE lpvtbl;
+    DWORD                    ref;
+};
+
+#undef THIS
+
+
+
+#undef PURE
+#undef FAR
+#undef THIS
+#undef THIS_
+#undef STDMETHOD
+#undef STDMETHOD_
+#endif /*_WINE_OLEOBJ_H*/
+
diff --git a/include/shlobj.h b/include/shlobj.h
index 5751a91..7c23bd5 100644
--- a/include/shlobj.h
+++ b/include/shlobj.h
@@ -5,6 +5,7 @@
 #include "ole.h"
 #include "ole2.h"
 #include "compobj.h"
+#include "oleobj.h"
 #include "storage.h"
 #include "commctrl.h"
 #include "interfaces.h"
@@ -41,8 +42,6 @@
 typedef struct tagCOMMDLGBROWSER	*LPCOMMDLGBROWSER,	ICommDlgBrowser;
 typedef struct tagENUMFORMATETC	*LPENUMFORMATETC,	IEnumFORMATETC;
  
-typedef struct IAdviseSink		IAdviseSink,	*LPIADVISESINK;
-typedef struct IEnumSTATDATA		IEnumSTATDATA,	*LPENUMSTATDATA;
 /****************************************************************************
 *  SHELL ID
 */
diff --git a/ole/Makefile.in b/ole/Makefile.in
index 64a7fe4..65c5a88 100644
--- a/ole/Makefile.in
+++ b/ole/Makefile.in
@@ -14,6 +14,7 @@
 	ole2nls.c \
 	olecli.c \
 	oledlg.c \
+	oleobj.c \
 	olesvr.c \
 	storage.c \
 	typelib.c
diff --git a/ole/compobj.c b/ole/compobj.c
index afc5b38..66a714e 100644
--- a/ole/compobj.c
+++ b/ole/compobj.c
@@ -41,6 +41,7 @@
 #include "ldt.h"
 #include "interfaces.h"
 #include "shlobj.h"
+#include "oleobj.h"
 #include "ddraw.h"
 #include "dsound.h"
 #include "dinput.h"
diff --git a/ole/oleobj.c b/ole/oleobj.c
new file mode 100644
index 0000000..ccb478d
--- /dev/null
+++ b/ole/oleobj.c
@@ -0,0 +1,215 @@
+/*
+ *	OLE2 COM objects
+ *
+ *	Copyright 1998 Eric Kohl
+ */
+
+
+#include "ole.h"
+#include "ole2.h"
+#include "winerror.h"
+#include "interfaces.h"
+#include "oleobj.h"
+#include "debug.h"
+
+
+#define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID)))
+#define IsEqualIID(riid1, riid2) IsEqualGUID(riid1, riid2)
+#define IsEqualCLSID(rclsid1, rclsid2) IsEqualGUID(rclsid1, rclsid2)
+
+
+/**************************************************************************
+ *  IOleAdviseHolder Implementation
+ */
+static HRESULT WINAPI IOleAdviseHolder_QueryInterface(LPOLEADVISEHOLDER,REFIID,LPVOID*);
+static ULONG WINAPI   IOleAdviseHolder_AddRef(LPOLEADVISEHOLDER);
+static ULONG WINAPI   IOleAdviseHolder_Release(LPOLEADVISEHOLDER);
+static HRESULT WINAPI IOleAdviseHolder_Advise(LPOLEADVISEHOLDER, IAdviseSink*, DWORD*);
+static HRESULT WINAPI IOleAdviseHolder_Unadvise (LPOLEADVISEHOLDER, DWORD);
+static HRESULT WINAPI IOleAdviseHolder_EnumAdvise (LPOLEADVISEHOLDER, IEnumSTATDATA **);
+static HRESULT WINAPI IOleAdviseHolder_SendOnRename (LPOLEADVISEHOLDER, IMoniker *);
+static HRESULT WINAPI IOleAdviseHolder_SendOnSave (LPOLEADVISEHOLDER this);
+static HRESULT WINAPI IOleAdviseHolder_SendOnClose (LPOLEADVISEHOLDER this);
+
+
+/**************************************************************************
+ *  IOleAdviseHolder_VTable
+ */
+static IOleAdviseHolder_VTable oahvt =
+{
+    IOleAdviseHolder_QueryInterface,
+    IOleAdviseHolder_AddRef,
+    IOleAdviseHolder_Release,
+    IOleAdviseHolder_Advise,
+    IOleAdviseHolder_Unadvise,
+    IOleAdviseHolder_EnumAdvise,
+    IOleAdviseHolder_SendOnRename,
+    IOleAdviseHolder_SendOnSave,
+    IOleAdviseHolder_SendOnClose
+};
+
+/**************************************************************************
+ *  IOleAdviseHolder_Constructor
+ */
+
+LPOLEADVISEHOLDER IOleAdviseHolder_Constructor()
+{
+    LPOLEADVISEHOLDER lpoah;
+
+    lpoah= (LPOLEADVISEHOLDER)HeapAlloc(GetProcessHeap(),0,sizeof(IOleAdviseHolder));
+    lpoah->ref = 1;
+    lpoah->lpvtbl = &oahvt;
+    FIXME (ole, "(%p)->()\n", lpoah);
+
+    return lpoah;
+}
+
+/**************************************************************************
+ *  IOleAdviseHolder_QueryInterface
+ */
+static HRESULT WINAPI
+IOleAdviseHolder_QueryInterface (LPOLEADVISEHOLDER this, REFIID riid, LPVOID *ppvObj)
+{
+    char xriid[50];
+    WINE_StringFromCLSID((LPCLSID)riid,xriid);
+    FIXME (ole, "(%p)->(\n\tIID:\t%s)\n", this, xriid);
+
+    *ppvObj = NULL;
+
+    if(IsEqualIID(riid, &IID_IUnknown)) {
+	/* IUnknown */
+	*ppvObj = this; 
+    }
+    else if(IsEqualIID(riid, &IID_IOleAdviseHolder)) {
+	/* IOleAdviseHolder */
+	*ppvObj = (IOleAdviseHolder*) this;
+    }
+
+    if(*ppvObj) {
+	(*(LPOLEADVISEHOLDER*)ppvObj)->lpvtbl->fnAddRef(this);  	
+	FIXME (ole, "-- Interface: (%p)->(%p)\n", ppvObj, *ppvObj);
+	return S_OK;
+    }
+
+    FIXME (ole, "-- Interface: E_NOINTERFACE\n");
+    return E_NOINTERFACE;
+}
+
+/******************************************************************************
+ * IOleAdviseHolder_AddRef
+ */
+static ULONG WINAPI
+IOleAdviseHolder_AddRef (LPOLEADVISEHOLDER this)
+{
+    FIXME (ole, "(%p)->(count=%lu)\n", this, this->ref);
+    return ++(this->ref);
+}
+
+/******************************************************************************
+ * IOleAdviseHolder_Release
+ */
+static ULONG WINAPI
+IOleAdviseHolder_Release (LPOLEADVISEHOLDER this)
+{
+    FIXME (ole, "(%p)->(count=%lu)\n", this, this->ref);
+    if (!--(this->ref)) {
+	FIXME (ole, "-- destroying IOleAdviseHolder(%p)\n", this);
+	HeapFree(GetProcessHeap(),0,this);
+	return 0;
+    }
+    return this->ref;
+}
+
+/******************************************************************************
+ * IOleAdviseHolder_Advise
+ */
+static HRESULT WINAPI
+IOleAdviseHolder_Advise (LPOLEADVISEHOLDER this,
+			 IAdviseSink *pAdvise, DWORD *pdwConnection)
+{
+    FIXME (ole, "(%p)->(%p %p)\n", this, pAdvise, pdwConnection);
+
+    *pdwConnection = 0;
+
+   return S_OK;
+}
+
+/******************************************************************************
+ * IOleAdviseHolder_Unadvise
+ */
+static HRESULT WINAPI
+IOleAdviseHolder_Unadvise (LPOLEADVISEHOLDER this, DWORD dwConnection)
+{
+    FIXME (ole, "(%p)->(%lu)\n", this, dwConnection);
+
+    return S_OK;
+}
+
+/******************************************************************************
+ * IOleAdviseHolder_EnumAdvise
+ */
+static HRESULT WINAPI
+IOleAdviseHolder_EnumAdvise (LPOLEADVISEHOLDER this, IEnumSTATDATA **ppenumAdvise)
+{
+    FIXME (ole, "(%p)->(%p)\n", this, ppenumAdvise);
+
+    *ppenumAdvise = NULL;
+
+    return S_OK;
+}
+
+/******************************************************************************
+ * IOleAdviseHolder_SendOnRename
+ */
+static HRESULT WINAPI
+IOleAdviseHolder_SendOnRename (LPOLEADVISEHOLDER this, IMoniker *pmk)
+{
+    FIXME (ole, "(%p)->(%p)\n", this, pmk);
+
+
+    return S_OK;
+}
+
+/******************************************************************************
+ * IOleAdviseHolder_SendOnSave
+ */
+static HRESULT WINAPI
+IOleAdviseHolder_SendOnSave (LPOLEADVISEHOLDER this)
+{
+    FIXME (ole, "(%p)\n", this);
+
+
+    return S_OK;
+}
+
+/******************************************************************************
+ * IOleAdviseHolder_SendOnClose
+ */
+static HRESULT WINAPI
+IOleAdviseHolder_SendOnClose (LPOLEADVISEHOLDER this)
+{
+    FIXME (ole, "(%p)\n", this);
+
+
+    return S_OK;
+}
+
+/***********************************************************************
+ * API functions
+ */
+
+/***********************************************************************
+ * CreateOleAdviseHolder [OLE32.59]
+ */
+HRESULT WINAPI CreateOleAdviseHolder32 (LPOLEADVISEHOLDER *ppOAHolder)
+{
+    FIXME(ole,"(%p): stub!\n", ppOAHolder);
+
+    *ppOAHolder = IOleAdviseHolder_Constructor ();
+    if (*ppOAHolder)
+	return S_OK;
+
+    *ppOAHolder = 0;
+    return E_OUTOFMEMORY;
+}
+