ReactOS 0.4.17-dev-444-g71ee754
elements.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Shell
3 * LICENSE: LGPL-2.1+ (https://spdx.org/licenses/LGPL-2.1+)
4 * PURPOSE: AssocCreateElement
5 * COPYRIGHT: Copyright 2026 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7#include <windef.h>
8#include <shlobj.h>
9#include <shlwapi.h>
10#include <undocshell.h>
11#include <shlobj_undoc.h>
12#include <shlguid_undoc.h>
13#include <shlwapi_undoc.h>
14#include <pathcch.h>
15#include <strsafe.h>
16#include <shellutils.h>
17#include <new>
18#include "evalcmd.h"
19#include "resource.h"
20
21#include <wine/debug.h>
23
24typedef HRESULT (CALLBACK* QUERY_CALLBACK)(IQuerySourceOld*, ASSOCQUERY query, PCWSTR keyName,
25 PCWSTR valueName, PVOID pValue);
26
27typedef struct QUERYKEYVAL
28{
33
34#define ASSOCQUERY_DE (ASSOCQUERY_DIRECT | ASSOCQUERY_EXISTS)
35#define ASSOCQUERY_SDE (ASSOCQUERY_STRING | ASSOCQUERY_DE)
36#define ASSOCQUERY_SDED (ASSOCQUERY_SDE | ASSOCQUERY_DWORD)
37#define ASSOCQUERY_SDEI (ASSOCQUERY_SDE | ASSOCQUERY_INDIRECT)
38#define ASSOCQUERY_SDEEV (ASSOCQUERY_SDE | ASSOCQUERY_EXTRA_VERB)
39
40#define ASSOCQUERY_DEFAULTICON (ASSOCQUERY_SDE | 0x1)
41#define ASSOCQUERY_CLSID (ASSOCQUERY_SDE | 0x3)
42#define ASSOCQUERY_PROGID (ASSOCQUERY_SDE | 0x4)
43#define ASSOCQUERY_SHELLEX (ASSOCQUERY_SDE | ASSOCQUERY_FALLBACK | ASSOCQUERY_EXTRA_NON_VERB | 0x2)
44#define ASSOCQUERY_NOACTIVATEHANDLER (ASSOCQUERY_DE | ASSOCQUERY_EXTRA_VERB | 0x5)
45#define ASSOCQUERY_COMMAND_COMMAND (ASSOCQUERY_DE | ASSOCQUERY_EXTRA_VERB | 0x6)
46#define ASSOCQUERY_FRIENDLYAPPNAME ASSOCQUERY_SDEI
47#define ASSOCQUERY_VERB_FRIENDLYAPPNAME (ASSOCQUERY_SDEI | ASSOCQUERY_EXTRA_VERB | 0x8)
48#define ASSOCQUERY_COMMAND ASSOCQUERY_SDEEV
49#define ASSOCQUERY_DDEEXEC (ASSOCQUERY_SDEEV | 0x1)
50#define ASSOCQUERY_DDEEXEC_IFEXEC (ASSOCQUERY_SDEEV | 0x2)
51#define ASSOCQUERY_DDEEXEC_APPLICATION (ASSOCQUERY_SDEEV | 0x3)
52#define ASSOCQUERY_DDEEXEC_TOPIC (ASSOCQUERY_SDEEV | 0x4)
53#define ASSOCQUERY_LOCALIZEDSTRING (ASSOCQUERY_SDEI | ASSOCQUERY_EXTRA_NON_VERB | 0x1)
54#define ASSOCQUERY_SEV_7 (ASSOCQUERY_STRING | ASSOCQUERY_EXTRA_VERB | 0x7)
55#define ASSOCQUERY_APPKEY_FRIENDLYAPPNAME (ASSOCQUERY_SDEEV | ASSOCQUERY_INDIRECT | 0x8)
56#define ASSOCQUERY_CONTENT_TYPE (ASSOCQUERY_SDE | ASSOCQUERY_FALLBACK | 0x2)
57#define ASSOCQUERY_DELEGATE (ASSOCQUERY_STRING | ASSOCQUERY_EXTRA_VERB | 0x7)
58#define ASSOCQUERY_OBJECT_EV_1 (ASSOCQUERY_OBJECT | ASSOCQUERY_EXTRA_VERB | 0x1)
59
61{
62 { ASSOCQUERY_FRIENDLYAPPNAME, NULL, L"FriendlyTypeName" },
63 { ASSOCQUERY_DEFAULTICON, L"DefaultIcon", NULL },
64};
65
67{
68 { ASSOCQUERY_FRIENDLYAPPNAME, NULL, L"FriendlyTypeName" },
69 { ASSOCQUERY_DEFAULTICON, L"DefaultIcon", NULL },
70 { ASSOCQUERY_CLSID, L"Clsid", NULL },
71 { ASSOCQUERY_PROGID, L"Progid", NULL },
72 { ASSOCQUERY_SHELLEX, L"ShellEx\\%s", NULL },
73};
74
76{
77 { ASSOCQUERY_COMMAND, L"command", NULL },
78 { ASSOCQUERY_DDEEXEC, L"ddeexec", NULL },
79 { ASSOCQUERY_DDEEXEC_IFEXEC, L"ddeexec\\ifexec", NULL },
80 { ASSOCQUERY_DDEEXEC_APPLICATION, L"ddeexec\\application", NULL },
81 { ASSOCQUERY_DDEEXEC_TOPIC, L"ddeexec\\topic", NULL },
82 { ASSOCQUERY_NOACTIVATEHANDLER, L"ddeexec", L"NoActivateHandler" },
83 { ASSOCQUERY_COMMAND_COMMAND, L"command", L"command" },
84 { ASSOCQUERY_VERB_FRIENDLYAPPNAME, NULL, L"FriendlyAppName" },
85};
86
88{
89 { ASSOCQUERY_APPKEY_FRIENDLYAPPNAME, NULL, L"FriendlyAppName" },
90};
91
93{
94 { ASSOCQUERY_SHELLEX, L"ShellEx\\%s", NULL },
95 { ASSOCQUERY_CONTENT_TYPE, NULL, L"Content Type" },
96};
97
98static const QUERYKEYVAL*
100{
101 for (UINT iItem = 0; iItem < cItems; ++iItem)
102 {
103 if (pItems[iItem].query == query)
104 return &pItems[iItem];
105 }
106 return NULL;
107}
108
110{
111 WCHAR szOutBuf[1024];
112 HRESULT hr = SHLoadIndirectString(*ppwsz, szOutBuf, _countof(szOutBuf), NULL);
113 CoTaskMemFree(*ppwsz);
115 {
116 *ppwsz = NULL;
117 return hr;
118 }
119 return SHStrDupW(szOutBuf, ppwsz);
120}
121
123{
124 WCHAR szBuff[MAX_PATH];
125 LoadStringW(hInstance, uID, szBuff, _countof(szBuff));
126 return SHStrDupW(szBuff, ppwsz);
127}
128
130 IQuerySourceOld* pSource,
131 PCWSTR key,
132 PCWSTR pszSrc,
134 IQuerySourceOld** ppSource)
135{
136 WCHAR szDest[MAX_PATH];
137 PathCchCombineEx(szDest, _countof(szDest), key, pszSrc, PATHCCH_NONE);
138 return pSource->OpenSource(szDest, bCreate, ppSource);
139}
140
142{
143 WCHAR szDest[MAX_PATH], szBuff[128];
144 HINSTANCE hSHLWAPI = GetModuleHandleW(L"shlwapi.dll");
145
146 if (!lpsz || *lpsz != '.' || !lpsz[1])
147 return _SHAllocLoadString(hSHLWAPI, IDS_FILE, ppwsz);
148
149 CharUpperW(lpsz);
150 LoadStringW(hSHLWAPI, IDS_ANY_FILE, szBuff, _countof(szBuff));
151 StringCchPrintfW(szDest, _countof(szDest), szBuff, lpsz + 1);
152 return SHStrDupW(szDest, ppwsz);
153}
154
155static inline LSTATUS
156_RegQueryString(HKEY hKey, PCWSTR lpSubKey, PWSTR lpData, LONG cchData)
157{
158 LONG cbData = cchData * sizeof(WCHAR);
159 return RegQueryValueW(hKey, lpSubKey, lpData, &cbData);
160}
161
162static LSTATUS
164{
166 if (lpSubKey && *lpSubKey)
168 NULL, &hKey, NULL);
169 else
171 if (error)
172 return error;
173
174 INT cch = lstrlenW(lpString);
175 error = RegSetValueExW(hKey, NULL, 0, REG_SZ, (PBYTE)lpString, (cch + 1) * sizeof(WCHAR));
177 return error;
178}
179
180static HRESULT CALLBACK
182 IQuerySourceOld* pSource,
184 PCWSTR keyName,
185 PCWSTR valueName,
187{
188 return pSource->QueryValueDirect(keyName, valueName, (FLAGGED_BYTE_BLOB**)pValue);
189}
190
191static HRESULT CALLBACK
193 IQuerySourceOld* pSource,
195 PCWSTR keyName,
196 PCWSTR valueName,
198{
199 return pSource->QueryValueDword(keyName, valueName, (PDWORD)pValue);
200}
201
202static HRESULT CALLBACK
204 IQuerySourceOld* pSource,
206 PCWSTR keyName,
207 PCWSTR valueName,
209{
210 return pSource->QueryValueExists(keyName, valueName);
211}
212
213static HRESULT CALLBACK
215 IQuerySourceOld* pSource,
217 PCWSTR keyName,
218 PCWSTR valueName,
220{
221 HRESULT hr = pSource->QueryValueString(keyName, valueName, static_cast<PWSTR*>(pValue));
223 return hr;
224 return SHAllocMUI(static_cast<PWSTR*>(pValue));
225}
226
227static inline HRESULT
228_QuerySourceCreateFromKey(HKEY hKey, PCWSTR lpSubKey, BOOL bCreate, IQuerySourceOld** ppSource)
229{
230 return QuerySourceCreateFromKey(hKey, lpSubKey, bCreate,
231 IID_PPV_ARG(IQuerySourceOld, ppSource));
232}
233
234static HRESULT
236 HKEY hKey,
237 PCWSTR key1,
238 PCWSTR key2,
239 IQuerySourceOld** ppSource)
240{
241 WCHAR szBuff[MAX_PATH];
242
243 if (key1)
244 PathCchCombineEx(szBuff, _countof(szBuff), key1, key2, PATHCCH_NONE);
245 else
246 StringCchCopyW(szBuff, _countof(szBuff), key2);
247
248 return _QuerySourceCreateFromKey(hKey, szBuff, FALSE, ppSource);
249}
250
251static HRESULT
253{
254 *phkResult = NULL;
255 if (!hKey)
257
259 if ( bCreate )
260 error = RegCreateKeyExW(hKey, lpSubKey, 0, NULL, 0, MAXIMUM_ALLOWED, NULL,
261 phkResult, NULL);
262 else
263 error = RegOpenKeyExW(hKey, lpSubKey, 0, MAXIMUM_ALLOWED, phkResult);
264
265 if (error == ERROR_SUCCESS)
266 return S_OK;
267
269}
270
272{
273 HKEY hKeyBase;
276 return NULL;
277
278 WCHAR szData[64];
279 DWORD cbData = sizeof(szData);
280 if (StrCmpIW(L"Excel.Sheet.8", psz) == 0)
281 return hKeyBase;
282
283 LSTATUS error = SHGetValueW(hKeyBase, L"CurVer", NULL, NULL, szData, &cbData);
284 if (error || cbData <= 2)
285 return hKeyBase;
286
287 HKEY hKeyCurVer;
288 hr = _AssocOpenRegKey(HKEY_CLASSES_ROOT, szData, &hKeyCurVer, FALSE);
290 return hKeyBase;
291
292 HKEY hKeyShell;
293 hr = _AssocOpenRegKey(hKeyCurVer, L"shell", &hKeyShell, FALSE);
295 {
296 hr = _AssocOpenRegKey(hKeyBase, L"shell", &hKeyShell, FALSE);
298 {
299 RegCloseKey(hKeyBase);
300 return hKeyCurVer;
301 }
302
303 RegCloseKey(hKeyShell);
304 RegCloseKey(hKeyCurVer);
305 return hKeyBase;
306 }
307
308 RegCloseKey(hKeyShell);
309 RegCloseKey(hKeyBase);
310 return hKeyCurVer;
311}
312
313static inline void _MakeApplicationsKey(PCWSTR pszPath, PWSTR pszDest, UINT cchDest)
314{
315 HRESULT hr = PathCchCombineEx(pszDest, cchDest, L"Applications", pszPath, PATHCCH_NONE);
317 return;
318
319 PathCchAddExtension(pszDest, cchDest, L".exe");
320}
321
322static inline BOOL _ParamIsApp(PCWSTR psz)
323{
324 return !StrCmpNW(psz, L"%1", 2) || !StrCmpNW(psz, L"\"%1\"", 4);
325}
326
328{
329 DWORD attrs;
332 return S_OK;
333}
334
335static HRESULT _ExeFromCmd(PCWSTR pszCmdTemplate, PWSTR* ppszApplication)
336{
337 if (_ParamIsApp(pszCmdTemplate))
338 return SHStrDupW(L"%1", ppszApplication);
339
340 PWSTR pszParameters = NULL;
341 HRESULT hr = SHEvaluateSystemCommandTemplate(pszCmdTemplate, ppszApplication,
342 NULL, &pszParameters);
344 return hr;
345
346 if (hr != S_OK || StrCmpIW(PathFindFileNameW(*ppszApplication), L"rundll32.exe") != 0)
347 {
348 CoTaskMemFree(pszParameters);
349 return hr;
350 }
351
352 CoTaskMemFree(*ppszApplication);
353 *ppszApplication = NULL;
354
355 PWSTR pchComma = StrChrW(pszParameters, L',');
356 if (!pchComma)
357 {
359 CoTaskMemFree(pszParameters);
360 return hr;
361 }
362
363 WCHAR szExe[MAX_PATH];
364 hr = _PathCopyExeAndTrimWhiteSpaces(szExe, _countof(szExe), pszParameters,
365 pchComma - pszParameters);
367 {
368 CoTaskMemFree(pszParameters);
369 return hr;
370 }
371
372 PathUnquoteSpacesW(szExe);
373
374 PathCchAddExtension(szExe, _countof(szExe), L".dll");
375
376 if (PathIsAbsolute(szExe))
377 {
378 hr = _PathFileExists(szExe);
379 }
380 else if (PathIsFileSpecW(szExe))
381 {
382 hr = _PathFindInSystem(szExe, _countof(szExe));
383 }
384 else
385 {
386 CoTaskMemFree(pszParameters);
388 }
389
390 if (SUCCEEDED(hr))
391 hr = SHStrDupW(szExe, ppszApplication);
392
393 CoTaskMemFree(pszParameters);
394 return hr;
395}
396
397/******************************************************************************
398 * CAssocElement
399 */
401 : public IObjectWithQuerySourceOld
402 , public IAssociationElementOld
403{
404protected:
406 IQuerySourceOld* m_pSource = NULL;
407
410 const QUERYKEYVAL* pItems,
411 UINT cItems,
412 IQuerySourceOld* pQS,
414 PCWSTR valueName,
415 PVOID pValue);
416
419 IQuerySourceOld* pSource,
422 PCWSTR valueName,
423 PVOID pValue);
424
425public:
426 virtual ~CAssocElement();
427
428 /*** IUnknown ***/
432 /*** IObjectWithQuerySourceOld ***/
433 STDMETHODIMP SetSource(IQuerySourceOld* pSource) override;
434 STDMETHODIMP GetSource(REFIID riid, PVOID* ppSource) override;
435 /*** IAssociationElementOld ***/
436 STDMETHODIMP QueryString(ASSOCQUERY query, PCWSTR key, PWSTR* ppszValue) override;
437 STDMETHODIMP QueryDword(ASSOCQUERY query, PCWSTR key, DWORD* pdwValue) override;
439 STDMETHODIMP QueryDirect(ASSOCQUERY query, PCWSTR key, FLAGGED_BYTE_BLOB** ppBlob) override;
441
442protected:
443 virtual UINT _GetQueryKeyVal(const QUERYKEYVAL** ppItems);
444};
445
446/******************************************************************************
447 * CAssocShellElement
448 */
450 : public CAssocElement
451 , public IPersistString2
452{
453protected:
455 WCHAR m_szBuff[64] = L"";
456
457 UINT _GetQueryKeyVal(const QUERYKEYVAL** ppItems) override;
458 HRESULT _DefaultVerbSource(IQuerySourceOld** ppSource);
459
460public:
462
463 /*** IUnknown ***/
467 /*** IAssociationElementOld ***/
468 STDMETHODIMP QueryString(ASSOCQUERY query, PCWSTR key, PWSTR* ppszValue) override;
469 STDMETHODIMP QueryDword(ASSOCQUERY query, PCWSTR key, DWORD* pdwValue) override;
471 STDMETHODIMP QueryDirect(ASSOCQUERY query, PCWSTR key, FLAGGED_BYTE_BLOB** ppBlob) override;
473 /*** IPersist ***/
474 STDMETHODIMP GetClassID(CLSID* pClassID) override;
475 /*** IPersistString2 ***/
476 STDMETHODIMP SetString(PCWSTR psz) override;
477 STDMETHODIMP GetString(PWSTR* ppsz) override;
478
480 virtual HRESULT _InitSource();
481 virtual BOOL _IsAppSource();
482 virtual HRESULT _GetVerbDelegate(PCWSTR pszSrc, IAssociationElementOld** ppElement);
483};
484
485/******************************************************************************
486 * CAssocShellVerbElement
487 */
489 : public CAssocElement
490{
491protected:
493
494 UINT _GetQueryKeyVal(const QUERYKEYVAL** ppItems) override;
496
497public:
498 CAssocShellVerbElement(BOOL bAppSource);
499
502};
503
504/******************************************************************************
505 * CAssocApplicationElement
506 */
508 : public CAssocShellElement
509{
510protected:
512
513 UINT _GetQueryKeyVal(const QUERYKEYVAL** ppItems) override;
514 HRESULT _InitSource() override;
516
517public:
518 STDMETHODIMP GetClassID(CLSID* pClsid) override;
521};
522
523/******************************************************************************
524 * CAssocProgidElement
525 */
527 : public CAssocShellElement
528{
529 IQuerySourceOld* m_pSource2 = NULL;
530
531public:
532 ~CAssocProgidElement() override;
533
534 /*** IAssociationElementOld ***/
535 STDMETHODIMP QueryString(ASSOCQUERY query, PCWSTR key, PWSTR* ppszValue) override;
536 /*** IPersist ***/
537 STDMETHODIMP GetClassID(CLSID* pClassID) override;
538
539 BOOL _UseEnumForDefaultVerb() override;
540 HRESULT _InitSource() override;
541};
542
543/******************************************************************************
544 * CAssocClsidElement
545 */
547 : public CAssocShellElement
548{
549public:
550 /*** IPersist ***/
551 STDMETHODIMP GetClassID(CLSID* pClassID) override;
552
553 HRESULT _InitSource() override;
554};
555
556/******************************************************************************
557 * CAssocSystemExtElement
558 */
560 : public CAssocShellElement
561{
562public:
563 /*** IPersist ***/
564 STDMETHODIMP GetClassID(CLSID* pClassID) override;
565
566 HRESULT _InitSource() override;
567};
568
569/******************************************************************************
570 * CAssocFolderElement
571 */
573 : public CAssocShellElement
574{
575protected:
576
577public:
578 /*** IAssociationElementOld ***/
579 STDMETHODIMP QueryString(ASSOCQUERY query, PCWSTR key, PWSTR* ppszValue) override;
580 /*** IPersist ***/
581 STDMETHODIMP GetClassID(CLSID* pClassID) override;
582
583 HRESULT _InitSource() override;
584};
585
586/******************************************************************************
587 * CAssocStarElement
588 */
590 : public CAssocShellElement
591{
592protected:
593
594public:
595 /*** IAssociationElementOld ***/
596 STDMETHODIMP QueryString(ASSOCQUERY query, PCWSTR key, PWSTR* ppszValue) override;
597 /*** IPersist ***/
598 STDMETHODIMP GetClassID(CLSID* pClassID) override;
599
600 HRESULT _InitSource() override;
601};
602
603/******************************************************************************
604 * CAssocPerceivedElement
605 */
607 : public CAssocShellElement
608{
609protected:
611
612 UINT _GetQueryKeyVal(const QUERYKEYVAL** ppItems) override;
613
614public:
615 /*** IPersist ***/
616 STDMETHODIMP GetClassID(CLSID* pClassID) override;
617 /*** IObjectWithQuerySourceOld ***/
618 STDMETHODIMP GetSource(REFIID riid, PVOID* ppSource) override;
619
620 HRESULT _InitSource() override;
621 HRESULT _GetVerbDelegate(PCWSTR pszSrc, IAssociationElementOld** ppElement) override;
622};
623
624/******************************************************************************
625 * CAssocClientElement
626 */
628 : public CAssocShellElement
629{
630public:
631 /*** IAssociationElementOld ***/
632 STDMETHODIMP QueryString(ASSOCQUERY query, PCWSTR key, PWSTR* ppszValue) override;
633 /*** IPersist ***/
634 STDMETHODIMP GetClassID(CLSID* pClassID) override;
635
636 HRESULT _InitSource() override;
640};
641
642/******************************************************************************
643 * CAssocElement methods
644 */
645
647{
648 if (m_pSource)
649 {
650 m_pSource->Release();
651 m_pSource = NULL;
652 }
653}
654
656{
657 *ppItems = NULL;
658 return 0;
659}
660
664 const QUERYKEYVAL* pItems,
665 UINT cItems,
666 IQuerySourceOld* pQS,
668 PCWSTR valueName,
670{
671 const QUERYKEYVAL* pItem = _FindKeyVal(query, pItems, cItems);
672 if (!pItem)
673 return E_INVALIDARG;
674
675 WCHAR szBuff[128];
676 PCWSTR key = pItem->key;
678 {
679 StringCchPrintfW(szBuff, _countof(szBuff), key, valueName);
680 key = szBuff;
681 }
682 return callback(pQS, query, key, pItem->value, pValue);
683}
684
688 IQuerySourceOld* pSource,
691 PCWSTR valueName,
693{
694 if (!pSource)
695 return E_INVALIDARG;
696
699 {
700 return callback(pSource, query, NULL, valueName, pValue);
701 }
702
703 if ((query & dwFlags) != dwFlags)
704 return E_INVALIDARG;
705
706 const QUERYKEYVAL* pItems = NULL;
707 UINT cItems = _GetQueryKeyVal(&pItems);
708 if (!cItems)
709 return E_INVALIDARG;
710
711 return _QueryKeyValAny(callback, pItems, cItems, pSource, query, valueName, pValue);
712}
713
715{
717 {
718 *ppv = static_cast<IObjectWithQuerySourceOld*>(this);
719 AddRef();
720 return S_OK;
721 }
722 if (riid == IID_IAssociationElementOld)
723 {
724 *ppv = static_cast<IAssociationElementOld*>(this);
725 AddRef();
726 return S_OK;
727 }
728 ERR("E_NOINTERFACE: %s\n", wine_dbgstr_guid(&riid));
729 *ppv = NULL;
730 return E_NOINTERFACE;
731}
732
733STDMETHODIMP_(ULONG) CAssocElement::AddRef()
734{
736}
737
738STDMETHODIMP_(ULONG) CAssocElement::Release()
739{
741 if (!refs)
742 delete this;
743 return refs;
744}
745
746STDMETHODIMP CAssocElement::SetSource(IQuerySourceOld* pSource)
747{
748 if (m_pSource)
749 return E_UNEXPECTED;
750 m_pSource = pSource;
751 m_pSource->AddRef();
752 return S_OK;
753}
754
756{
757 if (!m_pSource)
758 {
759 *ppSource = NULL;
760 return E_NOINTERFACE;
761 }
762 return m_pSource->QueryInterface(riid, ppSource);
763}
764
766{
767 *ppszValue = NULL;
769 query, key, ppszValue);
770}
771
773{
775 query, key, pdwValue);
776}
777
779{
781 query, key, NULL);
782}
783
785{
786 *ppBlob = NULL;
788}
789
791{
792 *ppvObj = NULL;
793 return E_NOTIMPL;
794}
795
796/******************************************************************************
797 * CAssocShellElement methods
798 */
799
801{
802 if (m_pszName && m_pszName != m_szBuff)
804}
805
807{
808 if (riid == IID_IPersist)
809 {
810 *ppv = static_cast<IPersist*>(this);
811 AddRef();
812 return S_OK;
813 }
814 if (riid == IID_IPersistString2)
815 {
816 *ppv = static_cast<IPersistString2*>(this);
817 AddRef();
818 return S_OK;
819 }
821}
822
823STDMETHODIMP_(ULONG) CAssocShellElement::AddRef()
824{
825 return CAssocElement::AddRef();
826}
827
828STDMETHODIMP_(ULONG) CAssocShellElement::Release()
829{
830 return CAssocElement::Release();
831}
832
834{
836}
837
839{
840 *ppItems = g_shellKeyVals;
841 return _countof(g_shellKeyVals);
842}
843
845{
846 return FALSE;
847}
848
850{
851 return FALSE;
852}
853
854HRESULT CAssocShellElement::_GetVerbDelegate(PCWSTR pszSrc, IAssociationElementOld** ppElement)
855{
856 if (!m_pSource)
857 return E_FAIL;
858
859 HRESULT hr;
860 IQuerySourceOld* pSource;
861 if (pszSrc)
862 hr = QSOpen2(m_pSource, L"shell", pszSrc, 0, &pSource);
863 else
864 hr = _DefaultVerbSource(&pSource);
865
867 return hr;
868
869 BOOL bAppSource = _IsAppSource();
870 auto pElement = new(std::nothrow) CAssocShellVerbElement(bAppSource);
871 if (!pElement)
872 {
873 ERR("E_OUTOFMEMORY\n");
874 pSource->Release();
875 return E_OUTOFMEMORY;
876 }
877
878 hr = pElement->SetSource(pSource);
879 *ppElement = static_cast<IAssociationElementOld*>(pElement);
880 pSource->Release();
881 return hr;
882}
883
885{
887 return CAssocElement::QueryString(query, key, ppszValue);
888
889 IAssociationElementOld* pDelegate;
890 HRESULT hr = _GetVerbDelegate(key, &pDelegate);
892 return hr;
893
894 hr = pDelegate->QueryString(query, NULL, ppszValue);
895 pDelegate->Release();
896 return hr;
897}
898
900{
902 return CAssocElement::QueryDword(query, key, pdwValue);
903
904 IAssociationElementOld* pDelegate;
905 HRESULT hr = _GetVerbDelegate(key, &pDelegate);
907 return hr;
908
909 hr = pDelegate->QueryDword(query, NULL, pdwValue);
910 pDelegate->Release();
911 return hr;
912}
913
915{
918
919 IAssociationElementOld* pDelegate;
920 HRESULT hr = _GetVerbDelegate(key, &pDelegate);
922 return hr;
923
924 hr = pDelegate->QueryExists(query, NULL);
925 pDelegate->Release();
926 return hr;
927}
928
931{
933 return CAssocElement::QueryDirect(query, key, ppBlob);
934
935 IAssociationElementOld* pDelegate;
936 HRESULT hr = _GetVerbDelegate(key, &pDelegate);
938 return hr;
939
940 hr = pDelegate->QueryDirect(query, NULL, ppBlob);
941 pDelegate->Release();
942 return hr;
943}
944
947{
949 {
950 *ppvObj = NULL;
951 return E_INVALIDARG;
952 }
953
954 IAssociationElementOld* pDelegate;
955 HRESULT hr = _GetVerbDelegate(key, &pDelegate);
957 return hr;
958
960 hr = pDelegate->QueryInterface(riid, ppvObj);
961 else
962 hr = pDelegate->QueryObject(query, NULL, riid, ppvObj);
963
964 pDelegate->Release();
965 return hr;
966}
967
969{
970 *pClassID = CLSID_AssocShellElement;
971 return S_OK;
972}
973
975{
976 if (m_pszName)
977 return E_UNEXPECTED;
978
979 UINT cchBuff, cchString = lstrlenW(psz);
980 PWSTR pszBuff;
981 if (cchString >= _countof(m_szBuff))
982 {
983 cchBuff = cchString + 1;
984 pszBuff = (PWSTR)LocalAlloc(LPTR, cchBuff * sizeof(WCHAR));
985 }
986 else
987 {
988 pszBuff = m_szBuff;
989 cchBuff = _countof(m_szBuff);
990 }
991
992 m_pszName = pszBuff;
993 if (!m_pszName)
994 return E_UNEXPECTED;
995
996 StringCchCopyW(pszBuff, cchBuff, psz);
997 return _InitSource();
998}
999
1001{
1002 return SHStrDupW(m_pszName, ppsz);
1003}
1004
1006{
1007 IQuerySourceOld* pShellSource;
1008 HRESULT hr = m_pSource->OpenSource(L"shell", FALSE, &pShellSource);
1010 return hr;
1011
1013 PCWSTR pszVerb = L"open";
1014 if (SUCCEEDED(pShellSource->QueryValueString(NULL, NULL, &pszValue)))
1015 pszVerb = pszValue;
1016
1017 hr = pShellSource->OpenSource(pszVerb, FALSE, ppSource);
1019 {
1020 if (pszValue)
1021 {
1022 INT nDelim = StrCSpnW(pszValue, L" ,");
1023 if (nDelim != lstrlenW(pszValue))
1024 {
1025 pszValue[nDelim] = UNICODE_NULL;
1026 hr = pShellSource->OpenSource(pszValue, FALSE, ppSource);
1027 }
1028 }
1029 else
1030 {
1031 IEnumString* pEnum;
1032 if (_UseEnumForDefaultVerb() && SUCCEEDED(pShellSource->EnumSources(&pEnum)))
1033 {
1034 PWSTR pszFirst = NULL;
1035 ULONG cFetched = 0;
1036 if (SUCCEEDED(pEnum->Next(1, &pszFirst, &cFetched)))
1037 {
1038 hr = pShellSource->OpenSource(pszFirst, FALSE, ppSource);
1039 CoTaskMemFree(pszFirst);
1040 }
1041 pEnum->Release();
1042 }
1043 }
1044 }
1045
1046 if (pszValue)
1048
1049 pShellSource->Release();
1050 return hr;
1051}
1052
1053/******************************************************************************
1054 * CAssocShellVerbElement methods
1055 */
1056
1058 : m_bAppSource(bAppSource)
1059{
1060}
1061
1064 PCWSTR key,
1065 PWSTR* ppwsz)
1066{
1068 if (SUCCEEDED(hr))
1069 return hr;
1070
1071 PWSTR psz;
1072 if (query == ASSOCQUERY_SEV_7)
1073 {
1075 if (SUCCEEDED(hr))
1076 hr = _ExeFromCmd(psz, ppwsz);
1077 if (psz)
1078 CoTaskMemFree(psz);
1079 return hr;
1080 }
1081
1083 {
1085 if (SUCCEEDED(hr))
1086 {
1087 PathStripPathW(psz);
1089 }
1090 *ppwsz = psz;
1091 return hr;
1092 }
1093
1095 return SHStrDupW(L"System", ppwsz);
1096
1098 {
1099 IAssociationElementOld* pElement;
1100 hr = _GetAppDelegate(IID_PPV_ARG(IAssociationElementOld, &pElement));
1101 if (SUCCEEDED(hr))
1102 {
1103 hr = pElement->QueryString(ASSOCQUERY_APPKEY_FRIENDLYAPPNAME, NULL, ppwsz);
1104 pElement->Release();
1105 }
1106 }
1107
1108 return hr;
1109}
1110
1112{
1113 *ppItems = g_shellVerbKeyVals;
1115}
1116
1118{
1119 PWSTR psz = NULL;
1122 return hr;
1123
1124 IPersistString2* pPS2;
1125 hr = AssocCreateElement(CLSID_AssocApplicationElement, IID_PPV_ARG(IPersistString2, &pPS2));
1126 if (SUCCEEDED(hr))
1127 {
1128 hr = pPS2->SetString(psz);
1129 if (SUCCEEDED(hr))
1130 hr = pPS2->QueryInterface(riid, ppv);
1131 pPS2->Release();
1132 }
1133
1134 if (psz)
1135 CoTaskMemFree(psz);
1136
1137 return hr;
1138}
1139
1142{
1144 return E_INVALIDARG;
1145 return _GetAppDelegate(riid, ppvObj);
1146}
1147
1148/******************************************************************************
1149 * CAssocApplicationElement methods
1150 */
1151
1153{
1154 *ppItems = g_shellAppKeyVals;
1156}
1157
1159{
1160 PWSTR pchFileName = PathFindFileNameW(m_pszName);
1161
1162 WCHAR szSubKey[MAX_PATH];
1163 _MakeApplicationsKey(pchFileName, szSubKey, _countof(szSubKey));
1164
1166 IID_PPV_ARG(IQuerySourceOld, &m_pSource));
1167 m_bHasDir = (pchFileName != m_pszName);
1169 return S_FALSE;
1170
1171 return hr;
1172}
1173
1175{
1176 *pClsid = CLSID_AssocApplicationElement;
1177 return S_OK;
1178}
1179
1182{
1186}
1187
1189{
1192 return _GetAppDisplayName(ppsz);
1193
1194 return hr;
1195}
1196
1198{
1199 PWSTR pszName;
1200 if (!m_bHasDir)
1201 {
1204 return hr;
1205 }
1206 else
1207 {
1208 pszName = m_pszName;
1209 }
1210
1211 WCHAR szData[MAX_PATH];
1212 DWORD cbData = sizeof(szData);
1214 HRESULT hr = SKGetValueW(flags, NULL, pszName, 0, szData, &cbData);
1216 {
1217 UINT cchData = MAX_PATH;
1218 if (SHGetFileDescriptionW(pszName, NULL, NULL, szData, &cchData))
1219 {
1220 INT cchName = lstrlenW(szData);
1221 UINT cbName = (cchName + 1) * sizeof(WCHAR);
1222 SKSetValueW(flags, NULL, pszName, REG_SZ, (PBYTE)szData, cbName);
1223 hr = S_OK;
1224 }
1225 }
1226
1227 if (SUCCEEDED(hr))
1228 hr = SHStrDupW(szData, ppsz);
1229
1230 if (!m_bHasDir)
1231 CoTaskMemFree(pszName);
1232
1233 return hr;
1234}
1235
1236/******************************************************************************
1237 * CAssocProgidElement methods
1238 */
1239
1241{
1242 if (m_pSource2)
1243 {
1244 m_pSource2->Release();
1245 m_pSource2 = NULL;
1246 }
1247}
1248
1250{
1252 if (SUCCEEDED(hr))
1253 return hr;
1254
1256 {
1259 m_pSource2,
1260 query,
1261 key,
1262 ppszValue);
1263 }
1264
1266 return m_pSource->QueryValueString(NULL, NULL, ppszValue);
1267
1268 return hr;
1269}
1270
1272{
1273 *pClassID = CLSID_AssocProgidElement;
1274 return S_OK;
1275}
1276
1278{
1279 return TRUE;
1280}
1281
1283{
1284 HRESULT hr = S_OK;
1285 PWSTR pszName;
1286
1287 if (*m_pszName == L'.')
1288 {
1291 goto Exit;
1292
1293 hr = m_pSource2->QueryValueString(NULL, NULL, &pszName);
1294 }
1295 else
1296 {
1297 pszName = m_pszName;
1298 }
1299
1300 if (SUCCEEDED(hr))
1301 {
1302 HKEY hKey = _OpenProgidKey(pszName);
1303 if (hKey)
1304 {
1307 }
1308 else
1309 {
1310 hr = E_UNEXPECTED;
1311 }
1312
1313 if (pszName != m_pszName)
1314 CoTaskMemFree(pszName);
1315 }
1316
1317Exit:
1319 {
1321 m_pSource2 = NULL;
1322 return S_FALSE;
1323 }
1324
1325 return hr;
1326}
1327
1328/******************************************************************************
1329 * CAssocClsidElement methods
1330 */
1331
1333{
1334 *pClassID = CLSID_AssocClsidElement;
1335 return S_OK;
1336}
1337
1339{
1341}
1342
1343/******************************************************************************
1344 * CAssocSystemExtElement methods
1345 */
1346
1348{
1349 *pClassID = CLSID_AssocSystemElement;
1350 return S_OK;
1351}
1352
1354{
1355 return _QuerySourceCreateFromKey2(HKEY_CLASSES_ROOT, L"SystemFileAssociations", m_pszName,
1356 &m_pSource);
1357}
1358
1359/******************************************************************************
1360 * CAssocFolderElement methods
1361 */
1362
1364{
1366 return _SHAllocLoadString(GetModuleHandleW(L"shlwapi.dll"), IDS_FOLDER, ppszValue);
1367 return CAssocShellElement::QueryString(query, key, ppszValue);
1368}
1369
1371{
1372 *pClassID = CLSID_AssocFolderElement;
1373 return S_OK;
1374}
1375
1377{
1379 IID_PPV_ARG(IQuerySourceOld, &m_pSource));
1380}
1381
1382/******************************************************************************
1383 * CAssocStarElement methods
1384 */
1385
1387{
1389 return _GetFileTypeName(m_pszName, ppszValue);
1390
1391 return CAssocShellElement::QueryString(query, key, ppszValue);
1392}
1393
1395{
1396 *pClassID = CLSID_AssocStarElement;
1397 return S_OK;
1398}
1399
1401{
1403 IID_PPV_ARG(IQuerySourceOld, &m_pSource));
1404}
1405
1406/******************************************************************************
1407 * CAssocPerceivedElement methods
1408 */
1409
1411{
1412 if (m_bPerceived)
1413 {
1414 *ppItems = g_perceivedKeyVals;
1416 }
1417 else
1418 {
1419 *ppItems = g_shellKeyVals;
1420 return _countof(g_shellKeyVals);
1421 }
1422}
1423
1425{
1426 *pClassID = CLSID_AssocPerceivedElement;
1427 return S_OK;
1428}
1429
1431{
1432 *ppSource = NULL;
1433 if (m_bPerceived)
1434 return E_FAIL;
1435
1436 return CAssocElement::GetSource(riid, ppSource);
1437}
1438
1440{
1443 PWSTR pszType;
1446 return hr;
1447
1449 hr = _QuerySourceCreateFromKey2(HKEY_CLASSES_ROOT, L"SystemFileAssociations", pszType,
1450 &m_pSource);
1451 CoTaskMemFree(pszType);
1452 return hr;
1453}
1454
1455HRESULT CAssocPerceivedElement::_GetVerbDelegate(PCWSTR pszSrc, IAssociationElementOld** ppElement)
1456{
1457 if (m_bPerceived)
1458 return E_FAIL;
1459
1460 return CAssocShellElement::_GetVerbDelegate(pszSrc, ppElement);
1461}
1462
1463/******************************************************************************
1464 * CAssocClientElement methods
1465 */
1466
1468{
1469 HRESULT hr;
1470
1472 {
1474 if (SUCCEEDED(hr))
1475 return hr;
1476
1477 IAssociationElementOld* pDelegate;
1478 HRESULT hr = _GetVerbDelegate(key, &pDelegate);
1480 return hr;
1481
1482 hr = pDelegate->QueryString(ASSOCQUERY_DELEGATE, L"open", ppszValue);
1483 pDelegate->Release();
1484 return hr;
1485 }
1486
1488 {
1489 hr = CAssocElement::QueryString(ASSOCQUERY_LOCALIZEDSTRING, L"LocalizedString", ppszValue);
1490 if (SUCCEEDED(hr))
1491 return hr;
1493 }
1494
1495 return CAssocShellElement::QueryString(query, key, ppszValue);
1496}
1497
1499{
1500 *pClassID = CLSID_AssocClientElement;
1501 return S_OK;
1502}
1503
1505{
1506 WCHAR szBuff[MAX_PATH];
1507 StringCchPrintfW(szBuff, _countof(szBuff), L"SOFTWARE\\Clients\\%s", m_pszName);
1508
1510 if (SUCCEEDED(hr))
1511 return hr;
1512 return _InitSourceFromKey(HKEY_LOCAL_MACHINE, szBuff, 0);
1513}
1514
1516{
1517 HKEY hKeyParent;
1518 LSTATUS error = RegCreateKeyExW(HKEY_CURRENT_USER, L"Software\\Clients\\Mail", 0, NULL, 0,
1519 KEY_ALL_ACCESS, NULL, &hKeyParent, NULL);
1520 if (error)
1521 return E_FAIL;
1522
1523 DWORD dwDisposition;
1524 HKEY hKey;
1525 error = RegCreateKeyExW(hKeyParent, L"Netscape Messenger", 0, NULL, REG_OPTION_VOLATILE,
1526 KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition);
1527 if (error)
1528 {
1529 SHDeleteKeyW(hKeyParent, L"Netscape Messenger");
1530 RegCloseKey(hKeyParent);
1531 return E_FAIL;
1532 }
1533
1534 HRESULT hr = E_FAIL;
1536 {
1537 IQuerySourceOld* pNewSource = NULL;
1538 hr = _QuerySourceCreateFromKey(hKey, NULL, NULL, &pNewSource);
1539 if (SUCCEEDED(hr))
1540 {
1541 if (m_pSource)
1542 m_pSource->Release();
1543 m_pSource = pNewSource;
1544 }
1545 }
1546
1548
1550 SHDeleteKeyW(hKeyParent, L"Netscape Messenger");
1551
1552 RegCloseKey(hKeyParent);
1553 return hr;
1554}
1555
1557{
1558 HKEY hkResult;
1560 L"Software\\Clients\\Mail\\Netscape Messenger",
1561 0, KEY_READ, &hkResult);
1562 if (error)
1563 return FALSE;
1564
1565 WCHAR szIconFile[MAX_PATH];
1566 error = _RegQueryString(hkResult, L"Protocols\\mailto\\DefaultIcon",
1567 szIconFile, _countof(szIconFile));
1568 if (error == ERROR_SUCCESS)
1569 {
1570 PathParseIconLocationW(szIconFile);
1571 StringCchCatW(szIconFile, _countof(szIconFile), L",-1349");
1572 _RegSetVolatileString(hKey, L"DefaultIcon", szIconFile);
1573 }
1574
1575 BOOL ret = FALSE;
1576 PWSTR lpString2 = NULL;
1577 if (_RegQueryString(hkResult, 0, szIconFile, _countof(szIconFile)) == ERROR_SUCCESS &&
1578 _RegSetVolatileString(hKey, 0, szIconFile) == ERROR_SUCCESS &&
1579 _RegQueryString(hkResult, L"Protocols\\mailto\\shell\\open\\command",
1580 szIconFile, _countof(szIconFile)) == ERROR_SUCCESS &&
1581 SUCCEEDED(_ExeFromCmd(szIconFile, &lpString2)))
1582 {
1583 StringCchCopyW(szIconFile, _countof(szIconFile), lpString2);
1584 CoTaskMemFree(lpString2);
1585 PathQuoteSpacesW(szIconFile);
1586 StringCchCatW(szIconFile, _countof(szIconFile), L" -mail");
1587 if (_RegSetVolatileString(hKey, L"shell\\open\\command", szIconFile) == ERROR_SUCCESS)
1588 ret = TRUE;
1589 }
1590
1591 RegCloseKey(hkResult);
1592 return ret;
1593}
1594
1596{
1597 HKEY hKey2;
1598 LSTATUS error = RegOpenKeyExW(hKey, lpSubKey, 0, KEY_READ | dwFlags, &hKey2);
1599 if (error)
1600 return E_INVALIDARG;
1601
1603 HKEY hkeySrc = NULL;
1604 WCHAR szData[80];
1605 DWORD dwType, cbData = sizeof(szData);
1606 error = RegQueryValueExW(hKey2, NULL, NULL, &dwType, (PBYTE)szData, &cbData);
1607 if (error == ERROR_SUCCESS && dwType == REG_SZ && szData[0] &&
1608 RegOpenKeyExW(HKEY_LOCAL_MACHINE, lpSubKey, 0, KEY_READ, &hkeySrc) == ERROR_SUCCESS)
1609 {
1610 hr = _QuerySourceCreateFromKey2(hkeySrc, NULL, szData, &m_pSource);
1611 RegCloseKey(hkeySrc);
1612 }
1613
1614 RegCloseKey(hKey2);
1615
1616 if (FAILED_UNEXPECTEDLY(hr) ||
1617 lstrcmpiW(m_pszName, L"mail") != 0 ||
1618 lstrcmpiW(szData, L"Netscape Messenger") != 0 ||
1620 {
1621 return hr;
1622 }
1623
1624 return _FixNetscapeRegistration();
1625}
1626
1627/******************************************************************************
1628 * AssocCreateElement [SHELL32.764] (Vista+)
1629 * AssocCreateElement [SHLWAPI internal] (XP)
1630 *
1631 * @see AssocCreate
1632 * @see https://www.geoffchappell.com/studies/windows/shell/shell32/api/assocelem/createelement.htm
1633 */
1636{
1637 IAssociationElementOld* pElement;
1638 if (rclsid == CLSID_AssocShellElement)
1639 {
1640 auto pNewElement = new(std::nothrow) CAssocShellElement();
1641 pElement = static_cast<IAssociationElementOld*>(pNewElement);
1642 }
1643 else if (rclsid == CLSID_AssocApplicationElement)
1644 {
1645 auto pNewElement = new(std::nothrow) CAssocApplicationElement();
1646 pElement = static_cast<IAssociationElementOld*>(pNewElement);
1647 }
1648 else if (rclsid == CLSID_AssocProgidElement)
1649 {
1650 auto pNewElement = new(std::nothrow) CAssocProgidElement();
1651 pElement = static_cast<IAssociationElementOld*>(pNewElement);
1652 }
1653 else if (rclsid == CLSID_AssocClsidElement)
1654 {
1655 auto pNewElement = new(std::nothrow) CAssocClsidElement();
1656 pElement = static_cast<IAssociationElementOld*>(pNewElement);
1657 }
1658 else if (rclsid == CLSID_AssocSystemElement)
1659 {
1660 auto pNewElement = new(std::nothrow) CAssocSystemExtElement();
1661 pElement = static_cast<IAssociationElementOld*>(pNewElement);
1662 }
1663 else if (rclsid == CLSID_AssocFolderElement)
1664 {
1665 auto pNewElement = new(std::nothrow) CAssocFolderElement();
1666 pElement = static_cast<IAssociationElementOld*>(pNewElement);
1667 }
1668 else if (rclsid == CLSID_AssocStarElement)
1669 {
1670 auto pNewElement = new(std::nothrow) CAssocStarElement();
1671 pElement = static_cast<IAssociationElementOld*>(pNewElement);
1672 }
1673 else if (rclsid == CLSID_AssocPerceivedElement)
1674 {
1675 auto pNewElement = new(std::nothrow) CAssocPerceivedElement();
1676 pElement = static_cast<IAssociationElementOld*>(pNewElement);
1677 }
1678 else if (rclsid == CLSID_AssocClientElement)
1679 {
1680 auto pNewElement = new(std::nothrow) CAssocClientElement();
1681 pElement = static_cast<IAssociationElementOld*>(pNewElement);
1682 }
1683 else
1684 {
1685 ERR("rclsid: %s\n", wine_dbgstr_guid(&rclsid));
1686 *ppvObj = NULL;
1688 }
1689
1690 if (!pElement)
1691 {
1692 ERR("E_OUTOFMEMORY\n");
1693 return E_OUTOFMEMORY;
1694 }
1695
1696 HRESULT hr = pElement->QueryInterface(riid, ppvObj);
1697 pElement->Release();
1698 return hr;
1699}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ERR(fmt,...)
Definition: precomp.h:57
#define EXTERN_C
Definition: basetyps.h:12
#define STDMETHODIMP
Definition: basetyps.h:43
#define STDMETHODIMP_(t)
Definition: basetyps.h:44
#define RegCloseKey(hKey)
Definition: registry.h:49
_In_ BOOLEAN Release
Definition: cdrom.h:920
HINSTANCE hInstance
Definition: charmap.c:19
HRESULT _InitSource() override
Definition: elements.cpp:1158
HRESULT _GetAppDisplayName(PWSTR *ppsz)
Definition: elements.cpp:1197
UINT _GetQueryKeyVal(const QUERYKEYVAL **ppItems) override
Definition: elements.cpp:1152
STDMETHODIMP GetClassID(CLSID *pClsid) override
Definition: elements.cpp:1174
STDMETHODIMP QueryObject(ASSOCQUERY query, PCWSTR key, REFIID riid, PVOID *ppv) override
Definition: elements.cpp:1181
STDMETHODIMP QueryString(ASSOCQUERY query, PCWSTR key, PWSTR *ppsz) override
Definition: elements.cpp:1188
HRESULT _InitSourceFromKey(HKEY hKey, PCWSTR lpSubKey, DWORD dwFlags)
Definition: elements.cpp:1595
STDMETHODIMP QueryString(ASSOCQUERY query, PCWSTR key, PWSTR *ppszValue) override
Definition: elements.cpp:1467
HRESULT _FixNetscapeRegistration()
Definition: elements.cpp:1515
HRESULT _InitSource() override
Definition: elements.cpp:1504
STDMETHODIMP GetClassID(CLSID *pClassID) override
Definition: elements.cpp:1498
BOOL _CreateRepairedNetscapeRegistration(HKEY hKey)
Definition: elements.cpp:1556
HRESULT _InitSource() override
Definition: elements.cpp:1338
STDMETHODIMP GetClassID(CLSID *pClassID) override
Definition: elements.cpp:1332
STDMETHODIMP QueryInterface(REFIID riid, PVOID *ppv) override
Definition: elements.cpp:714
STDMETHODIMP QueryObject(ASSOCQUERY query, PCWSTR key, REFIID riid, PVOID *ppvObj) override
Definition: elements.cpp:790
virtual ~CAssocElement()
Definition: elements.cpp:646
STDMETHODIMP SetSource(IQuerySourceOld *pSource) override
Definition: elements.cpp:746
STDMETHODIMP QueryDirect(ASSOCQUERY query, PCWSTR key, FLAGGED_BYTE_BLOB **ppBlob) override
Definition: elements.cpp:784
STDMETHODIMP QueryExists(ASSOCQUERY query, PCWSTR key) override
Definition: elements.cpp:778
IQuerySourceOld * m_pSource
Definition: elements.cpp:406
HRESULT _QueryKeyValAny(QUERY_CALLBACK callback, const QUERYKEYVAL *pItems, UINT cItems, IQuerySourceOld *pQS, ASSOCQUERY query, PCWSTR valueName, PVOID pValue)
Definition: elements.cpp:662
STDMETHODIMP_(ULONG) AddRef() override
STDMETHODIMP_(ULONG) Release() override
STDMETHODIMP QueryString(ASSOCQUERY query, PCWSTR key, PWSTR *ppszValue) override
Definition: elements.cpp:765
STDMETHODIMP QueryDword(ASSOCQUERY query, PCWSTR key, DWORD *pdwValue) override
Definition: elements.cpp:772
HRESULT _QuerySourceAny(QUERY_CALLBACK callback, IQuerySourceOld *pSource, DWORD dwFlags, ASSOCQUERY query, PCWSTR valueName, PVOID pValue)
Definition: elements.cpp:686
virtual UINT _GetQueryKeyVal(const QUERYKEYVAL **ppItems)
Definition: elements.cpp:655
STDMETHODIMP GetSource(REFIID riid, PVOID *ppSource) override
Definition: elements.cpp:755
HRESULT _InitSource() override
Definition: elements.cpp:1376
STDMETHODIMP QueryString(ASSOCQUERY query, PCWSTR key, PWSTR *ppszValue) override
Definition: elements.cpp:1363
STDMETHODIMP GetClassID(CLSID *pClassID) override
Definition: elements.cpp:1370
UINT _GetQueryKeyVal(const QUERYKEYVAL **ppItems) override
Definition: elements.cpp:1410
HRESULT _GetVerbDelegate(PCWSTR pszSrc, IAssociationElementOld **ppElement) override
Definition: elements.cpp:1455
HRESULT _InitSource() override
Definition: elements.cpp:1439
STDMETHODIMP GetSource(REFIID riid, PVOID *ppSource) override
Definition: elements.cpp:1430
STDMETHODIMP GetClassID(CLSID *pClassID) override
Definition: elements.cpp:1424
HRESULT _InitSource() override
Definition: elements.cpp:1282
STDMETHODIMP GetClassID(CLSID *pClassID) override
Definition: elements.cpp:1271
BOOL _UseEnumForDefaultVerb() override
Definition: elements.cpp:1277
STDMETHODIMP QueryString(ASSOCQUERY query, PCWSTR key, PWSTR *ppszValue) override
Definition: elements.cpp:1249
IQuerySourceOld * m_pSource2
Definition: elements.cpp:529
~CAssocProgidElement() override
Definition: elements.cpp:1240
WCHAR m_szBuff[64]
Definition: elements.cpp:455
STDMETHODIMP QueryObject(ASSOCQUERY query, PCWSTR key, REFIID riid, PVOID *ppvObj) override
Definition: elements.cpp:946
STDMETHODIMP SetString(PCWSTR psz) override
Definition: elements.cpp:974
STDMETHODIMP GetClassID(CLSID *pClassID) override
Definition: elements.cpp:968
virtual BOOL _IsAppSource()
Definition: elements.cpp:849
STDMETHODIMP QueryDword(ASSOCQUERY query, PCWSTR key, DWORD *pdwValue) override
Definition: elements.cpp:899
STDMETHODIMP GetString(PWSTR *ppsz) override
Definition: elements.cpp:1000
virtual HRESULT _InitSource()
Definition: elements.cpp:833
UINT _GetQueryKeyVal(const QUERYKEYVAL **ppItems) override
Definition: elements.cpp:838
STDMETHODIMP_(ULONG) AddRef() override
virtual BOOL _UseEnumForDefaultVerb()
Definition: elements.cpp:844
STDMETHODIMP QueryExists(ASSOCQUERY query, PCWSTR key) override
Definition: elements.cpp:914
STDMETHODIMP QueryInterface(REFIID riid, PVOID *ppv) override
Definition: elements.cpp:806
STDMETHODIMP QueryDirect(ASSOCQUERY query, PCWSTR key, FLAGGED_BYTE_BLOB **ppBlob) override
Definition: elements.cpp:930
HRESULT _DefaultVerbSource(IQuerySourceOld **ppSource)
Definition: elements.cpp:1005
virtual HRESULT _GetVerbDelegate(PCWSTR pszSrc, IAssociationElementOld **ppElement)
Definition: elements.cpp:854
STDMETHODIMP QueryString(ASSOCQUERY query, PCWSTR key, PWSTR *ppszValue) override
Definition: elements.cpp:884
STDMETHODIMP_(ULONG) Release() override
UINT _GetQueryKeyVal(const QUERYKEYVAL **ppItems) override
Definition: elements.cpp:1111
CAssocShellVerbElement(BOOL bAppSource)
Definition: elements.cpp:1057
STDMETHODIMP QueryString(ASSOCQUERY query, PCWSTR key, PWSTR *ppwsz) override
Definition: elements.cpp:1062
STDMETHODIMP QueryObject(ASSOCQUERY query, PCWSTR key, REFIID riid, PVOID *ppvObj) override
Definition: elements.cpp:1141
HRESULT _GetAppDelegate(REFIID riid, PVOID *ppv)
Definition: elements.cpp:1117
STDMETHODIMP QueryString(ASSOCQUERY query, PCWSTR key, PWSTR *ppszValue) override
Definition: elements.cpp:1386
STDMETHODIMP GetClassID(CLSID *pClassID) override
Definition: elements.cpp:1394
HRESULT _InitSource() override
Definition: elements.cpp:1400
HRESULT _InitSource() override
Definition: elements.cpp:1353
STDMETHODIMP GetClassID(CLSID *pClassID) override
Definition: elements.cpp:1347
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
HRESULT hr
Definition: delayimp.cpp:582
#define ERROR_SUCCESS
Definition: deptool.c:10
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
LSTATUS WINAPI RegQueryValueW(HKEY hkey, LPCWSTR name, LPWSTR data, LPLONG count)
Definition: reg.c:4241
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
int WINAPI StrCSpnW(LPCWSTR lpszStr, LPCWSTR lpszMatch)
Definition: string.c:839
LPWSTR WINAPI StrChrW(LPCWSTR lpszStr, WCHAR ch)
Definition: string.c:464
INT WINAPI StrCmpNW(LPCWSTR lpszStr, LPCWSTR lpszComp, INT iLen)
Definition: string.c:500
#define MAX_PATH
Definition: compat.h:34
#define CALLBACK
Definition: compat.h:35
#define lstrlenW
Definition: compat.h:750
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4171
void WINAPI PathRemoveExtensionW(WCHAR *path)
Definition: path.c:1922
void WINAPI PathUnquoteSpacesW(WCHAR *path)
Definition: path.c:1982
WCHAR *WINAPI PathFindFileNameW(const WCHAR *path)
Definition: path.c:1677
void WINAPI PathStripPathW(WCHAR *path)
Definition: path.c:2304
int WINAPI PathParseIconLocationW(WCHAR *path)
Definition: path.c:2620
HRESULT WINAPI PathCchAddExtension(WCHAR *path, SIZE_T size, const WCHAR *extension)
Definition: path.c:542
BOOL WINAPI PathFileExistsW(const WCHAR *path)
Definition: path.c:2583
BOOL WINAPI PathIsFileSpecW(const WCHAR *path)
Definition: path.c:1818
HRESULT WINAPI PathCchCombineEx(WCHAR *out, SIZE_T size, const WCHAR *path1, const WCHAR *path2, DWORD flags)
Definition: path.c:674
void WINAPI PathQuoteSpacesW(WCHAR *path)
Definition: path.c:2520
LPWSTR WINAPI CharUpperW(WCHAR *str)
Definition: string.c:1249
HRESULT WINAPI SHLoadIndirectString(const WCHAR *src, WCHAR *dst, UINT dst_len, void **reserved)
Definition: string.c:1499
int WINAPI StrCmpIW(const WCHAR *str, const WCHAR *comp)
Definition: string.c:464
HRESULT WINAPI SHStrDupW(const WCHAR *src, WCHAR **dest)
Definition: main.c:1692
DWORD WINAPI SHGetValueW(HKEY hkey, const WCHAR *subkey, const WCHAR *value, DWORD *type, void *data, DWORD *data_len)
Definition: main.c:2222
DWORD WINAPI SHDeleteKeyW(HKEY hkey, const WCHAR *subkey)
Definition: main.c:1886
#define IDS_ANY_FILE
Definition: resource.h:5
#define IDS_FOLDER
Definition: resource.h:7
#define IDS_FILE
Definition: resource.h:6
HRESULT WINAPI AssocGetPerceivedType(LPCWSTR lpszExt, PERCEIVED *lpType, INT *lpFlag, LPWSTR *lppszType)
Definition: assoc.c:324
HRESULT WINAPI SKGetValueW(DWORD flags, LPCWSTR subkey, LPCWSTR value, DWORD *type, void *data, DWORD *count)
Definition: ordinal.c:4311
HRESULT WINAPI SKSetValueW(DWORD flags, LPCWSTR subkey, LPCWSTR value, DWORD type, void *data, DWORD count)
Definition: ordinal.c:4333
BOOL WINAPI PathFileExistsAndAttributesW(LPCWSTR lpszPath, DWORD *dwAttr)
Definition: path.c:747
BOOL WINAPI SHGetFileDescriptionW(_In_ PCWSTR pszPath, _In_opt_ PCWSTR pszVerKey, _In_opt_ PCWSTR pszDisplayName, _Out_opt_ PWSTR pszOut, _Inout_ PUINT pcchOut)
Definition: utils.cpp:1087
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:33
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
static HRESULT _AssocOpenRegKey(HKEY hKey, PCWSTR lpSubKey, PHKEY phkResult, BOOL bCreate)
Definition: elements.cpp:252
static HRESULT _GetFileTypeName(PWSTR lpsz, PWSTR *ppwsz)
Definition: elements.cpp:141
static LSTATUS _RegQueryString(HKEY hKey, PCWSTR lpSubKey, PWSTR lpData, LONG cchData)
Definition: elements.cpp:156
#define ASSOCQUERY_DELEGATE
Definition: elements.cpp:57
static const QUERYKEYVAL g_shellVerbKeyVals[]
Definition: elements.cpp:75
static HRESULT CALLBACK _QuerySourceString(IQuerySourceOld *pSource, ASSOCQUERY query, PCWSTR keyName, PCWSTR valueName, PVOID pValue)
Definition: elements.cpp:214
static HRESULT _QuerySourceCreateFromKey(HKEY hKey, PCWSTR lpSubKey, BOOL bCreate, IQuerySourceOld **ppSource)
Definition: elements.cpp:228
#define ASSOCQUERY_CONTENT_TYPE
Definition: elements.cpp:56
#define ASSOCQUERY_CLSID
Definition: elements.cpp:41
struct QUERYKEYVAL * PQUERYKEYVAL
#define ASSOCQUERY_COMMAND_COMMAND
Definition: elements.cpp:45
#define ASSOCQUERY_DDEEXEC
Definition: elements.cpp:49
#define ASSOCQUERY_SEV_7
Definition: elements.cpp:54
#define ASSOCQUERY_SHELLEX
Definition: elements.cpp:43
#define ASSOCQUERY_DDEEXEC_TOPIC
Definition: elements.cpp:52
#define ASSOCQUERY_VERB_FRIENDLYAPPNAME
Definition: elements.cpp:47
static const QUERYKEYVAL g_progidKeyVals[2]
Definition: elements.cpp:92
static void _MakeApplicationsKey(PCWSTR pszPath, PWSTR pszDest, UINT cchDest)
Definition: elements.cpp:313
#define ASSOCQUERY_DDEEXEC_IFEXEC
Definition: elements.cpp:50
static LSTATUS _RegSetVolatileString(HKEY hKey, PCWSTR lpSubKey, PCWSTR lpString)
Definition: elements.cpp:163
static HRESULT CALLBACK _QuerySourceExists(IQuerySourceOld *pSource, ASSOCQUERY query, PCWSTR keyName, PCWSTR valueName, PVOID pValue)
Definition: elements.cpp:203
HRESULT(CALLBACK * QUERY_CALLBACK)(IQuerySourceOld *, ASSOCQUERY query, PCWSTR keyName, PCWSTR valueName, PVOID pValue)
Definition: elements.cpp:24
#define ASSOCQUERY_LOCALIZEDSTRING
Definition: elements.cpp:53
static HRESULT CALLBACK _QuerySourceDirect(IQuerySourceOld *pSource, ASSOCQUERY query, PCWSTR keyName, PCWSTR valueName, PVOID pValue)
Definition: elements.cpp:181
static BOOL _ParamIsApp(PCWSTR psz)
Definition: elements.cpp:322
static const QUERYKEYVAL g_perceivedKeyVals[]
Definition: elements.cpp:60
static HRESULT SHAllocMUI(PWSTR *ppwsz)
Definition: elements.cpp:109
#define ASSOCQUERY_FRIENDLYAPPNAME
Definition: elements.cpp:46
static HKEY _OpenProgidKey(PCWSTR psz)
Definition: elements.cpp:271
#define ASSOCQUERY_DEFAULTICON
Definition: elements.cpp:40
static const QUERYKEYVAL g_shellAppKeyVals[]
Definition: elements.cpp:87
#define ASSOCQUERY_PROGID
Definition: elements.cpp:42
static HRESULT _SHAllocLoadString(HINSTANCE hInstance, UINT uID, PWSTR *ppwsz)
Definition: elements.cpp:122
EXTERN_C HRESULT WINAPI AssocCreateElement(_In_ REFCLSID rclsid, _In_ REFIID riid, _Outptr_ PVOID *ppvObj)
Definition: elements.cpp:1635
#define ASSOCQUERY_OBJECT_EV_1
Definition: elements.cpp:58
static HRESULT QSOpen2(IQuerySourceOld *pSource, PCWSTR key, PCWSTR pszSrc, BOOL bCreate, IQuerySourceOld **ppSource)
Definition: elements.cpp:129
#define ASSOCQUERY_APPKEY_FRIENDLYAPPNAME
Definition: elements.cpp:55
static const QUERYKEYVAL * _FindKeyVal(ASSOCQUERY query, const QUERYKEYVAL *pItems, UINT cItems)
Definition: elements.cpp:99
static HRESULT _QuerySourceCreateFromKey2(HKEY hKey, PCWSTR key1, PCWSTR key2, IQuerySourceOld **ppSource)
Definition: elements.cpp:235
static HRESULT CALLBACK _QuerySourceDword(IQuerySourceOld *pSource, ASSOCQUERY query, PCWSTR keyName, PCWSTR valueName, PVOID pValue)
Definition: elements.cpp:192
#define ASSOCQUERY_DDEEXEC_APPLICATION
Definition: elements.cpp:51
#define ASSOCQUERY_NOACTIVATEHANDLER
Definition: elements.cpp:44
static HRESULT _PathFileExists(PCWSTR lpFileName)
Definition: elements.cpp:327
#define ASSOCQUERY_COMMAND
Definition: elements.cpp:48
static const QUERYKEYVAL g_shellKeyVals[]
Definition: elements.cpp:66
static HRESULT _ExeFromCmd(PCWSTR pszCmdTemplate, PWSTR *ppszApplication)
Definition: elements.cpp:335
#define ASSOCQUERY_SDED
Definition: elements.cpp:36
EXTERN_C HRESULT _PathCopyExeAndTrimWhiteSpaces(PWSTR pszBuff, size_t cchBuff, PCWSTR pszSrc, size_t cchSrc)
Definition: evalcmd.cpp:53
EXTERN_C HRESULT _PathFindInSystem(_Inout_ PWSTR pszPath, _In_ UINT cchPath)
Definition: evalcmd.cpp:162
EXTERN_C HRESULT WINAPI SHEvaluateSystemCommandTemplate(_In_ PCWSTR pszCmdTemplate, _Outptr_ PWSTR *ppszApplication, _Outptr_opt_ PWSTR *ppszCommandLine, _Outptr_opt_ PWSTR *ppszParameters)
Definition: evalcmd.cpp:182
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
PWCHAR pValue
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLbitfield flags
Definition: glext.h:7161
GLuint64EXT GLuint GLuint GLenum GLenum GLuint GLuint GLenum GLuint GLuint key1
Definition: glext.h:10608
unsigned int UINT
Definition: sysinfo.c:13
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1390
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
HRESULT Next([in] ULONG celt, [out, size_is(celt), length_is(*pceltFetched)] LPOLESTR *rgelt, [out] ULONG *pceltFetched)
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
ULONG Release()
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define REG_SZ
Definition: layer.c:22
#define LPTR
Definition: minwinbase.h:93
#define error(str)
Definition: mkdosfs.c:1605
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static IPrintDialogCallback callback
Definition: printdlg.c:326
static ULONG WINAPI AddRef(IStream *iface)
Definition: clist.c:83
@ SHKEY_Key_ShellNoRoam
Definition: ordinal.c:2809
@ SHKEY_Subkey_MUICache
Definition: ordinal.c:2816
@ SHKEY_Root_HKCU
Definition: ordinal.c:2805
static int int const SCRIPT_CONTROL const SCRIPT_STATE SCRIPT_ITEM * pItems
Definition: usp10.c:62
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define _Outptr_
Definition: no_sal2.h:262
#define _In_
Definition: no_sal2.h:158
#define KEY_ALL_ACCESS
Definition: nt_native.h:1044
#define KEY_READ
Definition: nt_native.h:1026
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define KEY_WRITE
Definition: nt_native.h:1034
#define REG_OPENED_EXISTING_KEY
Definition: nt_native.h:1088
#define REG_OPTION_VOLATILE
Definition: nt_native.h:1063
#define MAXIMUM_ALLOWED
Definition: nt_native.h:83
#define UNICODE_NULL
@ PATHCCH_NONE
Definition: pathcch.h:39
BYTE * PBYTE
Definition: pedump.c:66
short WCHAR
Definition: pedump.c:58
DWORD * PDWORD
Definition: pedump.c:68
long LONG
Definition: pedump.c:60
const GUID IID_IPersist
Definition: proxy.cpp:14
#define REFIID
Definition: guiddef.h:118
#define REFCLSID
Definition: guiddef.h:117
_In_opt_ _In_opt_ _In_ _In_ DWORD cbData
Definition: shlwapi.h:761
_In_ INT cchDest
Definition: shlwapi.h:1161
INT PERCEIVEDFLAG
Definition: shlwapi.h:1002
_In_ UINT uID
Definition: shlwapi.h:156
_In_opt_ LPCSTR _In_opt_ LPCSTR pszValue
Definition: shlwapi.h:783
#define PERCEIVEDFLAG_NATIVESUPPORT
Definition: shtypes.idl:188
EXTERN_C HRESULT WINAPI QuerySourceCreateFromKey(_In_ HKEY hKey, _In_opt_ PCWSTR lpSubKey, _In_ BOOL bCreate, _In_ REFIID riid, _Outptr_ PVOID *ppv)
Definition: querysrc.cpp:499
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:171
#define LoadStringW
Definition: utils.h:64
_In_ UINT _In_ UINT cch
Definition: shellapi.h:432
#define IID_IObjectWithQuerySourceOld
_In_ int _In_ BOOL bCreate
Definition: shlobj.h:1536
#define ASSOCQUERY_DWORD
Definition: shlobj_undoc.h:38
DWORD ASSOCQUERY
Definition: shlobj_undoc.h:33
#define ASSOCQUERY_DIRECT
Definition: shlobj_undoc.h:37
#define ASSOCQUERY_STRING
Definition: shlobj_undoc.h:35
#define ASSOCQUERY_INDIRECT
Definition: shlobj_undoc.h:39
#define ASSOCQUERY_EXTRA_VERB
Definition: shlobj_undoc.h:43
#define ASSOCQUERY_EXTRA_NON_VERB
Definition: shlobj_undoc.h:42
#define ASSOCQUERY_FALLBACK
Definition: shlobj_undoc.h:45
#define ASSOCQUERY_OBJECT
Definition: shlobj_undoc.h:40
static BOOL PathIsAbsolute(_In_ PCWSTR pszPath)
enum tagPERCEIVED PERCEIVED
#define _countof(array)
Definition: sndvol32.h:70
static void Exit(void)
Definition: sock.c:1330
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:325
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
ASSOCQUERY query
Definition: elements.cpp:29
PCWSTR value
Definition: elements.cpp:31
PCWSTR key
Definition: elements.cpp:30
Definition: copy.c:22
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * PCWSTR
Definition: typedefs.h:57
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
_In_ LPCSTR lpFileName
Definition: winbase.h:2800
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
Definition: winbase.h:2497
#define HRESULT
Definition: msvc.h:7
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:3451
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define E_NOINTERFACE
Definition: winerror.h:3479
#define ERROR_NO_ASSOCIATION
Definition: winerror.h:1001
#define E_UNEXPECTED
Definition: winerror.h:3528
#define CLASS_E_CLASSNOTAVAILABLE
Definition: winerror.h:3772
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
#define IID_PPV_ARG(Itype, ppType)