Nikolay Sivov : ole32: Implement CoGetInstanceFromIStorage().

Alexandre Julliard julliard at winehq.org
Fri Feb 7 10:13:43 CST 2014


Module: wine
Branch: master
Commit: 62d9b5a0e079b6db8c16444d92fe85cfa8e10f41
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=62d9b5a0e079b6db8c16444d92fe85cfa8e10f41

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Feb  7 08:55:13 2014 +0400

ole32: Implement CoGetInstanceFromIStorage().

---

 dlls/ole32/compobj.c  |   63 +++++++++++++++++++++++++++++++++++++++++++++++++
 dlls/ole32/ole32.spec |    2 +-
 2 files changed, 64 insertions(+), 1 deletion(-)

diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
index 4149ecb..3e99097 100644
--- a/dlls/ole32/compobj.c
+++ b/dlls/ole32/compobj.c
@@ -3330,6 +3330,69 @@ HRESULT WINAPI CoGetInstanceFromFile(
 }
 
 /***********************************************************************
+ *           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);
+
+  /* optionaly 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);
+}
+
+/***********************************************************************
  *           CoLoadLibrary (OLE32.@)
  *
  * Loads a library.
diff --git a/dlls/ole32/ole32.spec b/dlls/ole32/ole32.spec
index 28a84a1..00d5696 100644
--- a/dlls/ole32/ole32.spec
+++ b/dlls/ole32/ole32.spec
@@ -30,7 +30,7 @@
 @ stdcall CoGetCurrentProcess()
 @ stdcall CoGetDefaultContext(long ptr ptr)
 @ stdcall CoGetInstanceFromFile(ptr ptr ptr long long wstr long ptr)
-@ stub CoGetInstanceFromIStorage  #@ stdcall (ptr ptr ptr long ptr long ptr) return 0,ERR_NOTIMPLEMENTED
+@ stdcall CoGetInstanceFromIStorage(ptr ptr ptr long ptr long ptr)
 @ stdcall CoGetInterfaceAndReleaseStream(ptr ptr ptr)
 @ stdcall CoGetMalloc(long ptr)
 @ stdcall CoGetMarshalSizeMax(ptr ptr ptr long ptr long)




More information about the wine-cvs mailing list