Module: wine Branch: master Commit: 62d9b5a0e079b6db8c16444d92fe85cfa8e10f41 URL: http://source.winehq.org/git/wine.git/?a=commit;h=62d9b5a0e079b6db8c16444d92...
Author: Nikolay Sivov nsivov@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)