1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2009-2011 - TortoiseSVN
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "SmartHandle.h"
21 #include "JumpListHelpers.h"
22 #include "propvarutil.h"
25 HRESULT
SetAppID(LPCTSTR appID
)
27 HRESULT hRes
= S_FALSE
;
28 typedef HRESULT STDAPICALLTYPE
SetCurrentProcessExplicitAppUserModelIDFN(PCWSTR AppID
);
29 CAutoLibrary hShell
= ::LoadLibrary(_T("shell32.dll"));
32 SetCurrentProcessExplicitAppUserModelIDFN
*pfnSetCurrentProcessExplicitAppUserModelID
= (SetCurrentProcessExplicitAppUserModelIDFN
*)GetProcAddress(hShell
, "SetCurrentProcessExplicitAppUserModelID");
33 if (pfnSetCurrentProcessExplicitAppUserModelID
)
34 hRes
= pfnSetCurrentProcessExplicitAppUserModelID(appID
);
39 HRESULT
CreateShellLink(PCWSTR pszArguments
, PCWSTR pszTitle
, int iconIndex
, IShellLink
**ppsl
)
41 ATL::CComPtr
<IShellLink
> psl
;
42 HRESULT hr
= psl
.CoCreateInstance(CLSID_ShellLink
, NULL
, CLSCTX_INPROC_SERVER
);
46 WCHAR szAppPath
[MAX_PATH
];
47 if (GetModuleFileName(NULL
, szAppPath
, ARRAYSIZE(szAppPath
)) == 0) {
48 hr
= HRESULT_FROM_WIN32(GetLastError());
51 hr
= psl
->SetPath(szAppPath
);
55 hr
= psl
->SetArguments(pszArguments
);
59 hr
= psl
->SetIconLocation(szAppPath
, iconIndex
);
63 ATL::CComPtr
<IPropertyStore
> pps
;
64 hr
= psl
.QueryInterface(&pps
);
69 hr
= InitPropVariantFromString(pszTitle
, &propvar
);
72 hr
= pps
->SetValue(PKEY_Title
, propvar
);
76 hr
= psl
.QueryInterface(ppsl
);
79 PropVariantClear(&propvar
);
84 HRESULT
CreateSeparatorLink(IShellLink
**ppsl
)
86 ATL::CComPtr
<IPropertyStore
> pps
;
87 HRESULT hr
= pps
.CoCreateInstance(CLSID_ShellLink
, NULL
, CLSCTX_INPROC_SERVER
);
92 hr
= InitPropVariantFromBoolean(TRUE
, &propvar
);
96 hr
= pps
->SetValue(PKEY_AppUserModel_IsDestListSeparator
, propvar
);
101 hr
= pps
.QueryInterface(ppsl
);
104 PropVariantClear(&propvar
);
108 bool IsItemInArray(IShellItem
*psi
, IObjectArray
*poaRemoved
)
112 if (FAILED(poaRemoved
->GetCount(&cItems
)))
116 for (UINT i
= 0; !fRet
&& i
< cItems
; i
++) {
117 ATL::CComPtr
<IShellItem
> psiCompare
;
118 if (FAILED(poaRemoved
->GetAt(i
, IID_PPV_ARGS(&psiCompare
))))
121 fRet
= SUCCEEDED(psiCompare
->Compare(psi
, SICHINT_CANONICAL
, &iOrder
)) && (0 == iOrder
);
126 void DeleteJumpList(LPCTSTR appID
)
128 ATL::CComPtr
<ICustomDestinationList
> pcdl
;
129 HRESULT hr
= pcdl
.CoCreateInstance(CLSID_DestinationList
, NULL
, CLSCTX_INPROC_SERVER
);
131 hr
= pcdl
->DeleteList(appID
);