ReactOS 0.4.17-dev-684-ga6524ef
CCopyMoveToMenu.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS shell32
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: CopyTo and MoveTo implementation
5 * COPYRIGHT: Copyright 2020-2023 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
6 */
7
8#include "precomp.h"
9
11
12enum { IDC_ACTION = 0 };
13
15 m_fnOldWndProc(NULL),
16 m_bIgnoreTextBoxChange(FALSE)
17{
18}
19
20static BOOL
22{
24
25 if (ILIsEqual(pidl, pThis->m_pidlFolder))
26 return pThis->GetFileOp() == FO_COPY;
27
30 return _ILIsDesktop(pidl) || PathFileExistsW(szPath);
31}
32
33static LRESULT CALLBACK
35{
37 CCopyMoveToMenu *this_ =
39
40 switch (uMsg)
41 {
42 case WM_COMMAND:
43 {
44 switch (LOWORD(wParam))
45 {
47 {
48 if (HIWORD(wParam) == EN_CHANGE)
49 {
50 if (!this_->m_bIgnoreTextBoxChange)
51 {
52 // get the text
54 StrTrimW(szPath, L" \t");
55
56 // update OK button
58 SendMessageW(hwnd, BFFM_ENABLEOK, 0, bValid);
59
60 return 0;
61 }
62
63 // reset flag
65 }
66 break;
67 }
68 }
69 break;
70 }
71 }
72 return CallWindowProcW(this_->m_fnOldWndProc, hwnd, uMsg, wParam, lParam);
73}
74
75static INT CALLBACK
77{
78 CCopyMoveToMenu *this_ = reinterpret_cast<CCopyMoveToMenu*>(lpData);
79
80 switch (uMsg)
81 {
83 {
84 // Set caption
85 CString strCaption(MAKEINTRESOURCEW(this_->GetCaptionStringID()));
86 SetWindowTextW(hwnd, strCaption);
87
88 // Set OK button text
89 CString strCopyOrMove(MAKEINTRESOURCEW(this_->GetButtonStringID()));
90 SetDlgItemText(hwnd, IDOK, strCopyOrMove);
91
92 // Subclassing
93 // TODO: Replace this with BIF_VALIDATE
95 this_->m_fnOldWndProc =
96 reinterpret_cast<WNDPROC>(
98
99 // Expand "My Computer"
101 if (drivesPidl)
103
104 // Select initial directory
105 // TODO: Remember the last directory used by the user
107 if (pidl)
109
110 SendMessageW(hwnd, BFFM_ENABLEOK, 0, pidl && IsValidTarget(this_, pidl));
111 break;
112 }
113 case BFFM_SELCHANGED:
114 {
115 LPCITEMIDLIST pidl = reinterpret_cast<LPCITEMIDLIST>(lParam);
116 PostMessageW(hwnd, BFFM_ENABLEOK, 0, IsValidTarget(this_, pidl));
117
118 // the text box will be updated later soon, ignore it
120 break;
121 }
122 }
123
124 return FALSE;
125}
126
129{
130 // TODO: Use SH32_SimulateDropWithSite instead
131 CStringW strFiles;
133 for (UINT n = 0; n < pCIDA->cidl; ++n)
134 {
136 if (!pidlCombine)
137 return E_FAIL;
138
139 if (!SHGetPathFromIDListW(pidlCombine, szPath))
140 return E_FAIL;
141
142 if (n > 0)
143 strFiles += L'|';
144 strFiles += szPath;
145 }
146
147 strFiles += L'|'; // double null-terminated
148 strFiles.Replace(L'|', L'\0');
149
150 if (_ILIsDesktop(pidlDestination))
152 else
153 SHGetPathFromIDListW(pidlDestination, szPath);
154 INT cchPath = lstrlenW(szPath);
155 if (cchPath + 1 < MAX_PATH)
156 {
157 szPath[cchPath + 1] = 0; // double null-terminated
158 }
159 else
160 {
161 ERR("Too long path\n");
162 return E_FAIL;
163 }
164
165 SHFILEOPSTRUCTW op = { lpici->hwnd, GetFileOp(), strFiles, szPath };
166 op.fFlags = FOF_ALLOWUNDO;
167 int res = SHFileOperationW(&op);
168 if (res)
169 {
170 ERR("SHFileOperationW failed with 0x%x\n", res);
171 return E_FAIL;
172 }
173 return S_OK;
174}
175
176static HRESULT
177DoGetFileTitle(const CIDA *pCIDA, CStringW& strTitle)
178{
179 CComHeapPtr<ITEMIDLIST> pidlCombine(SHELL_CIDA_ILCloneFull(pCIDA, 0));
180 if (!pidlCombine)
181 return E_OUTOFMEMORY;
182
184 HRESULT hr = SHGetNameAndFlagsW(pidlCombine, SHGDN_INFOLDER, szPath, _countof(szPath), NULL);
185 strTitle = SUCCEEDED(hr) ? szPath : L"";
186 if (strTitle.IsEmpty())
187 return E_FAIL;
188
189 if (pCIDA->cidl > 1)
190 strTitle += L" ...";
191 return S_OK;
192}
193
195{
196 WCHAR wszPath[MAX_PATH];
197 TRACE("(%p)\n", lpici);
198
199 CDataObjectHIDA pCIDA(m_pDataObject);
200 HRESULT hr = pCIDA.hr();
202 {
203 ERR("Failed to get CIDA, %#x\n", hr);
204 return hr;
205 }
206
207 if (!SHGetPathFromIDListW(m_pidlFolder, wszPath))
208 {
209 ERR("SHGetPathFromIDListW failed\n");
210 return E_FAIL;
211 }
212
213 CStringW strFileTitle;
214 hr = DoGetFileTitle(pCIDA, strFileTitle);
215 if (FAILED(hr))
216 return hr;
217
218 CStringW strTitle;
219 strTitle.Format(GetActionTitleStringID(), static_cast<LPCWSTR>(strFileTitle));
220
221 BROWSEINFOW info = { lpici->hwnd };
222 info.pidlRoot = NULL;
223 info.lpszTitle = strTitle;
226 info.lParam = reinterpret_cast<LPARAM>(this);
228 if (pidl)
229 hr = DoRealFileOp(pCIDA, lpici, pidl);
230
231 return hr;
232}
233
234static BOOL
236{
237 BOOL bSuccess = FALSE;
238
239 while (iItem > 0)
240 {
241 bSuccess = GetMenuItemInfoW(hMenu, --iItem, TRUE, lpmii);
242 if (bSuccess || (!bSuccess && GetLastError() != ERROR_MENU_ITEM_NOT_FOUND))
243 break;
244 }
245
246 return bSuccess;
247}
248
251 UINT indexMenu,
252 UINT idCmdFirst,
253 UINT idCmdLast,
254 UINT uFlags)
255{
256 TRACE("CCopyToMenu::QueryContextMenu(%p, %u, %u, %u, %u)\n",
257 hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
258 return QueryContextMenuImpl(TRUE, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
259}
260
263 UINT indexMenu,
264 UINT idCmdFirst,
265 UINT idCmdLast,
266 UINT uFlags)
267{
268 TRACE("CMoveToMenu::QueryContextMenu(%p, %u, %u, %u, %u)\n",
269 hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
270 return QueryContextMenuImpl(FALSE, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
271}
272
274CCopyMoveToMenu::QueryContextMenuImpl(BOOL IsCopyOp, HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
275{
276 if (uFlags & (CMF_NOVERBS | CMF_VERBSONLY))
277 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 0);
278
279 UINT idHighest = 0;
280 CStringW strCopyTo(MAKEINTRESOURCEW(IDS_COPYTOMENU)), strMoveTo;
281 LPWSTR itemText = strCopyTo.GetBuffer();
282 if (!IsCopyOp)
283 {
284 strMoveTo.LoadString(IDS_MOVETOMENU);
285 itemText = strMoveTo.GetBuffer();
286 }
287
288 // Insert separator if necessary
289 WCHAR szBuff[128];
290 MENUITEMINFOW mii = { sizeof(mii), MIIM_TYPE };
291 mii.dwTypeData = szBuff;
292 mii.cch = _countof(szBuff);
293 if (GetPreviousMenuItemInfo(hMenu, indexMenu, &mii) &&
294 mii.fType != MFT_SEPARATOR &&
295 (IsCopyOp || !(mii.fType == MFT_STRING && !wcscmp(szBuff, strCopyTo.GetBuffer()))))
296 {
297 mii.fMask = MIIM_TYPE;
298 mii.fType = MFT_SEPARATOR;
299 mii.dwTypeData = NULL;
300 mii.cch = 0;
301 if (InsertMenuItemW(hMenu, indexMenu, TRUE, &mii))
302 {
303 ++indexMenu;
304 }
305 }
306
307 // Insert the menu item
308 mii.fMask = MIIM_ID | MIIM_TYPE;
309 mii.fType = MFT_STRING;
310 mii.dwTypeData = itemText;
311 mii.wID = idCmdFirst + IDC_ACTION;
312 if (InsertMenuItemW(hMenu, indexMenu, TRUE, &mii))
313 {
314 idHighest = max(idHighest, mii.wID);
315 ++indexMenu;
316 }
317 return idHighest >= idCmdFirst ? MAKE_HRESULT(SEVERITY_SUCCESS, 0, idHighest - idCmdFirst + 1) : E_FAIL;
318}
319
322{
323 HRESULT hr = E_FAIL;
324 TRACE("CCopyMoveToMenu::InvokeCommand(%p)\n", lpici);
325
326 if (IS_INTRESOURCE(lpici->lpVerb))
327 {
328 if (LOWORD(lpici->lpVerb) == IDC_ACTION)
329 hr = DoAction(lpici);
330 }
331 else
332 {
333 if (::lstrcmpiA(lpici->lpVerb, GetVerb()) == 0)
334 hr = DoAction(lpici);
335 }
336
337 return hr;
338}
339
342 UINT_PTR idCmd,
343 UINT uType,
344 UINT *pwReserved,
345 LPSTR pszName,
346 UINT cchMax)
347{
348#if 1 // Windows does not implement any of these but we will continue to do so as long as we (incorrectly) show them in the context menu
349 if ((uType | GCS_UNICODE) == GCS_VALIDATEW)
350 return idCmd == IDC_ACTION ? S_OK : S_FALSE;
351
352 if (uType == GCS_VERBW && idCmd == IDC_ACTION)
353 return SHAnsiToUnicode(GetVerb(), (LPWSTR)pszName, cchMax);
354#endif
355 return E_NOTIMPL;
356}
357
360{
361 TRACE("This %p uMsg %x\n", this, uMsg);
362 return E_NOTIMPL;
363}
364
367{
368 m_pDataObject = pdtobj;
369 HRESULT hr = E_FAIL;
370 if (pidlFolder)
371 {
372 hr = SHILClone(pidlFolder, const_cast<PIDLIST_ABSOLUTE*>(&pidlFolder));
373 }
374 else
375 {
376 pidlFolder = SHELL_DataObject_ILCloneFullItem(pdtobj, 0);
377 if (pidlFolder)
378 {
379 ILRemoveLastID(const_cast<PIDLIST_ABSOLUTE>(pidlFolder));
380 hr = S_OK;
381 }
382 }
383
384 if (SUCCEEDED(hr))
385 m_pidlFolder.Attach(const_cast<PIDLIST_ABSOLUTE>(pidlFolder));
386 return hr;
387}
388
391{
392 m_pSite = pUnkSite;
393 return S_OK;
394}
395
398{
399 if (!m_pSite)
400 return E_FAIL;
401
402 return m_pSite->QueryInterface(riid, ppvSite);
403}
404
407 IShellFolder *pSF, UINT cidl, PCUITEMID_CHILD_ARRAY pidls)
408{
409 SFGAOF attr = SFGAO_CANCOPY | SFGAO_CANMOVE;
410 HRESULT hr = pSF->GetAttributesOf(cidl, pidls, &attr);
412 return hr;
413 if (!(attr & (Copy ? SFGAO_CANCOPY : SFGAO_CANMOVE)))
414 return E_INVALIDARG;
415
417 hr = pSF->GetUIObjectOf(hWnd, cidl, pidls, IID_NULL_PPV_ARG(IDataObject, &pDO));
419 return hr;
420
421 REFCLSID clsid = Copy ? CLSID_CopyToMenu : CLSID_MoveToMenu;
425 return hr;
426 IUnknown_SetSite(pCM, pSite);
427
428 CMINVOKECOMMANDINFO ici = { sizeof(ici), 0, hWnd, MAKEINTRESOURCEA(IDC_ACTION), NULL, NULL, SW_SHOW };
429 return pCM->InvokeCommand(&ici);
430}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
static BOOL GetPreviousMenuItemInfo(HMENU hMenu, UINT iItem, LPMENUITEMINFOW lpmii)
static HRESULT DoGetFileTitle(const CIDA *pCIDA, CStringW &strTitle)
static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
@ IDC_ACTION
static INT CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
static BOOL IsValidTarget(CCopyMoveToMenu *pThis, LPCITEMIDLIST pidl)
UINT cchMax
HWND hWnd
Definition: settings.c:17
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
#define IDC_ACTION
Definition: resource.h:44
#define ERR(fmt,...)
Definition: precomp.h:57
#define STDMETHODIMP
Definition: basetyps.h:43
bool IsEmpty() const noexcept
Definition: atlsimpstr.h:394
int Replace(PCXSTR pszOld, PCXSTR pszNew)
Definition: cstringt.h:886
BOOL LoadString(_In_ UINT nID)
Definition: cstringt.h:639
void __cdecl Format(UINT nFormatID,...)
Definition: cstringt.h:818
STDMETHODIMP QueryContextMenuImpl(BOOL IsCopyOp, HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
HRESULT DoAction(LPCMINVOKECOMMANDINFO lpici)
virtual UINT GetCaptionStringID() const =0
CComHeapPtr< ITEMIDLIST > m_pidlFolder
static HRESULT DoCopyMoveToFolder(BOOL Copy, HWND hWnd, IUnknown *pSite, IShellFolder *pSF, UINT cidl, PCUITEMID_CHILD_ARRAY pidls)
HRESULT DoRealFileOp(const CIDA *pCIDA, LPCMINVOKECOMMANDINFO lpici, PCUIDLIST_ABSOLUTE pidlDestination)
virtual UINT GetActionTitleStringID() const =0
virtual UINT GetButtonStringID() const =0
STDMETHODIMP GetSite(REFIID riid, void **ppvSite) override
STDMETHODIMP Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID) override
STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi) override
virtual UINT GetFileOp() const =0
STDMETHODIMP GetCommandString(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen) override
CComPtr< IDataObject > m_pDataObject
STDMETHODIMP SetSite(IUnknown *pUnkSite) override
STDMETHODIMP HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam) override
CComPtr< IUnknown > m_pSite
virtual LPCSTR GetVerb() const =0
WNDPROC m_fnOldWndProc
STDMETHODIMP QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) override
STDMETHODIMP QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) override
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#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 NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
UINT op
Definition: effect.c:236
UINT uFlags
Definition: api.c:59
#define MAX_PATH
Definition: compat.h:34
#define CALLBACK
Definition: compat.h:35
#define lstrlenW
Definition: compat.h:750
int WINAPI lstrcmpiA(LPCSTR str1, LPCSTR str2)
Definition: locale.c:4133
#define IS_INTRESOURCE(x)
Definition: loader.c:613
BOOL WINAPI PathFileExistsW(const WCHAR *path)
Definition: path.c:2583
BOOL WINAPI StrTrimW(WCHAR *str, const WCHAR *trim)
Definition: string.c:804
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1977
DWORD WINAPI SHAnsiToUnicode(const char *src, WCHAR *dest, int dest_len)
Definition: main.c:1801
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
Definition: main.c:222
PIDLIST_ABSOLUTE SHELL_CIDA_ILCloneFull(_In_ const CIDA *pCIDA, _In_ UINT Index)
HRESULT SHGetNameAndFlagsW(_In_ LPCITEMIDLIST pidl, _In_ DWORD dwFlags, _Out_opt_ LPWSTR pszText, _In_ UINT cchBuf, _Inout_opt_ DWORD *pdwAttributes)
Definition: utils.cpp:551
PIDLIST_ABSOLUTE SHELL_DataObject_ILCloneFullItem(_In_ IDataObject *pDO, _In_ UINT Index)
BOOL WINAPI SHGetSpecialFolderPathW(HWND hwndOwner, LPWSTR szPath, int nFolder, BOOL bCreate)
Definition: shellpath.c:3220
BOOL WINAPI PathIsDirectoryW(LPCWSTR lpszPath)
Definition: path.c:669
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:33
VOID Copy(PVOID Src, PVOID Dst, ULONG NumBytes)
Definition: mmixer.c:126
#define MAKE_HRESULT(sev, fac, code)
Definition: dmerror.h:29
#define L(x)
Definition: resources.c:13
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
Definition: ebrowser.c:83
unsigned int BOOL
Definition: ntddk_ex.h:94
GLdouble n
Definition: glext.h:7729
GLuint res
Definition: glext.h:9613
unsigned int UINT
Definition: sysinfo.c:13
REFIID riid
Definition: atlbase.h:39
HRESULT GetUIObjectOf([in] HWND hwndOwner, [in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in] REFIID riid, [in, out, unique] UINT *prgfInOut, [out, iid_is(riid)] void **ppvOut)
HRESULT GetAttributesOf([in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in, out] SFGAOF *rgfInOut)
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
LONG_PTR LPARAM
Definition: minwindef.h:175
LONG_PTR LRESULT
Definition: minwindef.h:176
UINT_PTR WPARAM
Definition: minwindef.h:174
LPCWSTR szPath
Definition: env.c:37
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
const CLSID * clsid
Definition: msctf.cpp:50
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
static INT CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
Definition: wizard.c:583
#define UNICODE_NULL
#define LOWORD(l)
Definition: pedump.c:82
short WCHAR
Definition: pedump.c:58
LPITEMIDLIST WINAPI SHCloneSpecialIDList(HWND hwndOwner, int nFolder, BOOL fCreate)
Definition: pidl.c:446
BOOL WINAPI ILRemoveLastID(LPITEMIDLIST pidl)
Definition: pidl.c:222
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1496
BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:583
#define REFIID
Definition: guiddef.h:118
#define REFCLSID
Definition: guiddef.h:117
#define PathIsRelative
Definition: shlwapi.h:483
#define FOF_ALLOWUNDO
Definition: shellapi.h:147
#define FO_COPY
Definition: shellapi.h:137
int WINAPI SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp)
Definition: shlfileop.cpp:2200
#define CSIDL_DESKTOPDIRECTORY
Definition: shlobj.h:2206
#define BFFM_SELCHANGED
Definition: shlobj.h:1253
#define BIF_RETURNONLYFSDIRS
Definition: shlobj.h:1233
#define CSIDL_PERSONAL
Definition: shlobj.h:2196
#define BFFM_SETEXPANDED
Definition: shlobj.h:1265
#define BFFM_ENABLEOK
Definition: shlobj.h:1260
#define BFFM_SETSELECTION
Definition: shlobj.h:1272
#define BIF_USENEWUI
Definition: shlobj.h:1240
#define SHBrowseForFolder
Definition: shlobj.h:1269
#define BFFM_INITIALIZED
Definition: shlobj.h:1252
#define CSIDL_DRIVES
Definition: shlobj.h:2207
#define IDC_BROWSE_FOR_FOLDER_FOLDER_TEXT
Definition: shresdef.h:478
#define IDS_MOVETOMENU
Definition: shresdef.h:379
#define IDS_COPYTOMENU
Definition: shresdef.h:375
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
const ITEMIDLIST_ABSOLUTE UNALIGNED * PCUIDLIST_ABSOLUTE
Definition: shtypes.idl:63
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
#define _countof(array)
Definition: sndvol32.h:70
#define TRACE(s)
Definition: solgame.cpp:4
Definition: shlobj.h:582
UINT cidl
Definition: shlobj.h:582
Definition: cookie.c:202
LPWSTR dwTypeData
Definition: winuser.h:3377
#define max(a, b)
Definition: svc.c:63
#define GetWindowLongPtr
Definition: treelist.c:73
#define SetWindowLongPtr
Definition: treelist.c:70
#define GWLP_WNDPROC
Definition: treelist.c:66
#define GWLP_USERDATA
Definition: treelist.c:63
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint16_t * LPWSTR
Definition: typedefs.h:56
char * LPSTR
Definition: typedefs.h:51
int32_t INT
Definition: typedefs.h:58
#define HIWORD(l)
Definition: typedefs.h:247
EXTERN_C HRESULT SHELL_InitializeExtension(REFCLSID clsid, PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pDO, HKEY hkeyProgID, REFIID riid, void **ppv)
Definition: propsheet.cpp:26
UINT WINAPI GetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPWSTR lpString, int nMaxCount)
Definition: dialog.c:2283
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define S_FALSE
Definition: winerror.h:3451
#define ERROR_MENU_ITEM_NOT_FOUND
Definition: winerror.h:1282
#define SEVERITY_SUCCESS
Definition: winerror.h:177
#define MIIM_ID
Definition: winuser.h:733
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WM_COMMAND
Definition: winuser.h:1768
#define MFT_SEPARATOR
Definition: winuser.h:755
#define IDOK
Definition: winuser.h:841
BOOL WINAPI SetWindowTextW(_In_ HWND, _In_opt_ LPCWSTR)
#define MAKEINTRESOURCEA(i)
Definition: winuser.h:581
BOOL WINAPI GetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _Inout_ LPMENUITEMINFOW)
#define MFT_STRING
Definition: winuser.h:757
#define SW_SHOW
Definition: winuser.h:786
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
LRESULT(CALLBACK * WNDPROC)(HWND, UINT, WPARAM, LPARAM)
Definition: winuser.h:3014
LRESULT WINAPI CallWindowProcW(_In_ WNDPROC, _In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define SetDlgItemText
Definition: winuser.h:6015
#define MIIM_TYPE
Definition: winuser.h:736
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI InsertMenuItemW(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOW)
#define EN_CHANGE
Definition: winuser.h:2051
#define IID_PPV_ARG(Itype, ppType)
#define IID_NULL_PPV_ARG(Itype, ppType)