combase: Move CoGetInstanceFromIStorage().

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2020-08-10 11:12:47 +03:00 committed by Alexandre Julliard
parent 1ec8bf9b73
commit 93e7afb41f
4 changed files with 52 additions and 65 deletions

View file

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

View file

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

View file

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

View file

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