[PATCH 1/6] combase: Move CoGetInstanceFromIStorage().

Nikolay Sivov nsivov at codeweavers.com
Mon Aug 10 03:12:47 CDT 2020


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/combase/combase.c    | 50 +++++++++++++++++++++++++++++++
 dlls/combase/combase.spec |  2 +-
 dlls/ole32/compobj.c      | 63 ---------------------------------------
 dlls/ole32/ole32.spec     |  2 +-
 4 files changed, 52 insertions(+), 65 deletions(-)

diff --git a/dlls/combase/combase.c b/dlls/combase/combase.c
index 06fc97e17d4..88da5fb888e 100644
--- a/dlls/combase/combase.c
+++ b/dlls/combase/combase.c
@@ -725,3 +725,53 @@ HRESULT WINAPI DECLSPEC_HOTPATCH CoGetInstanceFromFile(COSERVERINFO *server_info
         return hr;
     }
 }
+
+/***********************************************************************
+ *           CoGetInstanceFromIStorage        (combase.@)
+ */
+HRESULT WINAPI CoGetInstanceFromIStorage(COSERVERINFO *server_info, CLSID *rclsid,
+        IUnknown *outer, DWORD cls_context, IStorage *storage, DWORD count, MULTI_QI *results)
+{
+    IPersistStorage *ps = NULL;
+    IUnknown *obj = NULL;
+    STATSTG stat;
+    HRESULT hr;
+
+    if (!count || !results || !storage)
+        return E_INVALIDARG;
+
+    if (server_info)
+        FIXME("() non-NULL server_info not supported\n");
+
+    init_multi_qi(count, results, E_NOINTERFACE);
+
+    if (!rclsid)
+    {
+        memset(&stat.clsid, 0, sizeof(stat.clsid));
+        hr = IStorage_Stat(storage, &stat, STATFLAG_NONAME);
+        if (FAILED(hr))
+        {
+            ERR("Failed to get CLSID from a storage.\n");
+            return hr;
+        }
+
+        rclsid = &stat.clsid;
+    }
+
+    hr = CoCreateInstance(rclsid, outer, cls_context, &IID_IUnknown, (void **)&obj);
+    if (hr != S_OK)
+        return hr;
+
+    /* Init from IStorage */
+    hr = IUnknown_QueryInterface(obj, &IID_IPersistStorage, (void **)&ps);
+    if (FAILED(hr))
+        ERR("failed to get IPersistStorage\n");
+
+    if (ps)
+    {
+        IPersistStorage_Load(ps, storage);
+        IPersistStorage_Release(ps);
+    }
+
+    return return_multi_qi(obj, count, results, FALSE);
+}
diff --git a/dlls/combase/combase.spec b/dlls/combase/combase.spec
index e90df05446e..de0ebe7cd31 100644
--- a/dlls/combase/combase.spec
+++ b/dlls/combase/combase.spec
@@ -108,7 +108,7 @@
 @ stdcall CoGetDefaultContext(long ptr ptr) ole32.CoGetDefaultContext
 @ stub CoGetErrorInfo
 @ stdcall CoGetInstanceFromFile(ptr ptr ptr long long wstr long ptr)
-@ stdcall CoGetInstanceFromIStorage(ptr ptr ptr long ptr long ptr) ole32.CoGetInstanceFromIStorage
+@ stdcall CoGetInstanceFromIStorage(ptr ptr ptr long ptr long ptr)
 @ stdcall CoGetInterfaceAndReleaseStream(ptr ptr ptr) ole32.CoGetInterfaceAndReleaseStream
 @ stdcall CoGetMalloc(long ptr)
 @ stdcall CoGetMarshalSizeMax(ptr ptr ptr long ptr long) ole32.CoGetMarshalSizeMax
diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
index 1ad8a4b1d1d..e63759c0609 100644
--- a/dlls/ole32/compobj.c
+++ b/dlls/ole32/compobj.c
@@ -3434,69 +3434,6 @@ HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstanceEx(
     return return_multi_qi(unk, cmq, pResults, TRUE);
 }
 
-/***********************************************************************
- *           CoGetInstanceFromIStorage [OLE32.@]
- */
-HRESULT WINAPI CoGetInstanceFromIStorage(
-  COSERVERINFO *server_info,
-  CLSID        *rclsid,
-  IUnknown     *outer,
-  DWORD         cls_context,
-  IStorage     *storage,
-  DWORD         count,
-  MULTI_QI     *results
-)
-{
-  IPersistStorage *ps = NULL;
-  IUnknown* unk = NULL;
-  STATSTG stat;
-  HRESULT hr;
-
-  if (count == 0 || !results || !storage)
-    return E_INVALIDARG;
-
-  if (server_info)
-    FIXME("() non-NULL server_info not supported\n");
-
-  init_multi_qi(count, results, E_NOINTERFACE);
-
-  /* optionally get CLSID from a file */
-  if (!rclsid)
-  {
-    memset(&stat.clsid, 0, sizeof(stat.clsid));
-    hr = IStorage_Stat(storage, &stat, STATFLAG_NONAME);
-    if (FAILED(hr))
-    {
-      ERR("failed to get CLSID from a file\n");
-      return hr;
-    }
-
-    rclsid = &stat.clsid;
-  }
-
-  hr = CoCreateInstance(rclsid,
-			outer,
-			cls_context,
-			&IID_IUnknown,
-			(void**)&unk);
-
-  if (hr != S_OK)
-    return hr;
-
-  /* init from IStorage */
-  hr = IUnknown_QueryInterface(unk, &IID_IPersistStorage, (void**)&ps);
-  if (FAILED(hr))
-      ERR("failed to get IPersistStorage\n");
-
-  if (ps)
-  {
-      IPersistStorage_Load(ps, storage);
-      IPersistStorage_Release(ps);
-  }
-
-  return return_multi_qi(unk, count, results, FALSE);
-}
-
 /***********************************************************************
  *           CoLoadLibrary (OLE32.@)
  *
diff --git a/dlls/ole32/ole32.spec b/dlls/ole32/ole32.spec
index b1949eec8ec..6f44e298af8 100644
--- a/dlls/ole32/ole32.spec
+++ b/dlls/ole32/ole32.spec
@@ -36,7 +36,7 @@
 @ stdcall CoGetCurrentProcess()
 @ stdcall CoGetDefaultContext(long ptr ptr)
 @ stdcall CoGetInstanceFromFile(ptr ptr ptr long long wstr long ptr) combase.CoGetInstanceFromFile
-@ stdcall CoGetInstanceFromIStorage(ptr ptr ptr long ptr long ptr)
+@ stdcall CoGetInstanceFromIStorage(ptr ptr ptr long ptr long ptr) combase.CoGetInstanceFromIStorage
 @ stdcall CoGetInterfaceAndReleaseStream(ptr ptr ptr)
 @ stdcall CoGetMalloc(long ptr) combase.CoGetMalloc
 @ stdcall CoGetMarshalSizeMax(ptr ptr ptr long ptr long)
-- 
2.28.0




More information about the wine-devel mailing list