From b60f66cbbfa9197b6b5e6bf00ccc435211a5de90 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Mon, 25 May 2026 15:49:44 +0900 Subject: [PATCH] [SHELL32] CPrinterFolder: Support IQueryAssociations (#9060) ShellExecute implementation requires a valid IQueryAssociations interface. https://learn.microsoft.com/en-us/windows/win32/shell/nse-implement JIRA issue: CORE-20467 Enhance CPrinterFolder::GetUIObjectOf for IQueryAssociations. --- dll/win32/shell32/folders/CPrinterFolder.cpp | 17 +++++++++++++++++ dll/win32/shell32/folders/CPrinterFolder.h | 5 +++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/dll/win32/shell32/folders/CPrinterFolder.cpp b/dll/win32/shell32/folders/CPrinterFolder.cpp index 8d9553117f6..2b55d762868 100644 --- a/dll/win32/shell32/folders/CPrinterFolder.cpp +++ b/dll/win32/shell32/folders/CPrinterFolder.cpp @@ -323,6 +323,21 @@ HRESULT WINAPI CPrinterFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY return hr; } +HRESULT CPrinterFolder::_AssocCreate(REFIID riid, PVOID *ppvObj) +{ + IQueryAssociations *pAssoc; + HRESULT hr = ::AssocCreate(CLSID_QueryAssociations, IID_PPV_ARG(IQueryAssociations, &pAssoc)); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + hr = pAssoc->Init(ASSOCF_NONE, L"Printers", NULL, NULL); + if (SUCCEEDED(hr)) + hr = pAssoc->QueryInterface(riid, ppvObj); + + pAssoc->Release(); + return hr; +} + /************************************************************************** * CPrinterFolder::GetUIObjectOf * @@ -351,6 +366,8 @@ HRESULT WINAPI CPrinterFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMI if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID(riid, IID_IExtractIconW)) && cidl == 1) hr = CPrintersExtractIconW_CreateInstane(apidl[0], riid, &pObj); + else if (IsEqualIID(riid, IID_IQueryAssociations)) + hr = _AssocCreate(riid, &pObj); else hr = E_NOINTERFACE; diff --git a/dll/win32/shell32/folders/CPrinterFolder.h b/dll/win32/shell32/folders/CPrinterFolder.h index 57a2fda40cb..6f22ea74a5d 100644 --- a/dll/win32/shell32/folders/CPrinterFolder.h +++ b/dll/win32/shell32/folders/CPrinterFolder.h @@ -32,10 +32,11 @@ class CPrinterFolder : { private: CLSID *pclsid; - LPITEMIDLIST pidlRoot; /* absolute pidl */ - int dwAttributes; /* attributes returned by GetAttributesOf FIXME: use it */ + + HRESULT _AssocCreate(REFIID riid, PVOID *ppvObj); + public: CPrinterFolder(); ~CPrinterFolder();