ReactOS  0.4.15-dev-489-g75a0787
createlink.c File Reference
#include "appwiz.h"
#include <commctrl.h>
#include <shellapi.h>
#include <strsafe.h>
Include dependency graph for createlink.c:

Go to the source code of this file.

Functions

BOOL IsShortcut (HKEY hKey)
 
BOOL IsExtensionAShortcut (LPWSTR lpExtension)
 
BOOL CreateShortcut (PCREATE_LINK_CONTEXT pContext)
 
BOOL CreateInternetShortcut (PCREATE_LINK_CONTEXT pContext)
 
BOOL IsInternetLocation (LPCWSTR pszLocation)
 
void DoConvertNameForFileSystem (LPWSTR szName)
 
BOOL DoValidateShortcutName (PCREATE_LINK_CONTEXT pContext)
 
INT_PTR CALLBACK WelcomeDlgProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
INT_PTR CALLBACK FinishDlgProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
static int CALLBACK PropSheetProc (HWND hwndDlg, UINT uMsg, LPARAM lParam)
 
LONG CALLBACK ShowCreateShortcutWizard (HWND hwndCPl, LPCWSTR szPath)
 
LONG CALLBACK NewLinkHereW (HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
 
LONG CALLBACK NewLinkHereA (HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
 

Function Documentation

◆ CreateInternetShortcut()

BOOL CreateInternetShortcut ( PCREATE_LINK_CONTEXT  pContext)

Definition at line 146 of file createlink.c.

147 {
148  IUniformResourceLocatorW *pURL = NULL;
149  IPersistFile *pPersistFile = NULL;
150  HRESULT hr;
153 
154  hr = CoCreateInstance(&CLSID_InternetShortcut, NULL, CLSCTX_ALL,
155  &IID_IUniformResourceLocatorW, (void **)&pURL);
156  if (FAILED(hr))
157  return FALSE;
158 
159  hr = IUnknown_QueryInterface(pURL, &IID_IPersistFile, (void **)&pPersistFile);
160  if (FAILED(hr))
161  {
162  IUnknown_Release(pURL);
163  return FALSE;
164  }
165 
166  pURL->lpVtbl->SetURL(pURL, pContext->szTarget, 0);
167 
168  hr = pPersistFile->lpVtbl->Save(pPersistFile, szPath, TRUE);
169 
170  IUnknown_Release(pPersistFile);
171  IUnknown_Release(pURL);
172 
173  return SUCCEEDED(hr);
174 }
#define TRUE
Definition: types.h:120
HRESULT hr
Definition: shlfolder.c:183
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
Definition: path.c:1105
HRESULT Save([in, unique] LPCOLESTR pszFileName, [in] BOOL fRemember)
smooth NULL
Definition: ftsmooth.c:416
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:78
#define _countof(array)
Definition: sndvol32.h:68
#define MAX_PATH
Definition: compat.h:26
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
LPCWSTR szPath
Definition: env.c:35
const GUID IID_IPersistFile
#define SUCCEEDED(hr)
Definition: intsafe.h:57

Referenced by FinishDlgProc().

◆ CreateShortcut()

BOOL CreateShortcut ( PCREATE_LINK_CONTEXT  pContext)

Definition at line 75 of file createlink.c.

76 {
77  IShellLinkW *pShellLink, *pSourceShellLink;
78  IPersistFile *pPersistFile;
79  HRESULT hr;
82 
83  /* get the extension */
85 
87  {
88  hr = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_ALL, &IID_IShellLinkW, (void**)&pSourceShellLink);
89 
90  if (FAILED(hr))
91  return FALSE;
92 
93  hr = IUnknown_QueryInterface(pSourceShellLink, &IID_IPersistFile, (void**)&pPersistFile);
94  if (FAILED(hr))
95  {
96  IUnknown_Release(pSourceShellLink);
97  return FALSE;
98  }
99 
100  hr = pPersistFile->lpVtbl->Load(pPersistFile, (LPCOLESTR)pContext->szTarget, STGM_READ);
101  IUnknown_Release(pPersistFile);
102 
103  if (FAILED(hr))
104  {
105  IUnknown_Release(pSourceShellLink);
106  return FALSE;
107  }
108 
109  hr = IShellLinkW_GetPath(pSourceShellLink, Path, _countof(Path), NULL, 0);
110  IUnknown_Release(pSourceShellLink);
111 
112  if (FAILED(hr))
113  {
114  return FALSE;
115  }
116  }
117  else
118  {
119  StringCchCopyW(Path, _countof(Path), pContext->szTarget);
120  }
121 
122  hr = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_ALL,
123  &IID_IShellLinkW, (void**)&pShellLink);
124 
125  if (hr != S_OK)
126  return FALSE;
127 
128  pShellLink->lpVtbl->SetPath(pShellLink, Path);
129  pShellLink->lpVtbl->SetDescription(pShellLink, pContext->szDescription);
130  pShellLink->lpVtbl->SetWorkingDirectory(pShellLink, pContext->szWorkingDirectory);
131 
132  hr = IUnknown_QueryInterface(pShellLink, &IID_IPersistFile, (void**)&pPersistFile);
133  if (hr != S_OK)
134  {
135  IUnknown_Release(pShellLink);
136  return FALSE;
137  }
138 
139  hr = pPersistFile->lpVtbl->Save(pPersistFile, pContext->szLinkName, TRUE);
140  IUnknown_Release(pPersistFile);
141  IUnknown_Release(pShellLink);
142  return (hr == S_OK);
143 }
#define TRUE
Definition: types.h:120
HRESULT hr
Definition: shlfolder.c:183
HRESULT Save([in, unique] LPCOLESTR pszFileName, [in] BOOL fRemember)
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
smooth NULL
Definition: ftsmooth.c:416
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
Definition: path.c:442
#define STGM_READ
Definition: objbase.h:916
HRESULT SetWorkingDirectory([in] LPCWSTR pszDir)
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:78
#define _countof(array)
Definition: sndvol32.h:68
#define MAX_PATH
Definition: compat.h:26
HRESULT SetDescription([in] LPCWSTR pszName)
_In_ LPCSTR _In_opt_ LPCSTR lpExtension
Definition: winbase.h:3034
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
#define S_OK
Definition: intsafe.h:59
PRTL_UNICODE_STRING_BUFFER Path
HRESULT SetPath([in] LPCWSTR pszFile)
HRESULT Load([in] LPCOLESTR pszFileName, [in] DWORD dwMode)
const GUID IID_IPersistFile
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by FinishDlgProc().

◆ DoConvertNameForFileSystem()

void DoConvertNameForFileSystem ( LPWSTR  szName)

Definition at line 183 of file createlink.c.

184 {
185  LPWSTR pch1, pch2;
186  for (pch1 = pch2 = szName; *pch1; ++pch1)
187  {
188  if (wcschr(L"\\/:*?\"<>|", *pch1) != NULL)
189  {
190  /* *pch1 is an invalid character */
191  continue;
192  }
193  *pch2 = *pch1;
194  ++pch2;
195  }
196  *pch2 = 0;
197 }
smooth NULL
Definition: ftsmooth.c:416
_CONST_RETURN wchar_t *__cdecl wcschr(_In_z_ const wchar_t *_Str, wchar_t _Ch)
static const WCHAR L[]
Definition: oid.c:1250
static const WCHAR szName[]
Definition: msipriv.h:1194
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by FinishDlgProc().

◆ DoValidateShortcutName()

BOOL DoValidateShortcutName ( PCREATE_LINK_CONTEXT  pContext)

Definition at line 200 of file createlink.c.

201 {
202  SIZE_T cch;
203  LPCWSTR pch, pszName = pContext->szDescription;
204 
205  if (!pszName || !pszName[0])
206  return FALSE;
207 
208  cch = wcslen(pContext->szOrigin) + wcslen(pszName) + 1;
209  if (cch >= MAX_PATH)
210  return FALSE;
211 
212  pch = pszName;
213  for (pch = pszName; *pch; ++pch)
214  {
215  if (wcschr(L"\\/:*?\"<>|", *pch) != NULL)
216  {
217  /* *pch is an invalid character */
218  return FALSE;
219  }
220  }
221 
222  return TRUE;
223 }
#define TRUE
Definition: types.h:120
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
#define pch(ap)
Definition: match.c:418
static DWORD DWORD void LPSTR DWORD cch
Definition: str.c:201
smooth NULL
Definition: ftsmooth.c:416
_CONST_RETURN wchar_t *__cdecl wcschr(_In_z_ const wchar_t *_Str, wchar_t _Ch)
#define MAX_PATH
Definition: compat.h:26
static const WCHAR L[]
Definition: oid.c:1250
ULONG_PTR SIZE_T
Definition: typedefs.h:79
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)

Referenced by FinishDlgProc().

◆ FinishDlgProc()

INT_PTR CALLBACK FinishDlgProc ( HWND  hwndDlg,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 363 of file createlink.c.

367 {
368  LPPROPSHEETPAGEW ppsp;
369  PCREATE_LINK_CONTEXT pContext;
370  LPPSHNOTIFY lppsn;
371  LPWSTR pch;
373  WCHAR szMessage[128];
374 
375  switch(uMsg)
376  {
377  case WM_INITDIALOG:
378  ppsp = (LPPROPSHEETPAGEW)lParam;
379  pContext = (PCREATE_LINK_CONTEXT) ppsp->lParam;
380  SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pContext);
382  break;
383  case WM_COMMAND:
384  switch(HIWORD(wParam))
385  {
386  case EN_CHANGE:
388  {
390  StrTrimW(szText, L" \t");
391  if (szText[0])
393  else
395  }
396  else
397  {
399  }
400  break;
401  }
402  break;
403  case WM_NOTIFY:
404  lppsn = (LPPSHNOTIFY) lParam;
405  pContext = (PCREATE_LINK_CONTEXT) GetWindowLongPtr(hwndDlg, DWLP_USER);
406  if (lppsn->hdr.code == PSN_SETACTIVE)
407  {
408  /* TODO: Use shell32!PathCleanupSpec instead of DoConvertNameForFileSystem */
410  SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_NAME, pContext->szDescription);
413  }
414  else if (lppsn->hdr.code == PSN_WIZFINISH)
415  {
416  GetDlgItemTextW(hwndDlg, IDC_SHORTCUT_NAME, pContext->szDescription, _countof(pContext->szDescription));
417  StrTrimW(pContext->szDescription, L" \t");
418 
419  if (!DoValidateShortcutName(pContext))
420  {
422 
423  LoadStringW(hApplet, IDS_INVALID_NAME, szMessage, _countof(szMessage));
424  MessageBoxW(hwndDlg, szMessage, NULL, MB_ICONERROR);
425 
426  /* prevent the wizard to go next */
427  SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, -1);
428  return TRUE;
429  }
430 
431  /* if old shortcut file exists, then delete it now */
432  DeleteFileW(pContext->szOldFile);
434 
435  if (IsInternetLocation(pContext->szTarget))
436  {
437  /* internet */
438  StringCchCopyW(pContext->szLinkName, _countof(pContext->szLinkName),
439  pContext->szOrigin);
440  PathAppendW(pContext->szLinkName, pContext->szDescription);
441 
442  /* change extension if any */
443  pch = PathFindExtensionW(pContext->szLinkName);
444  if (pch && *pch)
445  *pch = 0;
446  StringCchCatW(pContext->szLinkName, _countof(pContext->szLinkName), L".url");
447 
448  if (!CreateInternetShortcut(pContext))
449  {
450  LoadStringW(hApplet, IDS_CANTMAKEINETSHORTCUT, szMessage, _countof(szMessage));
451  MessageBoxW(hwndDlg, szMessage, NULL, MB_ICONERROR);
452  }
453  }
454  else
455  {
456  /* file */
457  StringCchCopyW(pContext->szLinkName, _countof(pContext->szLinkName),
458  pContext->szOrigin);
459  PathAppendW(pContext->szLinkName, pContext->szDescription);
460 
461  /* change extension if any */
462  pch = PathFindExtensionW(pContext->szLinkName);
463  if (pch && *pch)
464  *pch = 0;
465  StringCchCatW(pContext->szLinkName, _countof(pContext->szLinkName), L".lnk");
466 
467  if (!CreateShortcut(pContext))
468  {
469  WCHAR szMessage[128];
470  LoadStringW(hApplet, IDS_CANTMAKESHORTCUT, szMessage, _countof(szMessage));
471  MessageBoxW(hwndDlg, szMessage, NULL, MB_ICONERROR);
472  }
473  }
474  }
475  else if (lppsn->hdr.code == PSN_RESET && !lppsn->lParam)
476  {
477  /* The user has clicked [Cancel] */
478  DeleteFileW(pContext->szOldFile);
480  }
481  break;
482  }
483  return FALSE;
484 }
#define WM_GETTEXTLENGTH
Definition: winuser.h:1601
UINT WINAPI GetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPWSTR lpString, int nMaxCount)
Definition: dialog.c:2271
#define TRUE
Definition: types.h:120
struct _PSHNOTIFY * LPPSHNOTIFY
HWND WINAPI SetFocus(_In_opt_ HWND)
HINSTANCE hApplet
Definition: access.c:17
#define SendDlgItemMessage
Definition: winuser.h:5817
#define PSN_SETACTIVE
Definition: prsht.h:115
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define SetWindowLongPtr
Definition: treelist.c:70
WPARAM wParam
Definition: combotst.c:138
#define pch(ap)
Definition: match.c:418
#define DWLP_MSGRESULT
Definition: winuser.h:864
BOOL WINAPI PathAppendW(LPWSTR lpszPath, LPCWSTR lpszAppend)
Definition: path.c:121
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:325
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
UINT code
Definition: winuser.h:3134
#define IDS_CANTMAKESHORTCUT
Definition: resource.h:27
NMHDR hdr
Definition: prsht.h:330
#define PSN_WIZFINISH
Definition: prsht.h:122
static const WCHAR szText[]
Definition: dialog.c:139
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
smooth NULL
Definition: ftsmooth.c:416
struct _PROPSHEETPAGEW * LPPROPSHEETPAGEW
#define PropSheet_SetWizButtons(d, f)
Definition: prsht.h:357
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
Definition: path.c:442
#define IDS_CANTMAKEINETSHORTCUT
Definition: resource.h:26
#define PSWIZB_FINISH
Definition: prsht.h:155
int WINAPI MessageBoxW(_In_opt_ HWND, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_ UINT)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define PSWIZB_BACK
Definition: prsht.h:153
#define _countof(array)
Definition: sndvol32.h:68
#define MAX_PATH
Definition: compat.h:26
#define IDC_SHORTCUT_NAME
Definition: resource.h:41
#define EM_SETSEL
Definition: winuser.h:2000
LRESULT WINAPI SendDlgItemMessageW(_In_ HWND, _In_ int, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define IDS_INVALID_NAME
Definition: resource.h:31
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
static const WCHAR L[]
Definition: oid.c:1250
LPARAM lParam
Definition: prsht.h:227
#define DWLP_USER
Definition: winuser.h:866
#define MB_ICONERROR
Definition: winuser.h:781
#define WM_COMMAND
Definition: winuser.h:1722
#define SHCNF_PATHW
Definition: shlobj.h:1764
struct CREATE_LINK_CONTEXT * PCREATE_LINK_CONTEXT
HWND WINAPI GetParent(_In_ HWND)
#define PSN_RESET
Definition: prsht.h:118
#define SHCNE_DELETE
Definition: shlobj.h:1731
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
BOOL WINAPI StrTrimW(LPWSTR lpszStr, LPCWSTR lpszTrim)
Definition: string.c:1869
#define HIWORD(l)
Definition: typedefs.h:246
#define GetWindowLongPtr
Definition: treelist.c:73
WCHAR * LPWSTR
Definition: xmlstorage.h:184
LPARAM lParam
Definition: prsht.h:331
#define WM_INITDIALOG
Definition: winuser.h:1721
LPARAM lParam
Definition: combotst.c:139
#define WM_NOTIFY
Definition: richedit.h:61
#define EN_CHANGE
Definition: winuser.h:2004

Referenced by ShowCreateShortcutWizard().

◆ IsExtensionAShortcut()

BOOL IsExtensionAShortcut ( LPWSTR  lpExtension)

Definition at line 36 of file createlink.c.

37 {
38  HKEY hKey;
39  WCHAR Buffer[100];
40  DWORD Size;
41  DWORD Type;
42 
44  return FALSE;
45 
46  if (IsShortcut(hKey))
47  {
48  RegCloseKey(hKey);
49  return TRUE;
50  }
51 
52  Size = sizeof(Buffer);
54  {
55  RegCloseKey(hKey);
56  return FALSE;
57  }
58 
59  RegCloseKey(hKey);
60 
62  return FALSE;
63 
64  if (IsShortcut(hKey))
65  {
66  RegCloseKey(hKey);
67  return TRUE;
68  }
69 
70  RegCloseKey(hKey);
71  return FALSE;
72 }
#define RegQueryValueEx
Definition: winreg.h:524
#define TRUE
Definition: types.h:120
Type
Definition: Type.h:6
#define ERROR_SUCCESS
Definition: deptool.c:10
#define KEY_READ
Definition: nt_native.h:1023
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
unsigned char * LPBYTE
Definition: typedefs.h:53
smooth NULL
Definition: ftsmooth.c:416
Definition: bufpool.h:45
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned long DWORD
Definition: ntddk_ex.h:95
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:361
_In_ LPCSTR _In_opt_ LPCSTR lpExtension
Definition: winbase.h:3034
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3366
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
#define REG_SZ
Definition: layer.c:22

Referenced by CreateShortcut().

◆ IsInternetLocation()

BOOL IsInternetLocation ( LPCWSTR  pszLocation)

Definition at line 176 of file createlink.c.

177 {
178  return (PathIsURLW(pszLocation) || wcsstr(pszLocation, L"www.") == pszLocation);
179 }
_CONST_RETURN wchar_t *__cdecl wcsstr(_In_z_ const wchar_t *_Str, _In_z_ const wchar_t *_SubStr)
BOOL WINAPI PathIsURLW(LPCWSTR lpstrPath)
Definition: url.c:2432
static const WCHAR L[]
Definition: oid.c:1250

Referenced by FinishDlgProc(), and WelcomeDlgProc().

◆ IsShortcut()

BOOL IsShortcut ( HKEY  hKey)

Definition at line 19 of file createlink.c.

20 {
21  WCHAR Value[10];
22  DWORD Size;
23  DWORD Type;
24 
25  Size = sizeof(Value);
26  if (RegQueryValueExW(hKey, L"IsShortcut", NULL, &Type, (LPBYTE)Value, &Size) != ERROR_SUCCESS)
27  return FALSE;
28 
29  if (Type != REG_SZ)
30  return FALSE;
31 
32  return (wcsicmp(Value, L"yes") == 0);
33 }
Type
Definition: Type.h:6
#define ERROR_SUCCESS
Definition: deptool.c:10
IN UCHAR Value
Definition: halp.h:394
unsigned char * LPBYTE
Definition: typedefs.h:53
smooth NULL
Definition: ftsmooth.c:416
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4116
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned long DWORD
Definition: ntddk_ex.h:95
static const WCHAR L[]
Definition: oid.c:1250
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:361
#define wcsicmp
Definition: string.h:1152
#define REG_SZ
Definition: layer.c:22

Referenced by IsExtensionAShortcut().

◆ NewLinkHereA()

LONG CALLBACK NewLinkHereA ( HWND  hwndCPl,
UINT  uMsg,
LPARAM  lParam1,
LPARAM  lParam2 
)

Definition at line 616 of file createlink.c.

617 {
618  WCHAR szFile[MAX_PATH];
619 
620  if (MultiByteToWideChar(CP_ACP, 0, (LPSTR)lParam1, -1, szFile, _countof(szFile)))
621  {
623  return ShowCreateShortcutWizard(hwndCPl, szFile);
624  }
625  return -1;
626 }
#define CP_ACP
Definition: compat.h:99
char * LPSTR
Definition: xmlstorage.h:182
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define _countof(array)
Definition: sndvol32.h:68
#define MAX_PATH
Definition: compat.h:26
#define MultiByteToWideChar
Definition: compat.h:100
VOID WINAPI InitCommonControls(void)
Definition: commctrl.c:863

◆ NewLinkHereW()

LONG CALLBACK NewLinkHereW ( HWND  hwndCPl,
UINT  uMsg,
LPARAM  lParam1,
LPARAM  lParam2 
)

Definition at line 608 of file createlink.c.

609 {
611  return ShowCreateShortcutWizard(hwndCPl, (LPWSTR)lParam1);
612 }
VOID WINAPI InitCommonControls(void)
Definition: commctrl.c:863
WCHAR * LPWSTR
Definition: xmlstorage.h:184

◆ PropSheetProc()

static int CALLBACK PropSheetProc ( HWND  hwndDlg,
UINT  uMsg,
LPARAM  lParam 
)
static

Definition at line 487 of file createlink.c.

488 {
489  // NOTE: This callback is needed to set large icon correctly.
490  HICON hIcon;
491  switch (uMsg)
492  {
493  case PSCB_INITIALIZED:
494  {
496  SendMessageW(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
497  break;
498  }
499  }
500  return 0;
501 }
static HICON
Definition: imagelist.c:84
HINSTANCE hApplet
Definition: access.c:17
LONG_PTR LPARAM
Definition: windef.h:208
#define PSCB_INITIALIZED
Definition: prsht.h:75
HICON hIcon
Definition: msconfig.c:44
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
HICON WINAPI LoadIconW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2044
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define IDI_APPINETICO
Definition: resource.h:9
#define ICON_BIG
Definition: tnclass.cpp:51

Referenced by ShowCreateShortcutWizard().

◆ ShowCreateShortcutWizard()

LONG CALLBACK ShowCreateShortcutWizard ( HWND  hwndCPl,
LPCWSTR  szPath 
)

Definition at line 504 of file createlink.c.

505 {
506  PROPSHEETHEADERW psh;
507  HPROPSHEETPAGE ahpsp[2];
508  PROPSHEETPAGE psp;
509  UINT nPages = 0;
510  UINT nLength;
511  PCREATE_LINK_CONTEXT pContext;
512  WCHAR szMessage[128];
513  LPWSTR pch;
514 
515  pContext = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*pContext));
516  if (!pContext)
517  {
518  /* no memory */
519  LoadStringW(hApplet, IDS_NO_MEMORY, szMessage, _countof(szMessage));
520  MessageBoxW(hwndCPl, szMessage, NULL, MB_ICONERROR);
521  return FALSE;
522  }
523 
524  nLength = wcslen(szPath);
525  if (!nLength)
526  {
527  HeapFree(GetProcessHeap(), 0, pContext);
528 
529  /* no directory given */
530  LoadStringW(hApplet, IDS_NO_DIRECTORY, szMessage, _countof(szMessage));
531  MessageBoxW(hwndCPl, szMessage, NULL, MB_ICONERROR);
532  return FALSE;
533  }
534 
535  if (!PathFileExistsW(szPath))
536  {
537  HeapFree(GetProcessHeap(), 0, pContext);
538 
539  /* invalid path */
540  LoadStringW(hApplet, IDS_INVALID_PATH, szMessage, _countof(szMessage));
541  MessageBoxW(hwndCPl, szMessage, NULL, MB_ICONERROR);
542  return FALSE;
543  }
544 
545  /* build the pContext->szOrigin and pContext->szOldFile */
547  {
548  StringCchCopyW(pContext->szOrigin, _countof(pContext->szOrigin), szPath);
549  pContext->szOldFile[0] = 0;
550  }
551  else
552  {
553  StringCchCopyW(pContext->szOrigin, _countof(pContext->szOrigin), szPath);
554  pch = PathFindFileNameW(pContext->szOrigin);
555  if (pch && *pch)
556  *pch = 0;
557 
558  StringCchCopyW(pContext->szOldFile, _countof(pContext->szOldFile), szPath);
559 
561  if (pch && *pch)
562  {
563  /* build szDescription */
564  StringCchCopyW(pContext->szDescription, _countof(pContext->szDescription), pch);
565  *pch = 0;
566 
567  pch = PathFindExtensionW(pContext->szDescription);
568  *pch = 0;
569  }
570  }
571  PathAddBackslashW(pContext->szOrigin);
572 
573  /* Create the Welcome page */
574  psp.dwSize = sizeof(PROPSHEETPAGE);
575  psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER;
576  psp.hInstance = hApplet;
577  psp.pfnDlgProc = WelcomeDlgProc;
578  psp.pszTemplate = MAKEINTRESOURCEW(IDD_SHORTCUT_LOCATION);
579  psp.lParam = (LPARAM)pContext;
580  ahpsp[nPages++] = CreatePropertySheetPage(&psp);
581 
582  /* Create the Finish page */
583  psp.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER;
584  psp.pfnDlgProc = FinishDlgProc;
585  psp.pszTemplate = MAKEINTRESOURCEW(IDD_SHORTCUT_FINISH);
586  ahpsp[nPages++] = CreatePropertySheetPage(&psp);
587 
588  /* Create the property sheet */
589  psh.dwSize = sizeof(PROPSHEETHEADER);
590  psh.dwFlags = PSH_WIZARD97 | PSH_WATERMARK | PSH_USEICONID | PSH_USECALLBACK;
591  psh.hInstance = hApplet;
593  psh.hwndParent = NULL;
594  psh.nPages = nPages;
595  psh.nStartPage = 0;
596  psh.phpage = ahpsp;
597  psh.pszbmWatermark = MAKEINTRESOURCEW(IDB_SHORTCUT);
599 
600  /* Display the wizard */
601  PropertySheet(&psh);
602  HeapFree(GetProcessHeap(), 0, pContext);
603  return TRUE;
604 }
BOOL WINAPI PathIsDirectoryW(LPCWSTR lpszPath)
Definition: path.c:1702
HWND hwndParent
Definition: prsht.h:295
#define TRUE
Definition: types.h:120
#define IDS_NO_MEMORY
Definition: resource.h:28
_In_ DWORD nLength
Definition: wincon.h:476
HINSTANCE hApplet
Definition: access.c:17
#define PSH_USECALLBACK
Definition: prsht.h:48
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define pch(ap)
Definition: match.c:418
#define PSH_USEICONID
Definition: prsht.h:42
LPWSTR WINAPI PathAddBackslashW(LPWSTR lpszPath)
Definition: path.c:289
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
struct _PSP * HPROPSHEETPAGE
Definition: mstask.idl:90
PFNPROPSHEETCALLBACK pfnCallback
Definition: prsht.h:311
smooth NULL
Definition: ftsmooth.c:416
#define PROPSHEETHEADER
Definition: prsht.h:392
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
Definition: path.c:389
LONG_PTR LPARAM
Definition: windef.h:208
BOOL WINAPI PathFileExistsW(LPCWSTR lpszPath)
Definition: path.c:1756
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
Definition: path.c:442
#define CreatePropertySheetPage
Definition: prsht.h:399
#define PSP_DEFAULT
Definition: prsht.h:22
#define GetProcessHeap()
Definition: compat.h:404
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
int WINAPI MessageBoxW(_In_opt_ HWND, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_ UINT)
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define IDS_NO_DIRECTORY
Definition: resource.h:29
HINSTANCE hInstance
Definition: prsht.h:296
#define _countof(array)
Definition: sndvol32.h:68
LPCWSTR pszIcon
Definition: prsht.h:299
DWORD dwSize
Definition: prsht.h:293
DWORD dwFlags
Definition: prsht.h:294
#define IDD_SHORTCUT_LOCATION
Definition: resource.h:12
#define MB_ICONERROR
Definition: winuser.h:781
#define IDS_INVALID_PATH
Definition: resource.h:30
HPROPSHEETPAGE * phpage
Definition: prsht.h:309
LPCWSTR szPath
Definition: env.c:35
unsigned int UINT
Definition: ndis.h:50
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
#define IDB_SHORTCUT
Definition: resource.h:18
#define PropertySheet
Definition: prsht.h:400
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define IDI_APPINETICO
Definition: resource.h:9
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define IDD_SHORTCUT_FINISH
Definition: resource.h:13
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define HeapFree(x, y, z)
Definition: compat.h:403
#define PROPSHEETPAGE
Definition: prsht.h:389
UINT nStartPage
Definition: prsht.h:304

Referenced by NewLinkHereA(), and NewLinkHereW().

◆ WelcomeDlgProc()

INT_PTR CALLBACK WelcomeDlgProc ( HWND  hwndDlg,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 227 of file createlink.c.

231 {
232  LPPROPSHEETPAGEW ppsp;
233  PCREATE_LINK_CONTEXT pContext;
234  LPPSHNOTIFY lppsn;
235  WCHAR szPath[MAX_PATH * 2];
236  WCHAR szDesc[100];
237  BROWSEINFOW brws;
238  LPITEMIDLIST pidllist;
239  LPWSTR pch;
241 
242  switch(uMsg)
243  {
244  case WM_INITDIALOG:
245  ppsp = (LPPROPSHEETPAGEW)lParam;
246  pContext = (PCREATE_LINK_CONTEXT) ppsp->lParam;
247  SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pContext);
248  PropSheet_SetWizButtons(GetParent(hwndDlg), 0);
249  break;
250  case WM_COMMAND:
251  switch(HIWORD(wParam))
252  {
253  case EN_CHANGE:
255  {
257  }
258  else
259  {
260  PropSheet_SetWizButtons(GetParent(hwndDlg), 0);
261  }
262  break;
263  }
264  switch(LOWORD(wParam))
265  {
266  case IDC_SHORTCUT_BROWSE:
267  ZeroMemory(&brws, sizeof(brws));
268  brws.hwndOwner = hwndDlg;
269  brws.pidlRoot = NULL;
270  brws.pszDisplayName = szPath;
272  brws.lpfn = NULL;
273  pidllist = SHBrowseForFolderW(&brws);
274  if (!pidllist)
275  break;
276 
277  if (SHGetPathFromIDListW(pidllist, szPath))
278  {
282  }
283  /* Free memory, if possible */
284  CoTaskMemFree(pidllist);
285  break;
286  }
287  break;
288  case WM_NOTIFY:
289  lppsn = (LPPSHNOTIFY) lParam;
290  pContext = (PCREATE_LINK_CONTEXT)GetWindowLongPtr(hwndDlg, DWLP_USER);
291  if (lppsn->hdr.code == PSN_SETACTIVE)
292  {
293  SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_LOCATION, pContext->szTarget);
294  }
295  else if (lppsn->hdr.code == PSN_WIZNEXT)
296  {
297  GetDlgItemTextW(hwndDlg, IDC_SHORTCUT_LOCATION, pContext->szTarget, _countof(pContext->szTarget));
298  StrTrimW(pContext->szTarget, L" \t");
299 
301  StringCchCopyW(pContext->szTarget, _countof(pContext->szTarget), szPath);
302 
303  if (IsInternetLocation(pContext->szTarget))
304  {
305  /* internet */
306  WCHAR szName[128];
308  StringCchCopyW(pContext->szDescription, _countof(pContext->szDescription), szName);
309 
310  pContext->szWorkingDirectory[0] = 0;
311  }
312  else if (GetFileAttributesW(pContext->szTarget) != INVALID_FILE_ATTRIBUTES)
313  {
314  /* file */
318 
319  /* get display name */
320  FileInfo.szDisplayName[0] = 0;
321  if (SHGetFileInfoW(pContext->szTarget, 0, &FileInfo, sizeof(FileInfo), SHGFI_DISPLAYNAME))
322  StringCchCopyW(pContext->szDescription, _countof(pContext->szDescription), FileInfo.szDisplayName);
323 
324  /* set working directory */
326  pContext->szTarget);
329  if (pch && *pch)
330  *pch = 0;
332  }
333  else
334  {
335  /* not found */
336  WCHAR szError[MAX_PATH + 100];
337 
339 
340  LoadStringW(hApplet, IDS_CREATE_SHORTCUT, szDesc, _countof(szDesc));
342  StringCchPrintfW(szError, _countof(szError), szPath, pContext->szTarget);
343  MessageBoxW(hwndDlg, szError, szDesc, MB_ICONERROR);
344 
345  /* prevent the wizard to go next */
346  SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, -1);
347  return TRUE;
348  }
349  }
350  else if (lppsn->hdr.code == PSN_RESET && !lppsn->lParam)
351  {
352  /* The user has clicked [Cancel] */
353  DeleteFileW(pContext->szOldFile);
355  }
356  break;
357  }
358  return FALSE;
359 }
#define WM_GETTEXTLENGTH
Definition: winuser.h:1601
UINT WINAPI GetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPWSTR lpString, int nMaxCount)
Definition: dialog.c:2271
#define TRUE
Definition: types.h:120
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
struct _PSHNOTIFY * LPPSHNOTIFY
#define BIF_BROWSEINCLUDEFILES
Definition: shlobj.h:1159
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1288
#define PSWIZB_NEXT
Definition: prsht.h:154
HWND hwndOwner
Definition: shlobj.h:1127
#define ZeroMemory
Definition: winbase.h:1648
HWND WINAPI SetFocus(_In_opt_ HWND)
HINSTANCE hApplet
Definition: access.c:17
#define SendDlgItemMessage
Definition: winuser.h:5817
#define IDC_SHORTCUT_BROWSE
Definition: resource.h:40
#define PSN_SETACTIVE
Definition: prsht.h:115
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define SetWindowLongPtr
Definition: treelist.c:70
WPARAM wParam
Definition: combotst.c:138
#define pch(ap)
Definition: match.c:418
#define DWLP_MSGRESULT
Definition: winuser.h:864
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
UINT code
Definition: winuser.h:3134
NMHDR hdr
Definition: prsht.h:330
LPWSTR pszDisplayName
Definition: shlobj.h:1129
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
Definition: fileinfo.c:802
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
#define PSNRET_INVALID_NOCHANGEPAGE
Definition: prsht.h:131
smooth NULL
Definition: ftsmooth.c:416
struct _PROPSHEETPAGEW * LPPROPSHEETPAGEW
#define PSN_WIZNEXT
Definition: prsht.h:121
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
Definition: path.c:389
#define SHGFI_DISPLAYNAME
Definition: shellapi.h:164
#define PropSheet_SetWizButtons(d, f)
Definition: prsht.h:357
int WINAPI MessageBoxW(_In_opt_ HWND, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_ UINT)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
__wchar_t WCHAR
Definition: xmlstorage.h:180
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
Definition: shell32_main.c:413
#define _countof(array)
Definition: sndvol32.h:68
#define MAX_PATH
Definition: compat.h:26
#define EM_SETSEL
Definition: winuser.h:2000
LRESULT WINAPI SendDlgItemMessageW(_In_ HWND, _In_ int, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
#define IDC_SHORTCUT_LOCATION
Definition: resource.h:39
#define IDS_CREATE_SHORTCUT
Definition: resource.h:23
static const WCHAR L[]
Definition: oid.c:1250
LPARAM lParam
Definition: prsht.h:227
#define DWLP_USER
Definition: winuser.h:866
#define MB_ICONERROR
Definition: winuser.h:781
#define WM_COMMAND
Definition: winuser.h:1722
PCIDLIST_ABSOLUTE pidlRoot
Definition: shlobj.h:1128
LPWSTR WINAPI PathRemoveBackslashW(LPWSTR lpszPath)
Definition: path.c:862
#define SHCNF_PATHW
Definition: shlobj.h:1764
struct CREATE_LINK_CONTEXT * PCREATE_LINK_CONTEXT
LPITEMIDLIST WINAPI SHBrowseForFolderW(LPBROWSEINFOW lpbi)
Definition: brsfolder.c:1309
HWND WINAPI GetParent(_In_ HWND)
UINT ulFlags
Definition: shlobj.h:1131
LPCWSTR szPath
Definition: env.c:35
#define PSN_RESET
Definition: prsht.h:118
#define SHCNE_DELETE
Definition: shlobj.h:1731
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
BFFCALLBACK lpfn
Definition: shlobj.h:1132
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:519
#define IDS_ERROR_NOT_FOUND
Definition: resource.h:24
BOOL WINAPI StrTrimW(LPWSTR lpszStr, LPCWSTR lpszTrim)
Definition: string.c:1869
static const WCHAR szName[]
Definition: msipriv.h:1194
struct FileInfo FileInfo
#define HIWORD(l)
Definition: typedefs.h:246
#define GetWindowLongPtr
Definition: treelist.c:73
#define WM_SETFOCUS
Definition: winuser.h:1595
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define IDS_NEW_INTERNET_SHORTCUT
Definition: resource.h:25
LPARAM lParam
Definition: prsht.h:331
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
#define WM_INITDIALOG
Definition: winuser.h:1721
LPARAM lParam
Definition: combotst.c:139
#define LOWORD(l)
Definition: pedump.c:82
#define WM_NOTIFY
Definition: richedit.h:61
#define EN_CHANGE
Definition: winuser.h:2004

Referenced by ShowCreateShortcutWizard().