ole32: Implement CoGetInstanceFromIStorage().

oldstable
Nikolay Sivov 2014-02-07 08:55:13 +04:00 committed by Alexandre Julliard
parent 8f289c821e
commit 62d9b5a0e0
2 changed files with 64 additions and 1 deletions

View File

@ -3329,6 +3329,69 @@ HRESULT WINAPI CoGetInstanceFromFile(
return return_multi_qi(unk, count, results);
}
/***********************************************************************
* 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.@)
*

View File

@ -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)