Sync from Wine-20050830 to Wine-0_9_1:
Francois Gouget <fgouget@free.fr>
- Assorted spelling fixes.
- Fix .spec declarations for functinos with 64bit arguments (reported by
  winapi_check).
Mike Hearn <mh@codeweavers.com>
- Robert Shearman <rob@codeweavers.com>
  Change stub manager to track the number of normal marshals instead of
  using the state machine so that multiple marshals of the same object
  and interface work correctly.
Robert Shearman <rob@codeweavers.com>
- Pass WM_QUIT to outer modal loop.
- Fix the return codes during unmarshaling so that it returns failure
  codes instead of S_FALSE returned from IStream_Read.
- Don't fail in CoRegisterClassObject if the class already exists and
  the REGCLS_MULTIPLEUSE flag is specified.
- Fix ref-counting rules to match native DCOM Dlls.
- Add exception handling for stubs.
- Implement OleRegEnumVerbs.
- The [string] attribute is only valid on byte, char and wchar_t types,
  so replace "unsigned short" by "WCHAR".
- Implement OleIsRunning.
- Add a stubbed out implementation of IAdviseSink and advise the
  delegate object to use it.
- Initialize out pointer to NULL before access check in
  IStorage_CreateStorage.
- WriteClassStg should return E_INVALIDARG if pstg is NULL instead of
  asserting.
- ReadClassStg should return E_INVALIDARG if pstg is NULL instead of
  crashing and a NULL pclsid should cause it to return the same
  value.
- Make the interfaces that should be supported by the data cache
  explicit so their is no confusion in this file as to what it should
  be implementing and what this object should implement.
- Delegate some IOleObject methods to the server IOleObject if it is
  running.
- Implement some IRunningObject functions that actually start the server
  and initialize it.
- Remove redunant braces.
- Compact multi-line comments that fit into one line.
- Remove comments that state the obvious.
- Remove extra brackets that are redundant because the -> operator
  binds tighter than &.
- Change "this" to "This" to make code more like other interface
  implementations.
- Remove redundant comparisons with NULL for pointers.
- Re-arrange some functions and vtables so we don't have declarations
  for all of the functions in the file.
- Fix a trace to refer to the object ID rather than the legacy MID.
- Fix the error case of CoMarshalInterThreadInterface to release the
  stream.
- Move all 16-bit functions to an appropriate 16-bit file.
- Implement OLE object notifications, making sure to cope with the case
  of the advise holder not being created because no notifications are
  needed.
- Implement a Stop function and use this to properly implement
  IOleObject_Close, IAdviseSink_OnClose and the destructor.
- We shouldn't pass the application name into CreateProcess because the
  value stored in the registry could include arguments.
- Extend COM_OpenKeyForCLSID to open a subkey and return an HRESULT.
- Fix up the callers and reorganize CoGetClassObject to split out the
  inproc code into another function.
Alex Villacís Lasso <a_villacis@palosanto.com>
- Add NULL check for sinkInterface in DataCache_GetAdvise.
- Add missing ! to fix a reversed condition check in
  OleCreateDefaultHandler, in order to match intent in comment.
Vincent Béron <vberon@mecano.gme.usherb.ca>
- Use the proper calling convention for 2 16-bit functions.
Alexandre Julliard <julliard@winehq.org>
- We are no longer generating .spec.c files.
- Use a more portable scheme for storing the name of a critical
  section.
- Fixed some traces to use the right printf format and avoid typecasts.
- Removed unused debug channels.
- We are no longer generating .dbg.c files.
Richard Cohen <richard@daijobu.co.uk>
- Relax the share mode validation for transacted storage, with a test.
Eric Pouech <eric.pouech@wanadoo.fr>
- Fixes for function prototypes without arguments.
Michael Jung <mjung@iss.tu-darmstadt.de>
- Added tracing to CoCreateInstance.
Markus Amsler <markus.amsler@oribi.org>
- Improve c2man Documented-Total count.
Modified: trunk/reactos/lib/ole32/antimoniker.c
Modified: trunk/reactos/lib/ole32/bindctx.c
Modified: trunk/reactos/lib/ole32/clipboard.c
Modified: trunk/reactos/lib/ole32/compobj.c
Modified: trunk/reactos/lib/ole32/compobj_private.h
Modified: trunk/reactos/lib/ole32/datacache.c
Modified: trunk/reactos/lib/ole32/dcom.idl
Modified: trunk/reactos/lib/ole32/defaulthandler.c
Modified: trunk/reactos/lib/ole32/errorinfo.c
Modified: trunk/reactos/lib/ole32/git.c
Modified: trunk/reactos/lib/ole32/ifs.c
Modified: trunk/reactos/lib/ole32/marshal.c
Modified: trunk/reactos/lib/ole32/memlockbytes16.c
Modified: trunk/reactos/lib/ole32/moniker.c
Modified: trunk/reactos/lib/ole32/ole16.c
Modified: trunk/reactos/lib/ole32/ole2.c
Modified: trunk/reactos/lib/ole32/ole2.spec
Modified: trunk/reactos/lib/ole32/ole2_16.c
Modified: trunk/reactos/lib/ole32/ole2nls.c
Modified: trunk/reactos/lib/ole32/ole2stubs.c
Modified: trunk/reactos/lib/ole32/oleproxy.c
Modified: trunk/reactos/lib/ole32/rpc.c
Modified: trunk/reactos/lib/ole32/storage.c
Modified: trunk/reactos/lib/ole32/storage.spec
Modified: trunk/reactos/lib/ole32/storage32.c
Modified: trunk/reactos/lib/ole32/stubmanager.c

Modified: trunk/reactos/lib/ole32/antimoniker.c
--- trunk/reactos/lib/ole32/antimoniker.c	2005-11-20 14:56:24 UTC (rev 19369)
+++ trunk/reactos/lib/ole32/antimoniker.c	2005-11-20 15:01:10 UTC (rev 19370)
@@ -442,7 +442,7 @@
         return E_POINTER;
 
     if (pmkToLeft!=NULL){
-        FIXME("() pmkToLeft!=NULL not implemented \n");
+        FIXME("() pmkToLeft!=NULL not implemented\n");
         return E_NOTIMPL;
     }
 

Modified: trunk/reactos/lib/ole32/bindctx.c
--- trunk/reactos/lib/ole32/bindctx.c	2005-11-20 14:56:24 UTC (rev 19369)
+++ trunk/reactos/lib/ole32/bindctx.c	2005-11-20 15:01:10 UTC (rev 19370)
@@ -170,7 +170,7 @@
     if (lastIndex == This->bindCtxTableSize){ /* the table is full so it must be resized */
 
         if (This->bindCtxTableSize > (MAX_TAB_SIZE-BLOCK_TAB_SIZE)){
-            FIXME("This->bindCtxTableSize: %ld is out of data limite \n",This->bindCtxTableSize);
+            FIXME("This->bindCtxTableSize: %ld is out of data limite\n", This->bindCtxTableSize);
             return E_FAIL;
         }
 
@@ -351,7 +351,7 @@
         This->bindCtxTableSize+=BLOCK_TAB_SIZE; /* new table size */
         if (This->bindCtxTableSize > (MAX_TAB_SIZE-BLOCK_TAB_SIZE))
         {
-            FIXME("This->bindCtxTableSize: %ld is out of data limite \n",This->bindCtxTableSize);
+            FIXME("This->bindCtxTableSize: %ld is out of data limite\n", This->bindCtxTableSize);
             return E_FAIL;
         }
         This->bindCtxTable = HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,This->bindCtxTable,
@@ -526,15 +526,6 @@
 }
 
 /******************************************************************************
- *        CreateBindCtx16
- ******************************************************************************/
-HRESULT WINAPI CreateBindCtx16(DWORD reserved, LPBC * ppbc)
-{
-    FIXME("(%ld,%p),stub!\n",reserved,ppbc);
-    return E_NOTIMPL;
-}
-
-/******************************************************************************
  *        CreateBindCtx (OLE32.@)
  ******************************************************************************/
 HRESULT WINAPI CreateBindCtx(DWORD reserved, LPBC * ppbc)

Modified: trunk/reactos/lib/ole32/clipboard.c
--- trunk/reactos/lib/ole32/clipboard.c	2005-11-20 14:56:24 UTC (rev 19369)
+++ trunk/reactos/lib/ole32/clipboard.c	2005-11-20 15:01:10 UTC (rev 19370)
@@ -303,7 +303,7 @@
  *  Places a pointer to the specified data object onto the clipboard,
  *  making the data object accessible to the OleGetClipboard function.
  *
- * RETURNS:
+ * RETURNS
  *
  *    S_OK                  IDataObject pointer placed on the clipboard
  *    CLIPBRD_E_CANT_OPEN   OpenClipboard failed
@@ -478,16 +478,6 @@
   return hr;
 }
 
-/***********************************************************************
- *           OleFlushClipboard   [OLE2.76]
- */
-
-HRESULT WINAPI OleFlushClipboard16(void)
-{
-  return OleFlushClipboard();
-}
-
-
 /******************************************************************************
  *              OleFlushClipboard        [OLE32.@]
  *  Renders the data from the source IDataObject into the windows clipboard

Modified: trunk/reactos/lib/ole32/compobj.c
--- trunk/reactos/lib/ole32/compobj.c	2005-11-20 14:56:24 UTC (rev 19369)
+++ trunk/reactos/lib/ole32/compobj.c	2005-11-20 15:01:10 UTC (rev 19370)
@@ -56,24 +56,20 @@
 
 #include "windef.h"
 #include "winbase.h"
+#include "winerror.h"
+#include "winreg.h"
 #include "winuser.h"
 #include "objbase.h"
 #include "ole2.h"
 #include "ole2ver.h"
-#include "rpc.h"
-#include "winerror.h"
-#include "winreg.h"
-#include "wownt32.h"
-#include "wine/unicode.h"
-#include "objbase.h"
+
 #include "compobj_private.h"
 
+#include "wine/unicode.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(ole);
 
-typedef LPCSTR LPCOLESTR16;
-
 HINSTANCE OLE32_hInstance = 0; /* FIXME: make static ... */
 
 #define ARRAYSIZE(array) (sizeof(array)/sizeof((array)[0]))
@@ -97,7 +93,7 @@
 {
     0, 0, &csApartment,
     { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList },
-      0, 0, { 0, (DWORD)(__FILE__ ": csApartment") }
+      0, 0, { (DWORD_PTR)(__FILE__ ": csApartment") }
 };
 static CRITICAL_SECTION csApartment = { &critsect_debug, -1, 0, 0, 0, 0 };
 
@@ -134,7 +130,7 @@
 {
     0, 0, &csRegisteredClassList,
     { &class_cs_debug.ProcessLocksList, &class_cs_debug.ProcessLocksList },
-      0, 0, { 0, (DWORD)(__FILE__ ": csRegisteredClassList") }
+      0, 0, { (DWORD_PTR)(__FILE__ ": csRegisteredClassList") }
 };
 static CRITICAL_SECTION csRegisteredClassList = { &class_cs_debug, -1, 0, 0, 0, 0 };
 
@@ -161,7 +157,7 @@
 {
     0, 0, &csOpenDllList,
     { &dll_cs_debug.ProcessLocksList, &dll_cs_debug.ProcessLocksList },
-      0, 0, { 0, (DWORD)(__FILE__ ": csOpenDllList") }
+      0, 0, { (DWORD_PTR)(__FILE__ ": csOpenDllList") }
 };
 static CRITICAL_SECTION csOpenDllList = { &dll_cs_debug, -1, 0, 0, 0, 0 };
 
@@ -419,7 +415,8 @@
     switch (msg)
     {
     case DM_EXECUTERPC:
-        return RPC_ExecuteCall((struct dispatch_params *)lParam);
+        RPC_ExecuteCall((struct dispatch_params *)lParam);
+        return 0;
     default:
         return DefWindowProcW(hWnd, msg, wParam, lParam);
     }
@@ -981,14 +978,36 @@
   return MultiByteToWideChar( CP_ACP, 0, xguid, -1, str, cmax );
 }
 
-/* open HKCR\\CLSID\\{string form of clsid} key */
-DWORD COM_OpenKeyForCLSID(REFCLSID clsid, REGSAM access, HKEY *key)
+/* open HKCR\\CLSID\\{string form of clsid}\\{keyname} key */
+HRESULT COM_OpenKeyForCLSID(REFCLSID clsid, LPCWSTR keyname, REGSAM access, HKEY *subkey)
 {
     static const WCHAR wszCLSIDSlash[] = {'C','L','S','I','D','\\',0};
     WCHAR path[CHARS_IN_GUID + ARRAYSIZE(wszCLSIDSlash) - 1];
+    LONG res;
+    HKEY key;
+
     strcpyW(path, wszCLSIDSlash);
     StringFromGUID2(clsid, path + strlenW(wszCLSIDSlash), CHARS_IN_GUID);
-    return RegOpenKeyExW(HKEY_CLASSES_ROOT, path, 0, access, key);
+    res = RegOpenKeyExW(HKEY_CLASSES_ROOT, path, 0, keyname ? KEY_READ : access, &key);
+    if (res == ERROR_FILE_NOT_FOUND)
+        return REGDB_E_CLASSNOTREG;
+    else if (res != ERROR_SUCCESS)
+        return REGDB_E_READREGDB;
+
+    if (!keyname)
+    {
+        *subkey = key;
+        return S_OK;
+    }
+
+    res = RegOpenKeyExW(key, keyname, 0, access, subkey);
+    RegCloseKey(key);
+    if (res == ERROR_FILE_NOT_FOUND)
+        return REGDB_E_KEYMISSING;
+    else if (res != ERROR_SUCCESS)
+        return REGDB_E_READREGDB;
+
+    return S_OK;
 }
 
 /******************************************************************************
@@ -1007,25 +1026,15 @@
  */
 HRESULT WINAPI ProgIDFromCLSID(REFCLSID clsid, LPOLESTR *lplpszProgID)
 {
-  static const WCHAR wszProgID[] = {'P','r','o','g','I','D',0};
-  HKEY     hkey = NULL;
-  HKEY     hkey_clsid;
-  HRESULT  ret = S_OK;
-
-  if (ERROR_SUCCESS != COM_OpenKeyForCLSID(clsid, KEY_READ, &hkey_clsid))
-    ret = REGDB_E_CLASSNOTREG;
-
-  if (ret == S_OK)
-  {
-    if (RegOpenKeyExW(hkey_clsid, wszProgID, 0, KEY_READ, &hkey))
-      ret = REGDB_E_CLASSNOTREG;
-    RegCloseKey(hkey_clsid);
-  }
-
-  if (ret == S_OK)
-  {
+    static const WCHAR wszProgID[] = {'P','r','o','g','I','D',0};
+    HKEY     hkey;
+    HRESULT  ret;
     LONG progidlen = 0;
 
+    ret = COM_OpenKeyForCLSID(clsid, wszProgID, KEY_READ, &hkey);
+    if (FAILED(ret))
+        return ret;
+
     if (RegQueryValueW(hkey, NULL, NULL, &progidlen))
       ret = REGDB_E_CLASSNOTREG;
 
@@ -1040,49 +1049,12 @@
       else
         ret = E_OUTOFMEMORY;
     }
-  }
 
-  RegCloseKey(hkey);
-  return ret;
+    RegCloseKey(hkey);
+    return ret;
 }
 
 /******************************************************************************
- *		CLSIDFromProgID [COMPOBJ.61]
- *
- * Converts a program ID into the respective GUID.
- *
- * PARAMS
- *  progid       [I] program id as found in registry
- *  riid         [O] associated CLSID
- *
- * RETURNS
- *	Success: S_OK
- *  Failure: CO_E_CLASSSTRING - the given ProgID cannot be found.
- */
-HRESULT WINAPI CLSIDFromProgID16(LPCOLESTR16 progid, LPCLSID riid)
-{
-	char	*buf,buf2[80];
-	LONG	buf2len;
-	HRESULT	err;
-	HKEY	xhkey;
-
-	buf = HeapAlloc(GetProcessHeap(),0,strlen(progid)+8);
-	sprintf(buf,"%s\\CLSID",progid);
-	if ((err=RegOpenKeyA(HKEY_CLASSES_ROOT,buf,&xhkey))) {
-		HeapFree(GetProcessHeap(),0,buf);
-                return CO_E_CLASSSTRING;
-	}
-	HeapFree(GetProcessHeap(),0,buf);
-	buf2len = sizeof(buf2);
-	if ((err=RegQueryValueA(xhkey,NULL,buf2,&buf2len))) {
-		RegCloseKey(xhkey);
-                return CO_E_CLASSSTRING;
-	}
-	RegCloseKey(xhkey);
-	return __CLSIDFromStringA(buf2,riid);
-}
-
-/******************************************************************************
  *		CLSIDFromProgID	[OLE32.@]
  *
  * Converts a program id into the respective GUID.
@@ -1122,7 +1094,6 @@
 }
 
 
-
 /*****************************************************************************
  *             CoGetPSClsid [OLE32.@]
  *
@@ -1388,7 +1359,14 @@
    */
   hr = COM_GetRegisteredClassObject(rclsid, dwClsContext, &foundObject);
   if (hr == S_OK) {
+    if (flags & REGCLS_MULTIPLEUSE) {
+      if (dwClsContext & CLSCTX_LOCAL_SERVER)
+        hr = CoLockObjectExternal(foundObject, TRUE, FALSE);
+      IUnknown_Release(foundObject);
+      return hr;
+    }
     IUnknown_Release(foundObject);
+    ERR("object already registered for class %s\n", debugstr_guid(rclsid));
     return CO_E_OBJISREG;
   }
 
@@ -1559,6 +1537,40 @@
 	return hres;
 }
 
+static HRESULT get_inproc_class_object(HKEY hkeydll, REFCLSID rclsid, REFIID riid, void **ppv)
+{
+    HINSTANCE hLibrary;
+    typedef HRESULT (CALLBACK *DllGetClassObjectFunc)(REFCLSID clsid, REFIID iid, LPVOID *ppv);
+    DllGetClassObjectFunc DllGetClassObject;
+    WCHAR dllpath[MAX_PATH+1];
+
+    if (COM_RegReadPath(hkeydll, NULL, NULL, dllpath, ARRAYSIZE(dllpath)) != ERROR_SUCCESS)
+    {
+        /* failure: CLSID is not found in registry */
+        WARN("class %s not registered inproc\n", debugstr_guid(rclsid));
+        return REGDB_E_CLASSNOTREG;
+    }
+
+    if ((hLibrary = LoadLibraryExW(dllpath, 0, LOAD_WITH_ALTERED_SEARCH_PATH)) == 0)
+    {
+        /* failure: DLL could not be loaded */
+        ERR("couldn't load in-process dll %s\n", debugstr_w(dllpath));
+        return E_ACCESSDENIED; /* FIXME: or should this be CO_E_DLLNOTFOUND? */
+    }
+
+    if (!(DllGetClassObject = (DllGetClassObjectFunc)GetProcAddress(hLibrary, "DllGetClassObject")))
+    {
+        /* failure: the dll did not export DllGetClassObject */
+        ERR("couldn't find function DllGetClassObject in %s\n", debugstr_w(dllpath));
+        FreeLibrary( hLibrary );
+        return CO_E_DLLNOTFOUND;
+    }
+
+    /* OK: get the ClassObject */
+    COMPOBJ_DLLList_Add( hLibrary );
+    return DllGetClassObject(rclsid, riid, ppv);
+}
+
 /***********************************************************************
  *           CoGetClassObject [OLE32.@]
  *
@@ -1600,50 +1612,58 @@
       return hres;
     }
 
-    /* first try: in-process */
-    if ((CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER) & dwClsContext)
+    /* First try in-process server */
+    if (CLSCTX_INPROC_SERVER & dwClsContext)
     {
         static const WCHAR wszInprocServer32[] = {'I','n','p','r','o','c','S','e','r','v','e','r','3','2',0};
-        HINSTANCE hLibrary;
-        typedef HRESULT (CALLBACK *DllGetClassObjectFunc)(REFCLSID clsid, REFIID iid, LPVOID *ppv);
-        DllGetClassObjectFunc DllGetClassObject;
-        WCHAR dllpath[MAX_PATH+1];
         HKEY hkey;
 
-        if (ERROR_SUCCESS != COM_OpenKeyForCLSID(rclsid, KEY_READ, &hkey))
+        hres = COM_OpenKeyForCLSID(rclsid, wszInprocServer32, KEY_READ, &hkey);
+        if (FAILED(hres))
         {
-            ERR("class %s not registered\n", debugstr_guid(rclsid));
-            hres = REGDB_E_CLASSNOTREG;
+            if (hres == REGDB_E_CLASSNOTREG)
+                ERR("class %s not registered\n", debugstr_guid(rclsid));
+            else
+                WARN("class %s not registered as in-proc server\n", debugstr_guid(rclsid));
         }
 
-        if (COM_RegReadPath(hkey, wszInprocServer32, NULL, dllpath, ARRAYSIZE(dllpath)) != ERROR_SUCCESS)
+        if (SUCCEEDED(hres))
         {
-            /* failure: CLSID is not found in registry */
-            WARN("class %s not registered inproc\n", debugstr_guid(rclsid));
-            hres = REGDB_E_CLASSNOTREG;
+            hres = get_inproc_class_object(hkey, rclsid, iid, ppv);
+            RegCloseKey(hkey);
         }
-        else
+
+        /* return if we got a class, otherwise fall through to one of the
+         * other types */
+        if (SUCCEEDED(hres))
+            return hres;
+    }
+
+    /* Next try in-process handler */
+    if (CLSCTX_INPROC_HANDLER & dwClsContext)
+    {
+        static const WCHAR wszInprocHandler32[] = {'I','n','p','r','o','c','H','a','n','d','l','e','r','3','2',0};
+        HKEY hkey;
+
+        hres = COM_OpenKeyForCLSID(rclsid, wszInprocHandler32, KEY_READ, &hkey);
+        if (FAILED(hres))
         {
-            if ((hLibrary = LoadLibraryExW(dllpath, 0, LOAD_WITH_ALTERED_SEARCH_PATH)) == 0)
-            {
-                /* failure: DLL could not be loaded */
-                ERR("couldn't load InprocServer32 dll %s\n", debugstr_w(dllpath));
-                hres = E_ACCESSDENIED; /* FIXME: or should this be CO_E_DLLNOTFOUND? */
-            }
-            else if (!(DllGetClassObject = (DllGetClassObjectFunc)GetProcAddress(hLibrary, "DllGetClassObject")))
-            {
-                /* failure: the dll did not export DllGetClassObject */
-                ERR("couldn't find function DllGetClassObject in %s\n", debugstr_w(dllpath));
-                FreeLibrary( hLibrary );
-                hres = CO_E_DLLNOTFOUND;
-            }
+            if (hres == REGDB_E_CLASSNOTREG)
+                ERR("class %s not registered\n", debugstr_guid(rclsid));
             else
-            {
-                /* OK: get the ClassObject */
-                COMPOBJ_DLLList_Add( hLibrary );
-                return DllGetClassObject(rclsid, iid, ppv);
-            }
+                WARN("class %s not registered in-proc handler\n", debugstr_guid(rclsid));
         }
+
+        if (SUCCEEDED(hres))
+        {
+            hres = get_inproc_class_object(hkey, rclsid, iid, ppv);
+            RegCloseKey(hkey);
+        }
+
+        /* return if we got a class, otherwise fall through to one of the
+         * other types */
+        if (SUCCEEDED(hres))
+            return hres;
     }
 
     /* Next try out of process */
@@ -1659,26 +1679,13 @@
         hres = E_NOINTERFACE;
     }
 
+    if (FAILED(hres))
+        ERR("no class object %s could be created for for context 0x%lx\n",
+            debugstr_guid(rclsid), dwClsContext);
     return hres;
 }
 
 /***********************************************************************
- *           CoGetClassObject [COMPOBJ.7]
- *
- */
-HRESULT WINAPI CoGetClassObject16(
-    REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo,
-    REFIID iid, LPVOID *ppv)
-{
-    FIXME(", stub!\n\tCLSID:\t%s,\n\tIID:\t%s\n", debugstr_guid(rclsid), debugstr_guid(iid));
-
-    if (pServerInfo) {
-	FIXME("\tpServerInfo: name=%s\n",debugstr_w(pServerInfo->pwszName));
-	FIXME("\t\tpAuthInfo=%p\n",pServerInfo->pAuthInfo);
-    }
-    return E_NOTIMPL;
-}
-/***********************************************************************
  *        CoResumeClassObjects (OLE32.@)
  *
  * Resumes all class objects registered with REGCLS_SUSPENDED.
@@ -1800,6 +1807,9 @@
   HRESULT hres;
   LPCLASSFACTORY lpclf = 0;
 
+  TRACE("(rclsid=%s, pUnkOuter=%p, dwClsContext=%08lx, riid=%s, ppv=%p)\n", debugstr_guid(rclsid),
+        pUnkOuter, dwClsContext, debugstr_guid(iid), ppv);
+
   if (!COM_CurrentApt()) return CO_E_NOTINITIALIZED;
 
   /*
@@ -1855,23 +1865,6 @@
 }
 
 /***********************************************************************
- *           CoCreateInstance [COMPOBJ.13]
- */
-HRESULT WINAPI CoCreateInstance16(
-	REFCLSID rclsid,
-	LPUNKNOWN pUnkOuter,
-	DWORD dwClsContext,
-	REFIID iid,
-	LPVOID *ppv)
-{
-  FIXME("(%s, %p, %lx, %s, %p), stub!\n", 
-	debugstr_guid(rclsid), pUnkOuter, dwClsContext, debugstr_guid(iid),
-	ppv
-  );
-  return E_NOTIMPL;
-}
-
-/***********************************************************************
  *           CoCreateInstanceEx [OLE32.@]
  */
 HRESULT WINAPI CoCreateInstanceEx(
@@ -2207,16 +2200,12 @@
     LONG len;
     HRESULT res = S_OK;
 
-    if (ERROR_SUCCESS != COM_OpenKeyForCLSID(clsidOld, KEY_READ, &hkey))
-    {
-        res = REGDB_E_CLASSNOTREG;
+    res = COM_OpenKeyForCLSID(clsidOld, wszAutoConvertTo, KEY_READ, &hkey);
+    if (FAILED(res))
         goto done;
-    }
 
     len = sizeof(buf);
-    /* we can just query for the default value of AutoConvertTo key like that,
-       without opening the AutoConvertTo key and querying for NULL (default) */
-    if (RegQueryValueW(hkey, wszAutoConvertTo, buf, &len))
+    if (RegQueryValueW(hkey, NULL, buf, &len))
     {
         res = REGDB_E_KEYMISSING;
         goto done;
@@ -2254,11 +2243,9 @@
     LONG auto_treat_as_size = sizeof(auto_treat_as);
     CLSID id;
 
-    if (ERROR_SUCCESS != COM_OpenKeyForCLSID(clsidOld, KEY_READ | KEY_WRITE, &hkey))
-    {
-        res = REGDB_E_CLASSNOTREG;
-	goto done;
-    }
+    res = COM_OpenKeyForCLSID(clsidOld, NULL, KEY_READ | KEY_WRITE, &hkey);
+    if (FAILED(res))
+        goto done;
     if (!memcmp( clsidOld, clsidNew, sizeof(*clsidOld) ))
     {
        if (!RegQueryValueW(hkey, wszAutoTreatAs, auto_treat_as, &auto_treat_as_size) &&
@@ -2315,13 +2302,11 @@
     FIXME("(%s,%p)\n", debugstr_guid(clsidOld), clsidNew);
     memcpy(clsidNew,clsidOld,sizeof(CLSID)); /* copy over old value */
 
-    if (COM_OpenKeyForCLSID(clsidOld, KEY_READ, &hkey))
+    res = COM_OpenKeyForCLSID(clsidOld, wszTreatAs, KEY_READ, &hkey);
+    if (FAILED(res))
+        goto done;
+    if (RegQueryValueW(hkey, NULL, szClsidNew, &len))
     {
-        res = REGDB_E_CLASSNOTREG;
-	goto done;
-    }
-    if (RegQueryValueW(hkey, wszTreatAs, szClsidNew, &len))
-    {
         res = S_FALSE;
 	goto done;
     }
@@ -2688,6 +2673,12 @@
                 TRACE("received message whilst waiting for RPC: 0x%04x\n", msg.message);
                 TranslateMessage(&msg);
                 DispatchMessageW(&msg);
+                if (msg.message == WM_QUIT)
+                {
+                    TRACE("resending WM_QUIT to outer message loop\n");
+                    PostQuitMessage(msg.wParam);
+                    goto done;
+                }
             }
         }
         else if ((res >= WAIT_OBJECT_0) && (res < WAIT_OBJECT_0 + cHandles))
@@ -2708,6 +2699,7 @@
             break;
         }
     }
+done:
     TRACE("-- 0x%08lx\n", hr);
     return hr;
 }

Modified: trunk/reactos/lib/ole32/compobj_private.h
--- trunk/reactos/lib/ole32/compobj_private.h	2005-11-20 14:56:24 UTC (rev 19369)
+++ trunk/reactos/lib/ole32/compobj_private.h	2005-11-20 15:01:10 UTC (rev 19370)
@@ -71,6 +71,7 @@
     IID               iid;        /* RO */
     IPID              ipid;       /* RO */
     IUnknown         *iface;      /* RO */
+    MSHLFLAGS         flags;      /* so we can enforce process-local marshalling rules (RO) */
 };
 
 
@@ -87,7 +88,14 @@
     OID               oid;        /* apartment-scoped unique identifier (RO) */
     IUnknown         *object;     /* the object we are managing the stub for (RO) */
     ULONG             next_ipid;  /* currently unused (LOCK) */
-    STUB_STATE        state;      /* state machine (CS lock) */
+
+    /* We need to keep a count of the outstanding marshals, so we can enforce the
+     * marshalling rules (ie, you can only unmarshal normal marshals once). Note
+     * that these counts do NOT include unmarshalled interfaces, once a stream is
+     * unmarshalled and a proxy set up, this count is decremented.
+     */
+
+    ULONG             norm_refs;  /* refcount of normal marshals (CS lock) */
 };
 
 /* imported interface proxy */
@@ -163,22 +171,23 @@
 extern HRESULT WINE_StringFromCLSID(const CLSID *id,LPSTR idstr);
 HRESULT WINAPI __CLSIDFromStringA(LPCSTR idstr, CLSID *id);
 
-DWORD COM_OpenKeyForCLSID(REFCLSID clsid, REGSAM access, HKEY *key);
+HRESULT COM_OpenKeyForCLSID(REFCLSID clsid, LPCWSTR keyname, REGSAM access, HKEY *key);
 HRESULT MARSHAL_GetStandardMarshalCF(LPVOID *ppv);
 
 /* Stub Manager */
 
 ULONG stub_manager_int_addref(struct stub_manager *This);
 ULONG stub_manager_int_release(struct stub_manager *This);
-struct stub_manager *new_stub_manager(APARTMENT *apt, IUnknown *object, MSHLFLAGS mshlflags);
+struct stub_manager *new_stub_manager(APARTMENT *apt, IUnknown *object);
 ULONG stub_manager_ext_addref(struct stub_manager *m, ULONG refs);
 ULONG stub_manager_ext_release(struct stub_manager *m, ULONG refs);
-struct ifstub *stub_manager_new_ifstub(struct stub_manager *m, IRpcStubBuffer *sb, IUnknown *iptr, REFIID iid);
+struct ifstub *stub_manager_new_ifstub(struct stub_manager *m, IRpcStubBuffer *sb, IUnknown *iptr, REFIID iid, MSHLFLAGS flags);
+struct ifstub *stub_manager_find_ifstub(struct stub_manager *m, REFIID iid, MSHLFLAGS flags);
 struct stub_manager *get_stub_manager(APARTMENT *apt, OID oid);
 struct stub_manager *get_stub_manager_from_object(APARTMENT *apt, void *object);
-BOOL stub_manager_notify_unmarshal(struct stub_manager *m);
-BOOL stub_manager_is_table_marshaled(struct stub_manager *m);
-void stub_manager_release_marshal_data(struct stub_manager *m, ULONG refs);
+BOOL stub_manager_notify_unmarshal(struct stub_manager *m, const IPID *ipid);
+BOOL stub_manager_is_table_marshaled(struct stub_manager *m, const IPID *ipid);
+void stub_manager_release_marshal_data(struct stub_manager *m, ULONG refs, const IPID *ipid);
 HRESULT ipid_to_stub_manager(const IPID *ipid, APARTMENT **stub_apt, struct stub_manager **stubmgr_ret);
 IRpcStubBuffer *ipid_to_apt_and_stubbuffer(const IPID *ipid, APARTMENT **stub_apt);
 HRESULT start_apartment_remote_unknown(void);
@@ -191,7 +200,7 @@
 
 void    RPC_StartRemoting(struct apartment *apt);
 HRESULT RPC_CreateClientChannel(const OXID *oxid, const IPID *ipid, IRpcChannelBuffer **pipebuf);
-HRESULT RPC_ExecuteCall(struct dispatch_params *params);
+void    RPC_ExecuteCall(struct dispatch_params *params);
 HRESULT RPC_RegisterInterface(REFIID riid);
 void    RPC_UnregisterInterface(REFIID riid);
 void    RPC_StartLocalServer(REFCLSID clsid, IStream *stream);
@@ -247,13 +256,8 @@
 #define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field))
 
 /* helpers for debugging */
-#ifdef __i386__
-# define DEBUG_SET_CRITSEC_NAME(cs, name) (cs)->DebugInfo->Spare[1] = (DWORD)(__FILE__ ": " name)
-# define DEBUG_CLEAR_CRITSEC_NAME(cs) (cs)->DebugInfo->Spare[1] = 0
-#else
-# define DEBUG_SET_CRITSEC_NAME(cs, name)
-# define DEBUG_CLEAR_CRITSEC_NAME(cs)
-#endif
+# define DEBUG_SET_CRITSEC_NAME(cs, name) (cs)->DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": " name)
+# define DEBUG_CLEAR_CRITSEC_NAME(cs) (cs)->DebugInfo->Spare[0] = 0
 
 extern HINSTANCE OLE32_hInstance; /* FIXME: make static */
 

Modified: trunk/reactos/lib/ole32/datacache.c
--- trunk/reactos/lib/ole32/datacache.c	2005-11-20 14:56:24 UTC (rev 19369)
+++ trunk/reactos/lib/ole32/datacache.c	2005-11-20 15:01:10 UTC (rev 19370)
@@ -1390,9 +1390,11 @@
 
   if (ppAdvSink!=NULL)
   {
-    IAdviseSink_QueryInterface(this->sinkInterface,
+    if (this->sinkInterface != NULL)
+        IAdviseSink_QueryInterface(this->sinkInterface,
 			       &IID_IAdviseSink,
 			       (void**)ppAdvSink);
+    else *ppAdvSink = NULL;
   }
 
   return S_OK;

Modified: trunk/reactos/lib/ole32/dcom.idl
--- trunk/reactos/lib/ole32/dcom.idl	2005-11-20 14:56:24 UTC (rev 19369)
+++ trunk/reactos/lib/ole32/dcom.idl	2005-11-20 15:01:10 UTC (rev 19370)
@@ -1,292 +1,292 @@
-/*
- * Copyright 2003 Ove KÕven, TransGaming Technologies
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-/* see http://www.microsoft.com/msj/0398/dcom.htm */
-/* and the official DCOM specification
- * (there's a copy at http://www.grimes.demon.co.uk/DCOM/DCOMSpec.htm) */
-
-import "unknwn.idl";
-
-[
-  uuid(99fcfe60-5260-101b-bbcb-00aa0021347a),
-  pointer_default(unique)
-]
-interface ObjectRpcBaseTypes
-{
-  typedef unsigned hyper ID;
-  typedef ID MID;
-  typedef ID OXID;
-  typedef ID OID;
-  typedef ID SETID;
-  typedef GUID IPID;
-  typedef GUID CID;
-  typedef REFGUID REFIPID;
-
-  const unsigned short COM_MINOR_VERSION_1 = 1;
-  const unsigned short COM_MINOR_VERSION_2 = 2;
-
-  const unsigned short COM_MAJOR_VERSION = 5;
-  const unsigned short COM_MINOR_VERSION = 3;
-
-  typedef struct tagCOMVERSION {
-    unsigned short MajorVersion;
-    unsigned short MinorVersion;
-  } COMVERSION;
-
-  const unsigned long ORPCF_NULL = 0;
-  const unsigned long ORPCF_LOCAL = 1;
-  const unsigned long ORPCF_RESERVED1 = 2;
-  const unsigned long ORPCF_RESERVED2 = 4;
-  const unsigned long ORPCF_RESERVED3 = 8;
-  const unsigned long ORPCF_RESERVED4 = 16;
-
-  typedef struct tagORPC_EXTENT {
-    GUID id;
-    unsigned long size;
-    [size_is((size+7)&~7)] byte data[];
-  } ORPC_EXTENT;
-
-  typedef struct tagORPC_EXTENT_ARRAY {
-    unsigned long size;
-    unsigned long reserved;
-    [size_is((size+1)&~1,), unique] ORPC_EXTENT **extent;
-  } ORPC_EXTENT_ARRAY;
-
-  typedef struct tagORPCTHIS {
-    COMVERSION version;
-    unsigned long flags;
-    unsigned long reserved1;
-    CID cid;
-    [unique] ORPC_EXTENT_ARRAY *extensions;
-  } ORPCTHIS;
-
-  typedef struct tagORPCTHAT {
-    unsigned long flags;
-    [unique] ORPC_EXTENT_ARRAY *extensions;
-  } ORPCTHAT;
-
-  const unsigned short NCADG_IP_UDP = 0x08;
-  const unsigned short NCACN_IP_TCP = 0x07;
-  const unsigned short NCADG_IPX = 0x0E;
-  const unsigned short NCACN_SPX = 0x0C;
-  const unsigned short NCACN_NB_NB = 0x12;
-  const unsigned short NCACN_NB_IPX = 0x0D;
-  const unsigned short NCACN_DNET_NSP = 0x04;
-  const unsigned short NCACN_HTTP = 0x1F;
-
-  typedef struct tagSTRINGBINDING {
-    unsigned short wTowerId;
-    [string] unsigned short aNetworkAddr[];
-  } STRINGBINDING;
-
-  const unsigned short COM_C_AUTHZ_NONE = 0xffff;
-
-  typedef struct tagSECURITYBINDING {
-    unsigned short wAuthnSvc;
-    unsigned short wAuthzSvc;
-    [string] unsigned short aPrincName[];
-  } SECURITYBINDING;
-
-  typedef struct tagDUALSTRINGARRAY {
-    unsigned short wNumEntries;
-    unsigned short wSecurityOffset;
-    [size_is(wNumEntries)] unsigned short aStringArray[];
-  } DUALSTRINGARRAY;
-
-  const unsigned long OBJREF_SIGNATURE = 0x574f454d; /* "MEOW" */
-  const unsigned long OBJREF_STANDARD = 0x1;
-  const unsigned long OBJREF_HANDLER = 0x2;
-  const unsigned long OBJREF_CUSTOM = 0x4;
-  const unsigned long SORF_OXRES1 = 0x1;
-  const unsigned long SORF_OXRES2 = 0x20;
-  const unsigned long SORF_OXRES3 = 0x40;
-  const unsigned long SORF_OXRES4 = 0x80;
-  const unsigned long SORF_OXRES5 = 0x100;
-  const unsigned long SORF_OXRES6 = 0x200;
-  const unsigned long SORF_OXRES7 = 0x400;
-  const unsigned long SORF_OXRES8 = 0x800;
-  const unsigned long SORF_NULL = 0x0;
-  const unsigned long SORF_NOPING = 0x1000;
-
-  typedef struct tagSTDOBJREF {
-    unsigned long flags;
-    unsigned long cPublicRefs;
-    OXID oxid;
-    OID oid;
-    IPID ipid;
-  } STDOBJREF;
-
-  typedef struct tagOBJREF {
-    unsigned long signature;
-    unsigned long flags;
-    GUID iid;
-    [switch_is(flags)] union {
-    [case(OBJREF_STANDARD)] struct OR_STANDARD {
-        STDOBJREF std;
-        DUALSTRINGARRAY saResAddr;
-      } u_standard;
-    [case(OBJREF_HANDLER)] struct OR_HANDLER {
-        STDOBJREF std;
-        CLSID clsid;
-        DUALSTRINGARRAY saResAddr;
-      } u_handler;
-    [case(OBJREF_CUSTOM)] struct OR_CUSTOM {
-        CLSID clsid;
-        unsigned long cbExtension;
-        unsigned long size;
-        [size_is(size), ref] byte *pData;
-      } u_custom;
-    } u_objref;
-  } OBJREF;
-
-  typedef struct tagMInterfacePointer {
-    ULONG ulCntData;
-    [size_is(ulCntData)] BYTE abData[];
-  } MInterfacePointer;
-
-  typedef [unique] MInterfacePointer *PMInterfacePointer;
-
-} /* interface ObjectRpcBaseTypes */
-
-[
-  object,
-  uuid(00000131-0000-0000-C000-000000000046)
-]
-interface IRemUnknown : IUnknown
-{
-  typedef [unique] IRemUnknown *LPREMUNKNOWN;
-
-  typedef struct tagREMQIRESULT {
-    HRESULT hResult;
-    STDOBJREF std;
-  } REMQIRESULT;
-
-  typedef struct tagREMINTERFACEREF {
-    IPID ipid;
-    unsigned long cPublicRefs;
-    unsigned long cPrivateRefs;
-  } REMINTERFACEREF; 
-
-  HRESULT RemQueryInterface(
-    [in] REFIPID ripid,
-    [in] unsigned long cRefs,
-    [in] unsigned short cIids,
-    [in, size_is(cIids)] IID *iids,
-    [out, size_is(,cIids)] REMQIRESULT **ppQIResults);
-
-  HRESULT RemAddRef(
-    [in] unsigned short cInterfaceRefs,
-    [in, size_is(cInterfaceRefs)] REMINTERFACEREF* InterfaceRefs,
-    [out, size_is(cInterfaceRefs)] HRESULT *pResults);
-
-  HRESULT RemRelease(
-    [in] unsigned short cInterfaceRefs,
-    [in, size_is(cInterfaceRefs)] REMINTERFACEREF* InterfaceRefs);
-}
-
-[
-  object,
-  uuid(00000142-0000-0000-C000-000000000046)
-]
-interface IRemUnknown2 : IRemUnknown
-{
-  typedef [unique] IRemUnknown2 *LPREMUNKNOWN2;
-
-  HRESULT RemQueryInterface2(
-    [in] REFIPID ripid,
-    [in] unsigned short cIids,
-    [in, size_is(cIids)] IID *iids,
-    [out, size_is(cIids)] HRESULT *phr,
-    [out, size_is(cIids)] MInterfacePointer **ppMIF);
-}
-
-cpp_quote("#if 0")
-[
-  uuid(99fcfec4-5260-101b-bbcb-00aa0021347a),
-  pointer_default(unique)
-]
-interface IOXIDResolver
-{
-  [idempotent] error_status_t ResolveOxid(
-    [in] handle_t hRpc,
-    [in] OXID *pOxid,
-    [in] unsigned short cRequestedProtseqs,
-    [in, ref, size_is(cRequestedProtseqs)] unsigned short arRequestedProtseqs[],
-    [out, ref] DUALSTRINGARRAY **ppdsaOxidBindings,
-    [out, ref] IPID *pipidRemUnknown,
-    [out, ref] DWORD *pAuthnHint);
-
-  [idempotent] error_status_t SimplePing(
-    [in] handle_t hRpc,
-    [in] SETID *pSetId);
-
-  [idempotent] error_status_t ComplexPing(
-    [in] handle_t hRpc,
-    [in, out] SETID *pSetId,
-    [in] unsigned short SequenceNum,
-    [in] unsigned short cAddToSet,
-    [in] unsigned short cDelFromSet,
-    [in, unique, size_is(cAddToSet)] OID AddToSet[],
-    [in, unique, size_is(cDelFromSet)] OID DelFromSet[],
-    [out] unsigned short *pPingBackoffFactor);
-
-  [idempotent] error_status_t ServerAlive(
-    [in] handle_t hRpc);
-
-  [idempotent] error_status_t ResolveOxid2(
-    [in] handle_t hRpc,
-    [in] OXID *pOxid,
-    [in] unsigned short cRequestedProtseqs,
-    [in, ref, size_is(cRequestedProtseqs)] unsigned short arRequestedProtseqs[],
-    [out, ref] DUALSTRINGARRAY **ppdsaOxidBindings,
-    [out, ref] IPID *pipidRemUnknown,
-    [out, ref] DWORD *pAuthnHint,
-    [out, ref] COMVERSION *pComVersion); 
-}
-
-[
-  uuid(4d9f4ab8-7d1c-11cf-861e-0020af6e7c57),
-  pointer_default(unique)
-]
-interface IRemoteActivation
-{
-  const unsigned long MODE_GET_CLASS_OBJECT = 0xffffffff;
-
-  HRESULT RemoteActivation(
-    [in] handle_t hRpc,
-    [in] ORPCTHIS *ORPCthis,
-    [out] ORPCTHAT *ORPCthat,
-    [in] GUID *Clsid,
-    [in, string, unique] WCHAR *pwszObjectName,
-    [in, unique] MInterfacePointer *pObjectStorage,
-    [in] DWORD ClientImpLevel,
-    [in] DWORD Mode,
-    [in] DWORD Interfaces,
-    [in, unique, size_is(Interfaces)] IID *pIIDs,
-    [in] unsigned short cRequestedProtseqs,
-    [in, size_is(cRequestedProtseqs)] unsigned short RequestedProtseqs[],
-    [out] OXID *pOxid,
-    [out] DUALSTRINGARRAY **ppdsaOxidBindings,
-    [out] IPID *pipidRemUnknown,
-    [out] DWORD *pAuthnHint,
-    [out] COMVERSION *pServerVersion,
-    [out] HRESULT *phr,
-    [out,size_is(Interfaces)] MInterfacePointer **ppInterfaceData,
-    [out,size_is(Interfaces)] HRESULT *pResults);
-}
-cpp_quote("#endif")
+/*
+ * Copyright 2003 Ove KÕven, TransGaming Technologies
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+/* see http://www.microsoft.com/msj/0398/dcom.htm */
+/* and the official DCOM specification
+ * (there's a copy at http://www.grimes.demon.co.uk/DCOM/DCOMSpec.htm) */
+
+import "unknwn.idl";
+
+[
+  uuid(99fcfe60-5260-101b-bbcb-00aa0021347a),
+  pointer_default(unique)
+]
+interface ObjectRpcBaseTypes
+{
+  typedef unsigned hyper ID;
+  typedef ID MID;
+  typedef ID OXID;
+  typedef ID OID;
[truncated at 1000 lines; 3575 more skipped]