Nikolay Sivov : combase: Move CoGetInstanceFromFile().
Alexandre Julliard
julliard at winehq.org
Fri Aug 7 16:31:21 CDT 2020
Module: wine
Branch: master
Commit: 449d323d25cb4f2956fa4b7a9868c69f8468c06d
URL: https://source.winehq.org/git/wine.git/?a=commit;h=449d323d25cb4f2956fa4b7a9868c69f8468c06d
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri Aug 7 09:11:48 2020 +0300
combase: Move CoGetInstanceFromFile().
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/combase/combase.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++
dlls/combase/combase.spec | 2 +-
dlls/ole32/compobj.c | 73 -----------------------------------
dlls/ole32/ole32.spec | 2 +-
4 files changed, 100 insertions(+), 75 deletions(-)
diff --git a/dlls/combase/combase.c b/dlls/combase/combase.c
index 1370aa8271..06fc97e17d 100644
--- a/dlls/combase/combase.c
+++ b/dlls/combase/combase.c
@@ -627,3 +627,101 @@ HRESULT WINAPI CoGetActivationState(GUID guid, DWORD arg2, DWORD *arg3)
return E_NOTIMPL;
}
+
+static void init_multi_qi(DWORD count, MULTI_QI *mqi, HRESULT hr)
+{
+ ULONG i;
+
+ for (i = 0; i < count; i++)
+ {
+ mqi[i].pItf = NULL;
+ mqi[i].hr = hr;
+ }
+}
+
+static HRESULT return_multi_qi(IUnknown *unk, DWORD count, MULTI_QI *mqi, BOOL include_unk)
+{
+ ULONG index = 0, fetched = 0;
+
+ if (include_unk)
+ {
+ mqi[0].hr = S_OK;
+ mqi[0].pItf = unk;
+ index = fetched = 1;
+ }
+
+ for (; index < count; index++)
+ {
+ mqi[index].hr = IUnknown_QueryInterface(unk, mqi[index].pIID, (void **)&mqi[index].pItf);
+ if (mqi[index].hr == S_OK)
+ fetched++;
+ }
+
+ if (!include_unk)
+ IUnknown_Release(unk);
+
+ if (fetched == 0)
+ return E_NOINTERFACE;
+
+ return fetched == count ? S_OK : CO_S_NOTALLINTERFACES;
+}
+
+/***********************************************************************
+ * CoGetInstanceFromFile (combase.@)
+ */
+HRESULT WINAPI DECLSPEC_HOTPATCH CoGetInstanceFromFile(COSERVERINFO *server_info, CLSID *rclsid,
+ IUnknown *outer, DWORD cls_context, DWORD grfmode, OLECHAR *filename, DWORD count,
+ MULTI_QI *results)
+{
+ IPersistFile *pf = NULL;
+ IUnknown *obj = NULL;
+ CLSID clsid;
+ HRESULT hr;
+
+ if (!count || !results)
+ return E_INVALIDARG;
+
+ if (server_info)
+ FIXME("() non-NULL server_info not supported\n");
+
+ init_multi_qi(count, results, E_NOINTERFACE);
+
+ if (!rclsid)
+ {
+ hr = GetClassFile(filename, &clsid);
+ if (FAILED(hr))
+ {
+ ERR("Failed to get CLSID from a file.\n");
+ return hr;
+ }
+
+ rclsid = &clsid;
+ }
+
+ hr = CoCreateInstance(rclsid, outer, cls_context, &IID_IUnknown, (void **)&obj);
+ if (hr != S_OK)
+ {
+ init_multi_qi(count, results, hr);
+ return hr;
+ }
+
+ /* Init from file */
+ hr = IUnknown_QueryInterface(obj, &IID_IPersistFile, (void **)&pf);
+ if (FAILED(hr))
+ {
+ init_multi_qi(count, results, hr);
+ IUnknown_Release(obj);
+ return hr;
+ }
+
+ hr = IPersistFile_Load(pf, filename, grfmode);
+ IPersistFile_Release(pf);
+ if (SUCCEEDED(hr))
+ return return_multi_qi(obj, count, results, FALSE);
+ else
+ {
+ init_multi_qi(count, results, hr);
+ IUnknown_Release(obj);
+ return hr;
+ }
+}
diff --git a/dlls/combase/combase.spec b/dlls/combase/combase.spec
index 4f737aeb53..e90df05446 100644
--- a/dlls/combase/combase.spec
+++ b/dlls/combase/combase.spec
@@ -107,7 +107,7 @@
@ stdcall CoGetCurrentProcess() ole32.CoGetCurrentProcess
@ stdcall CoGetDefaultContext(long ptr ptr) ole32.CoGetDefaultContext
@ stub CoGetErrorInfo
-@ stdcall CoGetInstanceFromFile(ptr ptr ptr long long wstr long ptr) ole32.CoGetInstanceFromFile
+@ stdcall CoGetInstanceFromFile(ptr ptr ptr long long wstr long ptr)
@ stdcall CoGetInstanceFromIStorage(ptr ptr ptr long ptr long ptr) ole32.CoGetInstanceFromIStorage
@ stdcall CoGetInterfaceAndReleaseStream(ptr ptr ptr) ole32.CoGetInterfaceAndReleaseStream
@ stdcall CoGetMalloc(long ptr)
diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
index 6a0c518081..1ad8a4b1d1 100644
--- a/dlls/ole32/compobj.c
+++ b/dlls/ole32/compobj.c
@@ -3434,79 +3434,6 @@ HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstanceEx(
return return_multi_qi(unk, cmq, pResults, TRUE);
}
-/***********************************************************************
- * CoGetInstanceFromFile [OLE32.@]
- */
-HRESULT WINAPI DECLSPEC_HOTPATCH CoGetInstanceFromFile(
- COSERVERINFO *server_info,
- CLSID *rclsid,
- IUnknown *outer,
- DWORD cls_context,
- DWORD grfmode,
- OLECHAR *filename,
- DWORD count,
- MULTI_QI *results
-)
-{
- IPersistFile *pf = NULL;
- IUnknown* unk = NULL;
- CLSID clsid;
- HRESULT hr;
-
- if (count == 0 || !results)
- 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)
- {
- hr = GetClassFile(filename, &clsid);
- if (FAILED(hr))
- {
- ERR("failed to get CLSID from a file\n");
- return hr;
- }
-
- rclsid = &clsid;
- }
-
- hr = CoCreateInstance(rclsid,
- outer,
- cls_context,
- &IID_IUnknown,
- (void**)&unk);
-
- if (hr != S_OK)
- {
- init_multi_qi(count, results, hr);
- return hr;
- }
-
- /* init from file */
- hr = IUnknown_QueryInterface(unk, &IID_IPersistFile, (void**)&pf);
- if (FAILED(hr))
- {
- init_multi_qi(count, results, hr);
- IUnknown_Release(unk);
- return hr;
- }
-
- hr = IPersistFile_Load(pf, filename, grfmode);
- IPersistFile_Release(pf);
- if (SUCCEEDED(hr))
- return return_multi_qi(unk, count, results, FALSE);
- else
- {
- init_multi_qi(count, results, hr);
- IUnknown_Release(unk);
- return hr;
- }
-}
-
/***********************************************************************
* CoGetInstanceFromIStorage [OLE32.@]
*/
diff --git a/dlls/ole32/ole32.spec b/dlls/ole32/ole32.spec
index ef074bbc26..b1949eec8e 100644
--- a/dlls/ole32/ole32.spec
+++ b/dlls/ole32/ole32.spec
@@ -35,7 +35,7 @@
@ stdcall CoGetCurrentLogicalThreadId(ptr)
@ stdcall CoGetCurrentProcess()
@ stdcall CoGetDefaultContext(long ptr ptr)
-@ stdcall CoGetInstanceFromFile(ptr ptr ptr long long wstr long ptr)
+@ stdcall CoGetInstanceFromFile(ptr ptr ptr long long wstr long ptr) combase.CoGetInstanceFromFile
@ stdcall CoGetInstanceFromIStorage(ptr ptr ptr long ptr long ptr)
@ stdcall CoGetInterfaceAndReleaseStream(ptr ptr ptr)
@ stdcall CoGetMalloc(long ptr) combase.CoGetMalloc
More information about the wine-cvs
mailing list