From 7e52f64044259fc7d53aac1c28ff36d99c1178bc Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Thu, 30 Jan 2025 22:16:46 +0900 Subject: [PATCH] [SDK] Define IAssociationElement, IAssociationArray etc. (#7678) Defining missing interfaces for file association... JIRA issue: CORE-19278 - Define IID_IAssociationElementOld, and IID_IAssociationElement interface IDs in . - Define ASSOCQUERY, and IAssociationElementOld in . - Define IAssociationElement, IEnumAssociationElements, IAssociationArrayOld, and IAssociationArray interfaces in . - Simplify and . --- sdk/include/reactos/shlguid_undoc.h | 2 + sdk/include/reactos/shlobj_undoc.h | 171 ++++++++++++++++++++++++---- sdk/include/reactos/shlwapi_undoc.h | 86 ++++++++++---- 3 files changed, 212 insertions(+), 47 deletions(-) diff --git a/sdk/include/reactos/shlguid_undoc.h b/sdk/include/reactos/shlguid_undoc.h index b72e61c9e3d..01dbfda2fe2 100644 --- a/sdk/include/reactos/shlguid_undoc.h +++ b/sdk/include/reactos/shlguid_undoc.h @@ -161,6 +161,8 @@ DEFINE_GUID(IID_IDelegateHostItemContainer,0x02468693, 0xE7E5, 0x4C6B, 0x99, 0x9 DEFINE_GUID(IID_IDrawPropertyControl, 0xE6DFF6FD, 0xBCD5, 0x4162, 0x9C, 0x65, 0xA3, 0xB1, 0x8C, 0x61, 0x6F, 0xDB); DEFINE_GUID(IID_IEnumAssociationElements, 0xA6B0FB57, 0x7523, 0x4439, 0x94, 0x25, 0xEB, 0xE9, 0x98, 0x23, 0xB8, 0x28); DEFINE_GUID(IID_IEnumerateAssociationElements,0x7513A16E,0xCF00,0x4817,0xA8, 0x90, 0xA2, 0x3C, 0x60, 0x8F, 0xE7, 0xB7); +DEFINE_GUID(IID_IAssociationElementOld, 0xE58B1ABF, 0x9596, 0x4DBA, 0x89, 0x97, 0x89, 0xDC, 0xDE, 0xF4, 0x69, 0x92); +DEFINE_GUID(IID_IAssociationElement, 0xD8F6AD5B, 0xB44F, 0x4BCC, 0x88, 0xFD, 0xEB, 0x34, 0x73, 0xDB, 0x75, 0x02); DEFINE_GUID(IID_IFilterCondition, 0xFCA2857D, 0x1760, 0x4AD3, 0x8C, 0x63, 0xC9, 0xB6, 0x02, 0xFC, 0xBA, 0xEA); DEFINE_GUID(IID_IFolderNotify, 0x0FF22D71, 0x5172, 0x11D1, 0xA9, 0xC6, 0x08, 0x00, 0x36, 0xAF, 0x3F, 0x03); DEFINE_GUID(IID_IFolderProperties, 0x7361EE29, 0x5BAD, 0x459D, 0xA9, 0xF5, 0xF6, 0x55, 0x06, 0x89, 0x82, 0xF0); diff --git a/sdk/include/reactos/shlobj_undoc.h b/sdk/include/reactos/shlobj_undoc.h index c9796909aa1..b0392644ecd 100644 --- a/sdk/include/reactos/shlobj_undoc.h +++ b/sdk/include/reactos/shlobj_undoc.h @@ -1,30 +1,20 @@ /* - * ReactOS undocumented shell interface - * - * Copyright 2009 Andrew Hill - * Copyright 2013 Dominik Hornung - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * PROJECT: ReactOS header + * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) + * PURPOSE: Undocumented shell interface + * COPYRIGHT: Copyright 2009 Andrew Hill + * Copyright 2013 Dominik Hornung + * Copyright 2025 Katayama Hirofumi MZ */ -#ifndef __SHLOBJ_UNDOC__H -#define __SHLOBJ_UNDOC__H +#pragma once + +#define SHLWAPI_ISHELLFOLDER_HELPERS +#include // For ASSOCQUERY #ifdef __cplusplus extern "C" { -#endif /* defined(__cplusplus) */ +#endif typedef struct tagSLOTITEMDATA { @@ -817,12 +807,145 @@ DECLARE_INTERFACE_(ITrayPriv, IUnknown) #define ITrayPriv_AppendMenu(T,a) (T)->lpVtbl->AppendMenu(T,a) #endif +/***************************************************************************** + * IAssociationElement interface + * + * @see IAssociationElementOld + * @see https://www.geoffchappell.com/studies/windows/shell/shlwapi/interfaces/iassociationelement.htm + */ +#define INTERFACE IAssociationElement +DECLARE_INTERFACE_(IAssociationElement, IUnknown) // {D8F6AD5B-B44F-4BCC-88FD-EB3473DB7502} +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IAssociationElement ***/ + STDMETHOD(QueryString)(THIS_ ASSOCQUERY query, PCWSTR key, PWSTR *ppszValue) PURE; + STDMETHOD(QueryDword)(THIS_ ASSOCQUERY query, PCWSTR key, DWORD *pdwValue) PURE; + STDMETHOD(QueryGuid)(THIS_ ASSOCQUERY query, PCWSTR key, GUID *pguid) PURE; + STDMETHOD(QueryExists)(THIS_ ASSOCQUERY query, PCWSTR key) PURE; + STDMETHOD(QueryDirect)(THIS_ ASSOCQUERY query, PCWSTR key, FLAGGED_BYTE_BLOB **ppBlob) PURE; + STDMETHOD(QueryObject)(THIS_ ASSOCQUERY query, PCWSTR key, REFIID riid, PVOID *ppvObj) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IAssociationElement_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IAssociationElement_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IAssociationElement_Release(T) (T)->lpVtbl->Release(T) +#define IAssociationElement_QueryString(T,a,b,c) (T)->lpVtbl->QueryString(T,a,b,c) +#define IAssociationElement_QueryDword(T,a,b,c) (T)->lpVtbl->QueryDword(T,a,b,c) +#define IAssociationElement_QueryGuid(T,a,b,c) (T)->lpVtbl->QueryGuid(T,a,b,c) +#define IAssociationElement_QueryExists(T,a,b) (T)->lpVtbl->QueryExists(T,a,b) +#define IAssociationElement_QueryDirect(T,a,b,c) (T)->lpVtbl->QueryDirect(T,a,b,c) +#define IAssociationElement_QueryObject(T,a,b,c,d) (T)->lpVtbl->QueryObject(T,a,b,c,d) +#endif + +/***************************************************************************** + * IEnumAssociationElements interface + * + * @see https://www.geoffchappell.com/studies/windows/shell/shell32/interfaces/ienumassociationelements.htm + */ +#define INTERFACE IEnumAssociationElements +DECLARE_INTERFACE_(IEnumAssociationElements, IUnknown) // {A6B0FB57-7523-4439-9425-EBE99823B828} +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IEnumAssociationElements ***/ + STDMETHOD(Next)(THIS_ ULONG celt, IAssociationElement *pElement, ULONG *pceltFetched) PURE; + STDMETHOD(Skip)(THIS_ ULONG celt) PURE; + STDMETHOD(Reset)(THIS) PURE; + STDMETHOD(Clone)(THIS_ IEnumAssociationElements **ppNew) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IEnumAssociationElements_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IEnumAssociationElements_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IEnumAssociationElements_Release(T) (T)->lpVtbl->Release(T) +#define IEnumAssociationElements_Next(T,a,b,c) (T)->lpVtbl->Next(T,a,b,c) +#define IEnumAssociationElements_Skip(T,a) (T)->lpVtbl->Skip(T,a) +#define IEnumAssociationElements_Reset(T) (T)->lpVtbl->Reset(T) +#define IEnumAssociationElements_Clone(T,a) (T)->lpVtbl->Clone(T,a) +#endif + +/***************************************************************************** + * IAssociationArrayOld interface + * + * @see IAssociationArray + * @see https://www.geoffchappell.com/studies/windows/shell/shell32/interfaces/iassociationarray.htm + */ +#define INTERFACE IAssociationArrayOld +DECLARE_INTERFACE_(IAssociationArrayOld, IUnknown) // {3B877E3C-67DE-4F9A-B29B-17D0A1521C6A} +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IAssociationArrayOld ***/ + STDMETHOD(EnumElements)(THIS_ ULONG flags, IEnumAssociationElements **ppElement) PURE; + STDMETHOD(QueryString)(THIS_ ULONG flags, ASSOCQUERY query, PCWSTR key, PWSTR *ppszValue) PURE; + STDMETHOD(QueryDword)(THIS_ ULONG flags, ASSOCQUERY query, PCWSTR key, DWORD *pdwValue) PURE; + STDMETHOD(QueryExists)(THIS_ ULONG flags, ASSOCQUERY query, PCWSTR key) PURE; + STDMETHOD(QueryDirect)(THIS_ ULONG flags, ASSOCQUERY query, PCWSTR key, FLAGGED_BYTE_BLOB **ppBlob) PURE; + STDMETHOD(QueryObject)(THIS_ ULONG flags, ASSOCQUERY query, PCWSTR key, REFIID riid, PVOID *ppvObj) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IAssociationArrayOld_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IAssociationArrayOld_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IAssociationArrayOld_Release(T) (T)->lpVtbl->Release(T) +#define IAssociationArrayOld_EnumElements(T,a,b) (T)->lpVtbl->EnumElements(T,a,b) +#define IAssociationArrayOld_QueryString(T,a,b,c,d) (T)->lpVtbl->QueryString(T,a,b,c,d) +#define IAssociationArrayOld_QueryDword(T,a,b,c,d) (T)->lpVtbl->QueryDword(T,a,b,c,d) +#define IAssociationArrayOld_QueryExists(T,a,b,c) (T)->lpVtbl->QueryExists(T,a,b,c) +#define IAssociationArrayOld_QueryDirect(T,a,b,c,d) (T)->lpVtbl->QueryDirect(T,a,b,c,d) +#define IAssociationArrayOld_QueryObject(T,a,b,c,d,e) (T)->lpVtbl->QueryObject(T,a,b,c,d,e) +#endif + +/***************************************************************************** + * IAssociationArray interface + * + * @see IAssociationArrayOld + * @see https://www.geoffchappell.com/studies/windows/shell/shell32/interfaces/iassociationarray.htm + */ +#define INTERFACE IAssociationArray +DECLARE_INTERFACE_(IAssociationArray, IUnknown) // {19ADBAFD-1C5F-4FC7-94EE-846702DFB58B} +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IAssociationArray ***/ + STDMETHOD(QueryString)(THIS_ ASSOCQUERY query, PCWSTR key, PWSTR *ppszValue) PURE; + STDMETHOD(QueryDword)(THIS_ ASSOCQUERY query, PCWSTR key, DWORD *pdwValue) PURE; + STDMETHOD(QueryGuid)(THIS_ ASSOCQUERY query, PCWSTR key, GUID *pguid) PURE; + STDMETHOD(QueryExists)(THIS_ ASSOCQUERY query, PCWSTR key) PURE; + STDMETHOD(QueryDirect)(THIS_ ASSOCQUERY query, PCWSTR key, FLAGGED_BYTE_BLOB **ppBlob) PURE; + STDMETHOD(QueryObject)(THIS_ ASSOCQUERY query, PCWSTR key, REFIID riid, PVOID *ppvObj) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IAssociationArray_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IAssociationArray_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IAssociationArray_Release(T) (T)->lpVtbl->Release(T) +#define IAssociationArray_QueryString(T,a,b,c) (T)->lpVtbl->QueryString(T,a,b,c) +#define IAssociationArray_QueryDword(T,a,b,c) (T)->lpVtbl->QueryDword(T,a,b,c) +#define IAssociationArray_QueryGuid(T,a,b,c) (T)->lpVtbl->QueryGuid(T,a,b,c) +#define IAssociationArray_QueryExists(T,a,b) (T)->lpVtbl->QueryExists(T,a,b) +#define IAssociationArray_QueryDirect(T,a,b,c) (T)->lpVtbl->QueryDirect(T,a,b,c) +#define IAssociationArray_QueryObject(T,a,b,c,d) (T)->lpVtbl->QueryObject(T,a,b,c,d) +#endif + HANDLE WINAPI SHCreateDesktop(IShellDesktopTray*); BOOL WINAPI SHDesktopMessageLoop(HANDLE); HRESULT WINAPI SHCreateFileDataObject(PCIDLIST_ABSOLUTE pidlFolder, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IDataObject* pDataInner, IDataObject** ppDataObj); #ifdef __cplusplus } /* extern "C" */ -#endif /* defined(__cplusplus) */ - -#endif // __SHLOBJ_UNDOC__H +#endif diff --git a/sdk/include/reactos/shlwapi_undoc.h b/sdk/include/reactos/shlwapi_undoc.h index c3ffe8c93df..d4b2cf3fd1d 100644 --- a/sdk/include/reactos/shlwapi_undoc.h +++ b/sdk/include/reactos/shlwapi_undoc.h @@ -1,29 +1,38 @@ /* - * ReactOS shlwapi - * - * Copyright 2009 Andrew Hill - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * PROJECT: ReactOS header + * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) + * PURPOSE: Undocumented SHLWAPI definitions + * COPYRIGHT: Copyright 2009 Andrew Hill + * Copyright 2025 Katayama Hirofumi MZ */ -#ifndef __SHLWAPI_UNDOC_H -#define __SHLWAPI_UNDOC_H +#pragma once + +#include // For REGSAM #ifdef __cplusplus extern "C" { -#endif /* defined(__cplusplus) */ +#endif + +/***************************************************************************** + * ASSOCQUERY --- The type flags of association query + * + * @see IAssociationElementOld, IAssociationElement, IAssociationArrayOld, IAssociationArray + * @see https://www.geoffchappell.com/studies/windows/shell/shell32/api/assocelem/query.htm + */ +typedef DWORD ASSOCQUERY; +#define ASSOCQUERY_LOWORD_MASK 0x0000FFFF // The low-order word of flags +#define ASSOCQUERY_STRING 0x00010000 // Responds to QueryString method +#define ASSOCQUERY_EXISTS 0x00020000 // Responds to QueryExists method +#define ASSOCQUERY_DIRECT 0x00040000 // Responds to QueryDirect method +#define ASSOCQUERY_DWORD 0x00080000 // Responds to QueryDword method +#define ASSOCQUERY_INDIRECT 0x00100000 // Obtains resource string from QueryString +#define ASSOCQUERY_OBJECT 0x00200000 // Responds to QueryObject method +#define ASSOCQUERY_GUID 0x00400000 // Responds to QueryGuid method +#define ASSOCQUERY_EXTRA_NON_VERB 0x01000000 // Expects pszExtra for path or value +#define ASSOCQUERY_EXTRA_VERB 0x02000000 // Expects pszExtra for verb +#define ASSOCQUERY_SIGNIFICANCE 0x04000000 // Significance unknown +#define ASSOCQUERY_FALLBACK 0x80000000 // Fallback to secondary query source #define SHELL_NO_POLICY ((DWORD)-1) @@ -402,8 +411,39 @@ IShellFolder_CompareIDs( _In_ PCUIDLIST_RELATIVE pidl2); #endif /* SHLWAPI_ISHELLFOLDER_HELPERS */ +/***************************************************************************** + * IAssociationElementOld interface + * + * @see IAssociationElement + * @see https://www.geoffchappell.com/studies/windows/shell/shlwapi/interfaces/iassociationelement.htm + */ +#define INTERFACE IAssociationElementOld +DECLARE_INTERFACE_(IAssociationElementOld, IUnknown) // {E58B1ABF-9596-4DBA-8997-89DCDEF46992} +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IAssociationElementOld ***/ + STDMETHOD(QueryString)(THIS_ ASSOCQUERY query, PCWSTR key, PWSTR *ppszValue) PURE; + STDMETHOD(QueryDword)(THIS_ ASSOCQUERY query, PCWSTR key, DWORD *pdwValue) PURE; + STDMETHOD(QueryExists)(THIS_ ASSOCQUERY query, PCWSTR key) PURE; + STDMETHOD(QueryDirect)(THIS_ ASSOCQUERY query, PCWSTR key, FLAGGED_BYTE_BLOB **ppBlob) PURE; + STDMETHOD(QueryObject)(THIS_ ASSOCQUERY query, PCWSTR key, REFIID riid, PVOID *ppvObj) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IAssociationElementOld_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IAssociationElementOld_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IAssociationElementOld_Release(T) (T)->lpVtbl->Release(T) +#define IAssociationElementOld_QueryString(T,a,b,c) (T)->lpVtbl->QueryString(T,a,b,c) +#define IAssociationElementOld_QueryDword(T,a,b,c) (T)->lpVtbl->QueryDword(T,a,b,c) +#define IAssociationElementOld_QueryExists(T,a,b) (T)->lpVtbl->QueryExists(T,a,b) +#define IAssociationElementOld_QueryDirect(T,a,b,c) (T)->lpVtbl->QueryDirect(T,a,b,c) +#define IAssociationElementOld_QueryObject(T,a,b,c,d) (T)->lpVtbl->QueryObject(T,a,b,c,d) +#endif + #ifdef __cplusplus } /* extern "C" */ -#endif /* defined(__cplusplus) */ - -#endif /* __SHLWAPI_UNDOC_H */ +#endif