https://git.reactos.org/?p=reactos.git;a=commitdiff;h=7e52f64044259fc7d53aac1c28ff36d99c1178bc

commit 7e52f64044259fc7d53aac1c28ff36d99c1178bc
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Thu Jan 30 22:16:46 2025 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Thu Jan 30 22:16:46 2025 +0900

    [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 <shlguid_undoc.h>.
    - Define ASSOCQUERY, and
      IAssociationElementOld in
      <shlwapi_undoc.h>.
    - Define IAssociationElement,
      IEnumAssociationElements,
      IAssociationArrayOld, and
      IAssociationArray interfaces in
      <shlobj_undoc.h>.
    - Simplify <shlwapi_undoc.h>
      and <shlobj_undoc.h>.
---
 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 <ash77 at domain reactos.org>
- * 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 <ash77 at domain reactos.org>
+ *              Copyright 2013 Dominik Hornung
+ *              Copyright 2025 Katayama Hirofumi MZ 
<katayama.hirofumi...@gmail.com>
  */
 
-#ifndef __SHLOBJ_UNDOC__H
-#define __SHLOBJ_UNDOC__H
+#pragma once
+
+#define SHLWAPI_ISHELLFOLDER_HELPERS
+#include <shlwapi_undoc.h> // 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 <ash77 at domain reactos.org>
- *
- * 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 <ash77 at domain reactos.org>
+ *              Copyright 2025 Katayama Hirofumi MZ 
<katayama.hirofumi...@gmail.com>
  */
 
-#ifndef __SHLWAPI_UNDOC_H
-#define __SHLWAPI_UNDOC_H
+#pragma once
+
+#include <winreg.h> // 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

Reply via email to