[PATCH 4/6] combase: Move ProgIDFromCLSID().
Nikolay Sivov
nsivov at codeweavers.com
Mon Aug 10 03:12:50 CDT 2020
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/combase/combase.c | 84 +++++++++++++++++++++++++++++++++++++++
dlls/combase/combase.spec | 2 +-
dlls/ole32/compobj.c | 73 ----------------------------------
dlls/ole32/ole32.spec | 2 +-
4 files changed, 86 insertions(+), 75 deletions(-)
diff --git a/dlls/combase/combase.c b/dlls/combase/combase.c
index a757407c71e..6b8eb4ee7a9 100644
--- a/dlls/combase/combase.c
+++ b/dlls/combase/combase.c
@@ -33,6 +33,28 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole);
#define CHARS_IN_GUID 39
+struct comclassredirect_data
+{
+ ULONG size;
+ ULONG flags;
+ DWORD model;
+ GUID clsid;
+ GUID alias;
+ GUID clsid2;
+ GUID tlbid;
+ ULONG name_len;
+ ULONG name_offset;
+ ULONG progid_len;
+ ULONG progid_offset;
+ ULONG clrdata_len;
+ ULONG clrdata_offset;
+ DWORD miscstatus;
+ DWORD miscstatuscontent;
+ DWORD miscstatusthumbnail;
+ DWORD miscstatusicon;
+ DWORD miscstatusdocprint;
+};
+
static NTSTATUS create_key(HKEY *retkey, ACCESS_MASK access, OBJECT_ATTRIBUTES *attr)
{
NTSTATUS status = NtCreateKey((HANDLE *)retkey, access, attr, 0, NULL, 0, NULL);
@@ -831,6 +853,68 @@ done:
return hr;
}
+/******************************************************************************
+ * ProgIDFromCLSID (combase.@)
+ */
+HRESULT WINAPI DECLSPEC_HOTPATCH ProgIDFromCLSID(REFCLSID clsid, LPOLESTR *progid)
+{
+ ACTCTX_SECTION_KEYED_DATA data;
+ LONG progidlen = 0;
+ HKEY hkey;
+ HRESULT hr;
+
+ if (!progid)
+ return E_INVALIDARG;
+
+ *progid = NULL;
+
+ data.cbSize = sizeof(data);
+ if (FindActCtxSectionGuid(0, NULL, ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION,
+ clsid, &data))
+ {
+ struct comclassredirect_data *comclass = (struct comclassredirect_data *)data.lpData;
+ if (comclass->progid_len)
+ {
+ WCHAR *ptrW;
+
+ *progid = CoTaskMemAlloc(comclass->progid_len + sizeof(WCHAR));
+ if (!*progid) return E_OUTOFMEMORY;
+
+ ptrW = (WCHAR *)((BYTE *)comclass + comclass->progid_offset);
+ memcpy(*progid, ptrW, comclass->progid_len + sizeof(WCHAR));
+ return S_OK;
+ }
+ else
+ return REGDB_E_CLASSNOTREG;
+ }
+
+ hr = open_key_for_clsid(clsid, L"ProgID", KEY_READ, &hkey);
+ if (FAILED(hr))
+ return hr;
+
+ if (RegQueryValueW(hkey, NULL, NULL, &progidlen))
+ hr = REGDB_E_CLASSNOTREG;
+
+ if (hr == S_OK)
+ {
+ *progid = CoTaskMemAlloc(progidlen * sizeof(WCHAR));
+ if (*progid)
+ {
+ if (RegQueryValueW(hkey, NULL, *progid, &progidlen))
+ {
+ hr = REGDB_E_CLASSNOTREG;
+ CoTaskMemFree(*progid);
+ *progid = NULL;
+ }
+ }
+ else
+ hr = E_OUTOFMEMORY;
+ }
+
+ RegCloseKey(hkey);
+ return hr;
+}
+
static void init_multi_qi(DWORD count, MULTI_QI *mqi, HRESULT hr)
{
ULONG i;
diff --git a/dlls/combase/combase.spec b/dlls/combase/combase.spec
index 497af6da8c0..a90a418764d 100644
--- a/dlls/combase/combase.spec
+++ b/dlls/combase/combase.spec
@@ -279,7 +279,7 @@
@ stub NdrExtStubInitialize
@ stub NdrOleDllGetClassObject
@ stub NdrpFindInterface
-@ stdcall ProgIDFromCLSID(ptr ptr) ole32.ProgIDFromCLSID
+@ stdcall ProgIDFromCLSID(ptr ptr)
@ stdcall PropVariantClear(ptr)
@ stdcall PropVariantCopy(ptr ptr)
@ stub ReleaseFuncDescs
diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
index 1f6a952f15a..47b815b752e 100644
--- a/dlls/ole32/compobj.c
+++ b/dlls/ole32/compobj.c
@@ -2485,79 +2485,6 @@ HRESULT COM_OpenKeyForAppIdFromCLSID(REFCLSID clsid, REGSAM access, HKEY *subkey
return S_OK;
}
-/******************************************************************************
- * ProgIDFromCLSID [OLE32.@]
- *
- * Converts a class id into the respective program ID.
- *
- * PARAMS
- * clsid [I] Class ID, as found in registry.
- * ppszProgID [O] Associated ProgID.
- *
- * RETURNS
- * S_OK
- * E_OUTOFMEMORY
- * REGDB_E_CLASSNOTREG if the given clsid has no associated ProgID
- */
-HRESULT WINAPI DECLSPEC_HOTPATCH ProgIDFromCLSID(REFCLSID clsid, LPOLESTR *ppszProgID)
-{
- static const WCHAR wszProgID[] = {'P','r','o','g','I','D',0};
- ACTCTX_SECTION_KEYED_DATA data;
- HKEY hkey;
- HRESULT ret;
- LONG progidlen = 0;
-
- if (!ppszProgID)
- return E_INVALIDARG;
-
- *ppszProgID = NULL;
-
- data.cbSize = sizeof(data);
- if (FindActCtxSectionGuid(0, NULL, ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION,
- clsid, &data))
- {
- struct comclassredirect_data *comclass = (struct comclassredirect_data*)data.lpData;
- if (comclass->progid_len)
- {
- WCHAR *ptrW;
-
- *ppszProgID = CoTaskMemAlloc(comclass->progid_len + sizeof(WCHAR));
- if (!*ppszProgID) return E_OUTOFMEMORY;
-
- ptrW = (WCHAR*)((BYTE*)comclass + comclass->progid_offset);
- memcpy(*ppszProgID, ptrW, comclass->progid_len + sizeof(WCHAR));
- return S_OK;
- }
- else
- return REGDB_E_CLASSNOTREG;
- }
-
- ret = COM_OpenKeyForCLSID(clsid, wszProgID, KEY_READ, &hkey);
- if (FAILED(ret))
- return ret;
-
- if (RegQueryValueW(hkey, NULL, NULL, &progidlen))
- ret = REGDB_E_CLASSNOTREG;
-
- if (ret == S_OK)
- {
- *ppszProgID = CoTaskMemAlloc(progidlen * sizeof(WCHAR));
- if (*ppszProgID)
- {
- if (RegQueryValueW(hkey, NULL, *ppszProgID, &progidlen)) {
- ret = REGDB_E_CLASSNOTREG;
- CoTaskMemFree(*ppszProgID);
- *ppszProgID = NULL;
- }
- }
- else
- ret = E_OUTOFMEMORY;
- }
-
- RegCloseKey(hkey);
- return ret;
-}
-
/******************************************************************************
* CLSIDFromProgID [OLE32.@]
*
diff --git a/dlls/ole32/ole32.spec b/dlls/ole32/ole32.spec
index e51b2b5887d..74eb6f01062 100644
--- a/dlls/ole32/ole32.spec
+++ b/dlls/ole32/ole32.spec
@@ -237,7 +237,7 @@
@ stdcall OleTranslateAccelerator(ptr ptr ptr)
@ stdcall OleUninitialize()
@ stub OpenOrCreateStream
-@ stdcall ProgIDFromCLSID(ptr ptr)
+@ stdcall ProgIDFromCLSID(ptr ptr) combase.ProgIDFromCLSID
@ stdcall PropStgNameToFmtId(wstr ptr)
@ stdcall PropSysAllocString(wstr)
@ stdcall PropSysFreeString(wstr)
--
2.28.0
More information about the wine-devel
mailing list