https://git.reactos.org/?p=reactos.git;a=commitdiff;h=059427e31d64730938409…
commit 059427e31d6473093840964848726054d62709c7
Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com>
AuthorDate: Sat Jul 22 12:39:51 2023 +0900
Commit: GitHub <noreply(a)github.com>
CommitDate: Sat Jul 22 12:39:51 2023 +0900
[APPWIZ] 'Create Shortcut' wizard: Accept arguments (#5456)
Allow command line as Create Shortcut wizard's target. CORE-5866
---
dll/cpl/appwiz/appwiz.h | 3 +-
dll/cpl/appwiz/createlink.c | 79 +++++++++++++++++++++++++--------------------
2 files changed, 46 insertions(+), 36 deletions(-)
diff --git a/dll/cpl/appwiz/appwiz.h b/dll/cpl/appwiz/appwiz.h
index fa388848695..6148da7a98c 100644
--- a/dll/cpl/appwiz/appwiz.h
+++ b/dll/cpl/appwiz/appwiz.h
@@ -27,9 +27,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(appwiz);
typedef struct
{
- WCHAR szTarget[MAX_PATH];
+ WCHAR szTarget[2 * MAX_PATH];
WCHAR szWorkingDirectory[MAX_PATH];
WCHAR szDescription[MAX_PATH];
+ WCHAR szArguments[2 * MAX_PATH];
WCHAR szOrigin[MAX_PATH];
WCHAR szOldFile[MAX_PATH];
WCHAR szLinkName[MAX_PATH];
diff --git a/dll/cpl/appwiz/createlink.c b/dll/cpl/appwiz/createlink.c
index 9f80dc5aa7c..ea1ecc48e6d 100644
--- a/dll/cpl/appwiz/createlink.c
+++ b/dll/cpl/appwiz/createlink.c
@@ -14,6 +14,7 @@
#include <commctrl.h>
#include <shellapi.h>
#include <strsafe.h>
+#include <shlwapi_undoc.h> // for PathFindOnPathExW
BOOL
IsShortcut(HKEY hKey)
@@ -126,6 +127,8 @@ CreateShortcut(PCREATE_LINK_CONTEXT pContext)
return FALSE;
pShellLink->lpVtbl->SetPath(pShellLink, Path);
+ if (pContext->szArguments[0])
+ pShellLink->lpVtbl->SetArguments(pShellLink, pContext->szArguments);
pShellLink->lpVtbl->SetDescription(pShellLink, pContext->szDescription);
pShellLink->lpVtbl->SetWorkingDirectory(pShellLink,
pContext->szWorkingDirectory);
@@ -237,7 +240,6 @@ WelcomeDlgProc(HWND hwndDlg,
WCHAR szTitle[100];
BROWSEINFOW brws;
LPITEMIDLIST pidllist;
- LPWSTR pch;
SHFILEINFOW FileInfo;
switch(uMsg)
@@ -250,6 +252,7 @@ WelcomeDlgProc(HWND hwndDlg,
SHAutoComplete(GetDlgItem(hwndDlg, IDC_SHORTCUT_LOCATION), SHACF_DEFAULT);
break;
case WM_COMMAND:
+ {
switch(HIWORD(wParam))
{
case EN_CHANGE:
@@ -306,56 +309,66 @@ WelcomeDlgProc(HWND hwndDlg,
{
GetDlgItemTextW(hwndDlg, IDC_SHORTCUT_LOCATION, pContext->szTarget,
_countof(pContext->szTarget));
StrTrimW(pContext->szTarget, L" \t");
-
ExpandEnvironmentStringsW(pContext->szTarget, szPath,
_countof(szPath));
- StringCchCopyW(pContext->szTarget, _countof(pContext->szTarget),
szPath);
- if (IsInternetLocation(pContext->szTarget))
+ if (IsInternetLocation(szPath)) /* The internet location */
{
- /* internet */
WCHAR szName[128];
LoadStringW(hApplet, IDS_NEW_INTERNET_SHORTCUT, szName,
_countof(szName));
StringCchCopyW(pContext->szDescription,
_countof(pContext->szDescription), szName);
-
pContext->szWorkingDirectory[0] = 0;
+ pContext->szArguments[0] = 0;
+ return FALSE;
}
- else if (GetFileAttributesW(pContext->szTarget) !=
INVALID_FILE_ATTRIBUTES)
+
+ /* Split and build args */
+ LPWSTR pszArgs = PathGetArgsW(szPath);
+ if (pszArgs && pszArgs > szPath)
{
- /* file */
- SendDlgItemMessage(hwndDlg, IDC_SHORTCUT_LOCATION, EM_SETSEL, 0,
-1);
- SetFocus(GetDlgItem(hwndDlg, IDC_SHORTCUT_LOCATION));
- SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT,
PSNRET_INVALID_NOCHANGEPAGE);
-
- /* get display name */
- FileInfo.szDisplayName[0] = 0;
- if (SHGetFileInfoW(pContext->szTarget, 0, &FileInfo,
sizeof(FileInfo), SHGFI_DISPLAYNAME))
- StringCchCopyW(pContext->szDescription,
_countof(pContext->szDescription), FileInfo.szDisplayName);
-
- /* set working directory */
- StringCchCopyW(pContext->szWorkingDirectory,
_countof(pContext->szWorkingDirectory),
- pContext->szTarget);
- PathRemoveBackslashW(pContext->szWorkingDirectory);
- pch = PathFindFileNameW(pContext->szWorkingDirectory);
- if (pch && *pch)
- *pch = 0;
- PathRemoveBackslashW(pContext->szWorkingDirectory);
+ PathRemoveArgsW(szPath);
+ StringCchCopyW(pContext->szArguments,
_countof(pContext->szArguments), pszArgs);
}
else
{
- /* not found */
- WCHAR szError[MAX_PATH + 100];
+ pContext->szArguments[0] = 0;
+ }
+ /* Find the file */
+ WCHAR szFound[MAX_PATH];
+ StringCchCopyW(szFound, _countof(szFound), szPath);
+ if (!PathFindOnPathExW(szFound, NULL, WHICH_DEFAULT) &&
+ FindExecutableW(szPath, NULL, szFound) <= (HINSTANCE)(INT_PTR)32)
+ {
+ /* Not found */
SendDlgItemMessageW(hwndDlg, IDC_SHORTCUT_LOCATION, EM_SETSEL, 0,
-1);
LoadStringW(hApplet, IDS_CREATE_SHORTCUT, szDesc, _countof(szDesc));
LoadStringW(hApplet, IDS_ERROR_NOT_FOUND, szPath, _countof(szPath));
+
+ WCHAR szError[MAX_PATH + 100];
StringCchPrintfW(szError, _countof(szError), szPath,
pContext->szTarget);
MessageBoxW(hwndDlg, szError, szDesc, MB_ICONERROR);
- /* prevent the wizard to go next */
+ /* Prevent the wizard to go next */
SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, -1);
return TRUE;
}
+
+ /* Rebuild target */
+ StringCchCopyW(pContext->szTarget, _countof(pContext->szTarget),
szFound);
+
+ /* Get display name */
+ FileInfo.szDisplayName[0] = 0;
+ if (SHGetFileInfoW(szFound, 0, &FileInfo, sizeof(FileInfo),
SHGFI_DISPLAYNAME))
+ StringCchCopyW(pContext->szDescription,
_countof(pContext->szDescription), FileInfo.szDisplayName);
+
+ /* Set working directory */
+ StringCchCopyW(pContext->szWorkingDirectory,
_countof(pContext->szWorkingDirectory), szFound);
+ PathRemoveBackslashW(pContext->szWorkingDirectory);
+ PathRemoveFileSpecW(pContext->szWorkingDirectory);
+ PathRemoveBackslashW(pContext->szWorkingDirectory);
+
+ SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
}
else if (lppsn->hdr.code == PSN_RESET && !lppsn->lParam)
{
@@ -364,6 +377,7 @@ WelcomeDlgProc(HWND hwndDlg,
SHChangeNotify(SHCNE_DELETE, SHCNF_PATHW, pContext->szOldFile, NULL);
}
break;
+ }
}
return FALSE;
}
@@ -378,7 +392,6 @@ FinishDlgProc(HWND hwndDlg,
LPPROPSHEETPAGEW ppsp;
PCREATE_LINK_CONTEXT pContext;
LPPSHNOTIFY lppsn;
- LPWSTR pch;
WCHAR szText[MAX_PATH];
WCHAR szMessage[128];
@@ -450,9 +463,7 @@ FinishDlgProc(HWND hwndDlg,
PathAppendW(pContext->szLinkName, pContext->szDescription);
/* change extension if any */
- pch = PathFindExtensionW(pContext->szLinkName);
- if (pch && *pch)
- *pch = 0;
+ PathRemoveExtensionW(pContext->szLinkName);
StringCchCatW(pContext->szLinkName,
_countof(pContext->szLinkName), L".url");
if (!CreateInternetShortcut(pContext))
@@ -469,9 +480,7 @@ FinishDlgProc(HWND hwndDlg,
PathAppendW(pContext->szLinkName, pContext->szDescription);
/* change extension if any */
- pch = PathFindExtensionW(pContext->szLinkName);
- if (pch && *pch)
- *pch = 0;
+ PathRemoveExtensionW(pContext->szLinkName);
StringCchCatW(pContext->szLinkName,
_countof(pContext->szLinkName), L".lnk");
if (!CreateShortcut(pContext))