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