mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-04 19:48:03 +00:00
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:
parent
1ec8bf9b73
commit
93e7afb41f
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.@)
|
||||
*
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue