Author: cwittich
Date: Tue Oct 28 09:32:41 2008
New Revision: 37039
URL: 
http://svn.reactos.org/svn/reactos?rev=37039&view=rev
Log:
revert part of rev 31787 as we don't support IROT in rpcss
fixes FoxitReader, GVIM and many other apps
See issue #2361 for more details.
Modified:
    trunk/reactos/dll/win32/ole32/moniker.c
    trunk/reactos/dll/win32/ole32/ole32.rbuild
Modified: trunk/reactos/dll/win32/ole32/moniker.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ole32/moniker.c?…
==============================================================================
--- trunk/reactos/dll/win32/ole32/moniker.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/ole32/moniker.c [iso-8859-1] Tue Oct 28 09:32:41 2008
@@ -19,11 +19,14 @@
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#include "config.h"
-#include "wine/port.h"
-
+ *
+ * TODO:
+ * - IRunningObjectTable should work interprocess, but currently doesn't.
+ *   Native (on Win2k at least) uses an undocumented RPC interface, IROT, to
+ *   communicate with RPCSS which contains the table of marshalled data.
+ */
+
+#include <assert.h>
 #include <stdarg.h>
 #include <string.h>
@@ -39,33 +42,25 @@
 #include "wine/list.h"
 #include "wine/debug.h"
 #include "wine/unicode.h"
-#include "wine/exception.h"
 #include "compobj_private.h"
 #include "moniker.h"
-#include "irot.h"
 WINE_DEFAULT_DEBUG_CHANNEL(ole);
 /* see MSDN docs for IROTData::GetComparisonData, which states what this
- * constant is
- */
+ * constant is (
http://msdn2.microsoft.com/en-us/library/ms693773.aspx) */
 #define MAX_COMPARISON_DATA 2048
-
-static LONG WINAPI rpc_filter(EXCEPTION_POINTERS *eptr)
-{
-    return I_RpcExceptionFilter(eptr->ExceptionRecord->ExceptionCode);
-}
 /* define the structure of the running object table elements */
 struct rot_entry
 {
     struct list        entry;
-    InterfaceData* object; /* marshaled running object*/
-    MonikerComparisonData* moniker_data; /* moniker comparison data that identifies this
object */
+    MInterfacePointer* object; /* marshaled running object*/
+    MInterfacePointer* moniker; /* marshaled moniker that identifies this object */
+    MInterfacePointer* moniker_data; /* moniker comparison data that identifies this
object */
     DWORD              cookie; /* cookie identifying this object */
     FILETIME           last_modified;
-    IrotContextHandle  ctxt_handle;
 };
 /* define the RunningObjectTableImpl structure */
@@ -79,7 +74,16 @@
 } RunningObjectTableImpl;
 static RunningObjectTableImpl* runningObjectTableInstance = NULL;
-static IrotHandle irot_handle;
+
+
+
+static inline HRESULT WINAPI
+IrotRegister(DWORD *cookie)
+{
+    static LONG last_cookie = 1;
+    *cookie = InterlockedIncrement(&last_cookie);
+    return S_OK;
+}
 /* define the EnumMonikerImpl structure */
 typedef struct EnumMonikerImpl
@@ -87,79 +91,17 @@
     const IEnumMonikerVtbl *lpVtbl;
     LONG ref;
-    InterfaceList *moniker_list;
+    MInterfacePointer **monikers;
+    ULONG moniker_count;
     ULONG pos;
 } EnumMonikerImpl;
 /* IEnumMoniker Local functions*/
-static HRESULT WINAPI EnumMonikerImpl_CreateEnumROTMoniker(InterfaceList *moniker_list,
-    ULONG pos, IEnumMoniker **ppenumMoniker);
-
-static IrotHandle get_irot_handle(void)
-{
-    if (!irot_handle)
-    {
-        RPC_STATUS status;
-        RPC_WSTR binding;
-        IrotHandle new_handle;
-        unsigned short ncacn_np[] = IROT_PROTSEQ;
-        unsigned short endpoint[] = IROT_ENDPOINT;
-        status = RpcStringBindingComposeW(NULL, ncacn_np, NULL, endpoint, NULL,
&binding);
-        if (status == RPC_S_OK)
-        {
-            status = RpcBindingFromStringBindingW(binding, &new_handle);
-            RpcStringFreeW(&binding);
-        }
-        if (status != RPC_S_OK)
-            return NULL;
-        if (InterlockedCompareExchangePointer(&irot_handle, new_handle, NULL))
-            /* another thread beat us to it */
-            RpcBindingFree(&new_handle);
-    }
-    return irot_handle;
-}
-
-static BOOL start_rpcss(void)
-{
-    PROCESS_INFORMATION pi;
-    STARTUPINFOW si;
-    static WCHAR cmd[6];
-    static const WCHAR rpcss[] =
{'r','p','c','s','s',0};
-    BOOL rslt;
-
-    TRACE("\n");
-
-    ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
-    ZeroMemory(&si, sizeof(STARTUPINFOA));
-    si.cb = sizeof(STARTUPINFOA);
-
-    memcpy(cmd, rpcss, sizeof(rpcss));
-
-    rslt = CreateProcessW(
-                          NULL,           /* executable */
-                          cmd,            /* command line */
-                          NULL,           /* process security attributes */
-                          NULL,           /* primary thread security attributes */
-                          FALSE,          /* inherit handles */
-                          0,              /* creation flags */
-                          NULL,           /* use parent's environment */
-                          NULL,           /* use parent's current directory */
-                          &si,            /* STARTUPINFO pointer */
-                          &pi             /* PROCESS_INFORMATION */
-                          );
-
-    if (rslt)
-    {
-        CloseHandle(pi.hProcess);
-        CloseHandle(pi.hThread);
-        Sleep(100);
-    }
-
-    return rslt;
-}
-
-static HRESULT create_stream_on_mip_ro(const InterfaceData *mip, IStream **stream)
+static HRESULT WINAPI EnumMonikerImpl_CreateEnumROTMoniker(MInterfacePointer **monikers,
+    ULONG moniker_count, ULONG pos, IEnumMoniker **ppenumMoniker);
+
+static HRESULT create_stream_on_mip_ro(const MInterfacePointer *mip, IStream **stream)
 {
     HGLOBAL hglobal = GlobalAlloc(0, mip->ulCntData);
     void *pv = GlobalLock(hglobal);
@@ -170,33 +112,7 @@
 static inline void rot_entry_delete(struct rot_entry *rot_entry)
 {
-    if (rot_entry->cookie)
-    {
-        InterfaceData *object = NULL;
-        InterfaceData *moniker = NULL;
-        __TRY
-        {
-            IrotRevoke(get_irot_handle(), rot_entry->cookie,
-                       &rot_entry->ctxt_handle, &object, &moniker);
-        }
-        __EXCEPT(rpc_filter)
-        {
-        }
-        __ENDTRY
-        MIDL_user_free(object);
-        if (moniker)
-        {
-            IStream *stream;
-            HRESULT hr;
-            hr = create_stream_on_mip_ro(moniker, &stream);
-            if (hr == S_OK)
-            {
-                CoReleaseMarshalData(stream);
-                IUnknown_Release(stream);
-            }
-        }
-        MIDL_user_free(moniker);
-    }
+    /* FIXME: revoke entry from rpcss's copy of the ROT */
     if (rot_entry->object)
     {
         IStream *stream;
@@ -208,13 +124,25 @@
             IUnknown_Release(stream);
         }
     }
+    if (rot_entry->moniker)
+    {
+        IStream *stream;
+        HRESULT hr;
+        hr = create_stream_on_mip_ro(rot_entry->moniker, &stream);
+        if (hr == S_OK)
+        {
+            CoReleaseMarshalData(stream);
+            IUnknown_Release(stream);
+        }
+    }
     HeapFree(GetProcessHeap(), 0, rot_entry->object);
+    HeapFree(GetProcessHeap(), 0, rot_entry->moniker);
     HeapFree(GetProcessHeap(), 0, rot_entry->moniker_data);
     HeapFree(GetProcessHeap(), 0, rot_entry);
 }
 /* moniker_data must be freed with HeapFree when no longer in use */
-static HRESULT get_moniker_comparison_data(IMoniker *pMoniker, MonikerComparisonData
**moniker_data)
+static HRESULT get_moniker_comparison_data(IMoniker *pMoniker, MInterfacePointer
**moniker_data)
 {
     HRESULT hr;
     IROTData *pROTData = NULL;
@@ -222,14 +150,8 @@
     if (SUCCEEDED(hr))
     {
         ULONG size = MAX_COMPARISON_DATA;
-        *moniker_data = HeapAlloc(GetProcessHeap(), 0,
FIELD_OFFSET(MonikerComparisonData, abData[size]));
-        if (!*moniker_data)
-        {
-            IROTData_Release(pROTData);
-            return E_OUTOFMEMORY;
-        }
+        *moniker_data = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(MInterfacePointer,
abData[size]));
         hr = IROTData_GetComparisonData(pROTData, (*moniker_data)->abData, size,
&size);
-        IROTData_Release(pROTData);
         if (hr != S_OK)
         {
             ERR("Failed to copy comparison data into buffer, hr = 0x%08x\n",
hr);
@@ -263,7 +185,7 @@
         len = strlenW(pszDisplayName);
         *moniker_data = HeapAlloc(GetProcessHeap(), 0,
-            FIELD_OFFSET(MonikerComparisonData, abData[sizeof(CLSID) +
(len+1)*sizeof(WCHAR)]));
+            FIELD_OFFSET(MInterfacePointer, abData[sizeof(CLSID) +
(len+1)*sizeof(WCHAR)]));
         if (!*moniker_data)
         {
             CoTaskMemFree(pszDisplayName);
@@ -273,7 +195,6 @@
         memcpy(&(*moniker_data)->abData[0], &clsid, sizeof(clsid));
         memcpy(&(*moniker_data)->abData[sizeof(clsid)], pszDisplayName,
(len+1)*sizeof(WCHAR));
-        CoTaskMemFree(pszDisplayName);
     }
     return S_OK;
 }
@@ -346,7 +267,6 @@
 RunningObjectTableImpl_Destroy(void)
 {
     struct list *cursor, *cursor2;
-    IrotHandle old_handle;
     TRACE("()\n");
@@ -367,11 +287,6 @@
     /* free the ROT structure memory */
     HeapFree(GetProcessHeap(),0,runningObjectTableInstance);
     runningObjectTableInstance = NULL;
-
-    old_handle = irot_handle;
-    irot_handle = NULL;
-    if (old_handle)
-        RpcBindingFree(&old_handle);
     return S_OK;
 }
@@ -426,7 +341,6 @@
     IStream *pStream = NULL;
     DWORD mshlflags;
     IBindCtx *pbc;
-    InterfaceData *moniker = NULL;
TRACE("(%p,%d,%p,%p,%p)\n",This,grfFlags,punkObject,pmkObjectName,pdwRegister);
@@ -464,7 +378,7 @@
             const void *pv = GlobalLock(hglobal);
             rot_entry->object = HeapAlloc(GetProcessHeap(), 0,
FIELD_OFFSET(MInterfacePointer, abData[size]));
             rot_entry->object->ulCntData = size;
-            memcpy(rot_entry->object->abData, pv, size);
+            memcpy(&rot_entry->object->abData, pv, size);
             GlobalUnlock(hglobal);
         }
     }
@@ -528,9 +442,9 @@
         {
             SIZE_T size = GlobalSize(hglobal);
             const void *pv = GlobalLock(hglobal);
-            moniker = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(InterfaceData,
abData[size]));
-            moniker->ulCntData = size;
-            memcpy(moniker->abData, pv, size);
+            rot_entry->moniker = HeapAlloc(GetProcessHeap(), 0,
FIELD_OFFSET(MInterfacePointer, abData[size]));
+            rot_entry->moniker->ulCntData = size;
+            memcpy(&rot_entry->moniker->abData, pv, size);
             GlobalUnlock(hglobal);
         }
     }
@@ -538,35 +452,13 @@
     IMoniker_Release(pmkObjectName);
     if (hr != S_OK)
     {
-        HeapFree(GetProcessHeap(), 0, moniker);
         rot_entry_delete(rot_entry);
         return hr;
     }
-
-    while (TRUE)
-    {
-        __TRY
-        {
-            hr = IrotRegister(get_irot_handle(), rot_entry->moniker_data,
-                              rot_entry->object, moniker,
-                              &rot_entry->last_modified, grfFlags,
-                              &rot_entry->cookie, &rot_entry->ctxt_handle);
-        }
-        __EXCEPT(rpc_filter)
-        {
-            hr = HRESULT_FROM_WIN32(GetExceptionCode());
-        }
-        __ENDTRY
-        if (hr == HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE))
-        {
-            if (start_rpcss())
-                continue;
-        }
-        break;
-    }
-    HeapFree(GetProcessHeap(), 0, moniker);
-    if (FAILED(hr))
+    /* FIXME: not the right signature of IrotRegister function */
+    hr = IrotRegister(&rot_entry->cookie);
+    if (hr != S_OK)
     {
         rot_entry_delete(rot_entry);
         return hr;
@@ -576,6 +468,7 @@
     *pdwRegister = rot_entry->cookie;
     EnterCriticalSection(&This->lock);
+    /* FIXME: see if object was registered before and return
MK_S_MONIKERALREADYREGISTERED */
     list_add_tail(&This->rot, &rot_entry->entry);
     LeaveCriticalSection(&This->lock);
@@ -623,9 +516,9 @@
 RunningObjectTableImpl_IsRunning( IRunningObjectTable* iface, IMoniker *pmkObjectName)
 {
     RunningObjectTableImpl *This = (RunningObjectTableImpl *)iface;
-    MonikerComparisonData *moniker_data;
+    MInterfacePointer *moniker_data;
     HRESULT hr;
-    const struct rot_entry *rot_entry;
+    struct rot_entry *rot_entry;
     TRACE("(%p,%p)\n",This,pmkObjectName);
@@ -639,10 +532,10 @@
     hr = S_FALSE;
     EnterCriticalSection(&This->lock);
-    LIST_FOR_EACH_ENTRY(rot_entry, &This->rot, const struct rot_entry, entry)
+    LIST_FOR_EACH_ENTRY(rot_entry, &This->rot, struct rot_entry, entry)
     {
         if ((rot_entry->moniker_data->ulCntData == moniker_data->ulCntData)
&&
-            !memcmp(moniker_data->abData, rot_entry->moniker_data->abData,
moniker_data->ulCntData))
+            !memcmp(&moniker_data->abData,
&rot_entry->moniker_data->abData, moniker_data->ulCntData))
         {
             hr = S_OK;
             break;
@@ -650,27 +543,7 @@
     }
     LeaveCriticalSection(&This->lock);
-    if (hr == S_FALSE)
-    {
-        while (TRUE)
-        {
-            __TRY
-            {
-                hr = IrotIsRunning(get_irot_handle(), moniker_data);
-            }
-            __EXCEPT(rpc_filter)
-            {
-                hr = HRESULT_FROM_WIN32(GetExceptionCode());
-            }
-            __ENDTRY
-            if (hr == HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE))
-            {
-                if (start_rpcss())
-                    continue;
-            }
-            break;
-        }
-    }
+    /* FIXME: call IrotIsRunning */
     HeapFree(GetProcessHeap(), 0, moniker_data);
@@ -689,9 +562,7 @@
                      IMoniker *pmkObjectName, IUnknown **ppunkObject)
 {
     RunningObjectTableImpl *This = (RunningObjectTableImpl *)iface;
-    MonikerComparisonData *moniker_data;
-    InterfaceData *object = NULL;
-    IrotCookie cookie;
+    MInterfacePointer *moniker_data;
     HRESULT hr;
     struct rot_entry *rot_entry;
@@ -714,7 +585,7 @@
     LIST_FOR_EACH_ENTRY(rot_entry, &This->rot, struct rot_entry, entry)
     {
         if ((rot_entry->moniker_data->ulCntData == moniker_data->ulCntData)
&&
-            !memcmp(moniker_data->abData, rot_entry->moniker_data->abData,
moniker_data->ulCntData))
+            !memcmp(&moniker_data->abData,
&rot_entry->moniker_data->abData, moniker_data->ulCntData))
         {
             IStream *pStream;
             hr = create_stream_on_mip_ro(rot_entry->object, &pStream);
@@ -732,39 +603,9 @@
     }
     LeaveCriticalSection(&This->lock);
-    TRACE("moniker unavailable locally, calling SCM\n");
-
-    while (TRUE)
-    {
-        __TRY
-        {
-            hr = IrotGetObject(get_irot_handle(), moniker_data, &object,
&cookie);
-        }
-        __EXCEPT(rpc_filter)
-        {
-            hr = HRESULT_FROM_WIN32(GetExceptionCode());
-        }
-        __ENDTRY
-        if (hr == HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE))
-        {
-            if (start_rpcss())
-                continue;
-        }
-        break;
-    }
-
-    if (SUCCEEDED(hr))
-    {
-        IStream *pStream;
-        hr = create_stream_on_mip_ro(object, &pStream);
-        if (hr == S_OK)
-        {
-            hr = CoUnmarshalInterface(pStream, &IID_IUnknown, (void **)ppunkObject);
-            IStream_Release(pStream);
-        }
-    }
-    else
-        WARN("Moniker unavailable, IrotGetObject returned 0x%08x\n", hr);
+    /* FIXME: call IrotGetObject */
+    WARN("Moniker unavailable - app may require interprocess running object
table\n");
+    hr = MK_E_UNAVAILABLE;
     HeapFree(GetProcessHeap(), 0, moniker_data);
@@ -784,7 +625,6 @@
 {
     RunningObjectTableImpl *This = (RunningObjectTableImpl *)iface;
     struct rot_entry *rot_entry;
-    HRESULT hr = E_INVALIDARG;
     TRACE("(%p,%d,%p)\n",This,dwRegister,pfiletime);
@@ -795,34 +635,14 @@
         {
             rot_entry->last_modified = *pfiletime;
             LeaveCriticalSection(&This->lock);
-
-            while (TRUE)
-            {
-                __TRY
-                {
-                    hr = IrotNoteChangeTime(get_irot_handle(), dwRegister, pfiletime);
-                }
-                __EXCEPT(rpc_filter)
-                {
-                    hr = HRESULT_FROM_WIN32(GetExceptionCode());
-                }
-                __ENDTRY
-                if (hr == HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE))
-                {
-                    if (start_rpcss())
-                        continue;
-                }
-                break;
-            }
-
-            goto done;
+            return S_OK;
         }
     }
     LeaveCriticalSection(&This->lock);
-done:
-    TRACE("-- 0x08%x\n", hr);
-    return hr;
+    /* FIXME: call IrotNoteChangeTime */
+
+    return E_INVALIDARG;
 }
 /***********************************************************************
@@ -838,8 +658,8 @@
 {
     HRESULT hr = MK_E_UNAVAILABLE;
     RunningObjectTableImpl *This = (RunningObjectTableImpl *)iface;
-    MonikerComparisonData *moniker_data;
-    const struct rot_entry *rot_entry;
+    MInterfacePointer *moniker_data;
+    struct rot_entry *rot_entry;
     TRACE("(%p,%p,%p)\n",This,pmkObjectName,pfiletime);
@@ -857,10 +677,10 @@
     hr = MK_E_UNAVAILABLE;
     EnterCriticalSection(&This->lock);
-    LIST_FOR_EACH_ENTRY(rot_entry, &This->rot, const struct rot_entry, entry)
+    LIST_FOR_EACH_ENTRY(rot_entry, &This->rot, struct rot_entry, entry)
     {
         if ((rot_entry->moniker_data->ulCntData == moniker_data->ulCntData)
&&
-            !memcmp(moniker_data->abData, rot_entry->moniker_data->abData,
moniker_data->ulCntData))
+            !memcmp(&moniker_data->abData,
&rot_entry->moniker_data->abData, moniker_data->ulCntData))
         {
             *pfiletime = rot_entry->last_modified;
             hr = S_OK;
@@ -869,31 +689,9 @@
     }
     LeaveCriticalSection(&This->lock);
-    if (hr != S_OK)
-    {
-        while (TRUE)
-        {
-            __TRY
-            {
-                hr = IrotGetTimeOfLastChange(get_irot_handle(), moniker_data, pfiletime);
-            }
-            __EXCEPT(rpc_filter)
-            {
-                hr = HRESULT_FROM_WIN32(GetExceptionCode());
-            }
-            __ENDTRY
-            if (hr == HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE))
-            {
-                if (start_rpcss())
-                    continue;
-            }
-            break;
-        }
-    }
+    /* FIXME: if (hr != S_OK) call IrotGetTimeOfLastChange */
     HeapFree(GetProcessHeap(), 0, moniker_data);
-
-    TRACE("-- 0x%08x\n", hr);
     return hr;
 }
@@ -907,36 +705,33 @@
 RunningObjectTableImpl_EnumRunning(IRunningObjectTable* iface,
                                    IEnumMoniker **ppenumMoniker)
 {
+    HRESULT hr;
     RunningObjectTableImpl *This = (RunningObjectTableImpl *)iface;
-    InterfaceList *interface_list = NULL;
-    HRESULT hr;
-
-    TRACE("(%p, %p)\n", This, ppenumMoniker);
-
-    *ppenumMoniker = NULL;
-
-    while (TRUE)
-    {
-        __TRY
-        {
-            hr = IrotEnumRunning(get_irot_handle(), &interface_list);
-        }
-        __EXCEPT(rpc_filter)
-        {
-            hr = HRESULT_FROM_WIN32(GetExceptionCode());
-        }
-        __ENDTRY
-        if (hr == HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE))
-        {
-            if (start_rpcss())
-                continue;
-        }
-        break;
-    }
-
-    if (SUCCEEDED(hr))
-        hr = EnumMonikerImpl_CreateEnumROTMoniker(interface_list,
-                                                  0, ppenumMoniker);
+    MInterfacePointer **monikers;
+    ULONG moniker_count = 0;
+    const struct rot_entry *rot_entry;
+    ULONG i = 0;
+
+    EnterCriticalSection(&This->lock);
+
+    LIST_FOR_EACH_ENTRY( rot_entry, &This->rot, const struct rot_entry, entry )
+        moniker_count++;
+
+    monikers = HeapAlloc(GetProcessHeap(), 0, moniker_count * sizeof(*monikers));
+
+    LIST_FOR_EACH_ENTRY( rot_entry, &This->rot, const struct rot_entry, entry )
+    {
+        SIZE_T size = FIELD_OFFSET(MInterfacePointer,
abData[rot_entry->moniker->ulCntData]);
+        monikers[i] = HeapAlloc(GetProcessHeap(), 0, size);
+        memcpy(monikers[i], rot_entry->moniker, size);
+        i++;
+    }
+
+    LeaveCriticalSection(&This->lock);
+
+    /* FIXME: call IrotEnumRunning and append data */
+
+    hr = EnumMonikerImpl_CreateEnumROTMoniker(monikers, moniker_count, 0, ppenumMoniker);
     return hr;
 }
@@ -972,9 +767,9 @@
     /* initialize the virtual table function */
     runningObjectTableInstance->lpVtbl = &VT_RunningObjectTableImpl;
-    /* the initial reference is set to "1" so that it isn't destroyed after
its
-     * first use until the process is destroyed, as the running object table is
-     * a process-wide cache of a global table */
+    /* the initial reference is set to "1" ! because if set to "0" it
will be not practis when */
+    /* the ROT referred many times not in the same time (all the objects in the ROT will
*/
+    /* be removed every time the ROT is removed ) */
     runningObjectTableInstance->ref = 1;
     list_init(&runningObjectTableInstance->rot);
@@ -1078,21 +873,6 @@
         IParseDisplayName *pdn;
         hr = IMoniker_BindToObject(class_moniker, pbc, NULL,
                                    &IID_IParseDisplayName, (void **)&pdn);
-        /* fallback to using IClassFactory to get IParseDisplayName -
-         * adsldp.dll depends on this */
-        if (FAILED(hr))
-        {
-            IClassFactory *pcf;
-            hr = IMoniker_BindToObject(class_moniker, pbc, NULL,
-                                       &IID_IClassFactory, (void **)&pcf);
-            if (SUCCEEDED(hr))
-            {
-                hr = IClassFactory_CreateInstance(pcf, NULL,
-                                                  &IID_IParseDisplayName,
-                                                  (void **)&pdn);
-                IClassFactory_Release(pcf);
-            }
-        }
         IMoniker_Release(class_moniker);
         if (SUCCEEDED(hr))
         {
@@ -1211,9 +991,9 @@
         return res;
     }
-    /* If the file is not a storage object then attempt to match various bits in the file
against a
-       pattern in the registry. This case is not frequently used, so I present only the
pseudocode for
-       this case.
+    /* if the file is not a storage object then attemps to match various bits in the file
against a
+       pattern in the registry. this case is not frequently used ! so I present only the
psodocode for
+       this case
      for(i=0;i<nFileTypes;i++)
@@ -1240,7 +1020,7 @@
     nbElm=FileMonikerImpl_DecomposePath(filePathName,&pathDec);
     absFile=pathDec[nbElm-1];
-    /* failed if the path represents a directory and not an absolute file name*/
+    /* failed if the path represente a directory and not an absolute file name*/
     if (!lstrcmpW(absFile, bkslashW))
         return MK_E_INVALIDEXTENSION;
@@ -1335,9 +1115,9 @@
         TRACE("(%p) Deleting\n",This);
-        for (i = 0; i < This->moniker_list->size; i++)
-            HeapFree(GetProcessHeap(), 0, This->moniker_list->interfaces[i]);
-        HeapFree(GetProcessHeap(), 0, This->moniker_list);
+        for (i = 0; i < This->moniker_count; i++)
+            HeapFree(GetProcessHeap(), 0, This->monikers[i]);
+        HeapFree(GetProcessHeap(), 0, This->monikers);
         HeapFree(GetProcessHeap(), 0, This);
     }
@@ -1352,13 +1132,13 @@
     EnumMonikerImpl *This = (EnumMonikerImpl *)iface;
     HRESULT hr = S_OK;
-    TRACE("(%p) TabCurrentPos %d Tablastindx %d\n", This, This->pos,
This->moniker_list->size);
+    TRACE("(%p) TabCurrentPos %d Tablastindx %d\n", This, This->pos,
This->moniker_count);
     /* retrieve the requested number of moniker from the current position */
-    for(i = 0; (This->pos < This->moniker_list->size) && (i <
celt); i++)
+    for(i = 0; (This->pos < This->moniker_count) && (i < celt); i++)
     {
         IStream *stream;
-        hr =
create_stream_on_mip_ro(This->moniker_list->interfaces[This->pos++],
&stream);
+        hr = create_stream_on_mip_ro(This->monikers[This->pos++], &stream);
         if (hr != S_OK) break;
         hr = CoUnmarshalInterface(stream, &IID_IMoniker, (void **)&rgelt[i]);
         IStream_Release(stream);
@@ -1387,7 +1167,7 @@
     TRACE("(%p)\n",This);
-    if  (This->pos + celt >= This->moniker_list->size)
+    if  (This->pos + celt >= This->moniker_count)
         return S_FALSE;
     This->pos += celt;
@@ -1415,35 +1195,21 @@
 static HRESULT   WINAPI EnumMonikerImpl_Clone(IEnumMoniker* iface, IEnumMoniker **
ppenum)
 {
     EnumMonikerImpl *This = (EnumMonikerImpl *)iface;
-    InterfaceList *moniker_list;
+    MInterfacePointer **monikers = HeapAlloc(GetProcessHeap(), 0,
sizeof(*monikers)*This->moniker_count);
     ULONG i;
     TRACE("(%p)\n",This);
-    *ppenum = NULL;
-
-    moniker_list = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(InterfaceList,
interfaces[This->moniker_list->size]));
-    if (!moniker_list)
-        return E_OUTOFMEMORY;
-
-    moniker_list->size = This->moniker_list->size;
-    for (i = 0; i < This->moniker_list->size; i++)
-    {
-        SIZE_T size = FIELD_OFFSET(InterfaceData,
abData[This->moniker_list->interfaces[i]->ulCntData]);
-        moniker_list->interfaces[i] = HeapAlloc(GetProcessHeap(), 0, size);
-        if (!moniker_list->interfaces[i])
-        {
-            ULONG end = i;
-            for (i = 0; i < end; i++)
-                HeapFree(GetProcessHeap(), 0, moniker_list->interfaces[i]);
-            HeapFree(GetProcessHeap(), 0, moniker_list);
-            return E_OUTOFMEMORY;
-        }
-        memcpy(moniker_list->interfaces[i], This->moniker_list->interfaces[i],
size);
+    for (i = 0; i < This->moniker_count; i++)
+    {
+        SIZE_T size = FIELD_OFFSET(MInterfacePointer,
abData[This->monikers[i]->ulCntData]);
+        monikers[i] = HeapAlloc(GetProcessHeap(), 0, size);
+        memcpy(monikers[i], This->monikers[i], size);
     }
     /* copy the enum structure */
-    return EnumMonikerImpl_CreateEnumROTMoniker(moniker_list, This->pos, ppenum);
+    return EnumMonikerImpl_CreateEnumROTMoniker(monikers, This->moniker_count,
+        This->pos, ppenum);
 }
 /* Virtual function table for the IEnumMoniker class. */
@@ -1463,7 +1229,8 @@
  *        Used by EnumRunning to create the structure and EnumClone
  *       to copy the structure
  */
-static HRESULT WINAPI EnumMonikerImpl_CreateEnumROTMoniker(InterfaceList *moniker_list,
+static HRESULT WINAPI EnumMonikerImpl_CreateEnumROTMoniker(MInterfacePointer **monikers,
+                                                 ULONG moniker_count,
                                                  ULONG current_pos,
                                                  IEnumMoniker **ppenumMoniker)
 {
@@ -1483,7 +1250,8 @@
     /* the initial reference is set to "1" */
     This->ref = 1;                  /* set the ref count to one         */
     This->pos = current_pos;                /* Set the list start posn */
-    This->moniker_list = moniker_list;
+    This->moniker_count = moniker_count; /* Need the same size table as ROT */
+    This->monikers = monikers;
     *ppenumMoniker =  (IEnumMoniker*)This;
@@ -1659,13 +1427,3 @@
     *outer = (IUnknown *)&This->lpVtbl;
     return S_OK;
 }
-
-void * __RPC_USER MIDL_user_allocate(size_t size)
-{
-    return HeapAlloc(GetProcessHeap(), 0, size);
-}
-
-void __RPC_USER MIDL_user_free(void *p)
-{
-    HeapFree(GetProcessHeap(), 0, p);
-}
Modified: trunk/reactos/dll/win32/ole32/ole32.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ole32/ole32.rbui…
==============================================================================
--- trunk/reactos/dll/win32/ole32/ole32.rbuild [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/ole32/ole32.rbuild [iso-8859-1] Tue Oct 28 09:32:41 2008
@@ -14,7 +14,6 @@
        <library>advapi32</library>
        <library>user32</library>
        <library>gdi32</library>
-       <library>ole32_irot_client</library>
        <library>ole32_proxy</library>
        <library>rpcrt4</library>
        <library>kernel32</library>