Author: hbelusca
Date: Wed Mar 13 01:35:46 2013
New Revision: 58480
URL:
http://svn.reactos.org/svn/reactos?rev=58480&view=rev
Log:
[SHELL32]
Implement the usage of the STARTF_TITLEISLINKNAME flag (in a STARTUPINFO structure, it
signals that the program was started from a shell link, and therefore its lpTitle member
holds the path of the link).
What I do is that, in CShellLink::InvokeCommand (called when a shortcut is being
executed), I initialize the SHELLEXECUTEINFO structure such that we know that we are
starting from a shortcut (use the
SEE_MASK_HASLINKNAME flag), and to hold the path to the flag I use its lpClass member
(which is not used for other things in this code path). Then the whole thing is passed to
ShellExecuteExW which, in turn,
calls the SHELL_ExecuteW function. This function reads the SHELLEXECUTEINFO structure and,
if it has the flag SEE_MASK_HASLINKNAME (or SEE_MASK_HASTITLE too, if somebody also uses
lpClass to pass a particular
title for the startup), we use the forementioned lpClass member, holding the link path, as
the title (lpTitle member) of a new STARTUPINFO object used when calling CreateProcess
(and thus, launching the
new application). So that this application will be aware that she was launched via a link
(therefore we become compliant with the STARTF_TITLEISLINKNAME documentation).
Modified:
branches/ros-csrss/dll/win32/shell32/shelllink.cpp
branches/ros-csrss/dll/win32/shell32/shelllink.h
branches/ros-csrss/dll/win32/shell32/shlexec.cpp
Modified: branches/ros-csrss/dll/win32/shell32/shelllink.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/dll/win32/shell32/she…
==============================================================================
--- branches/ros-csrss/dll/win32/shell32/shelllink.cpp [iso-8859-1] (original)
+++ branches/ros-csrss/dll/win32/shell32/shelllink.cpp [iso-8859-1] Wed Mar 13 01:35:46
2013
@@ -1825,10 +1825,10 @@
else
path = strdupW(sPath);
- if (lpici->cbSize == sizeof (CMINVOKECOMMANDINFOEX) &&
- (lpici->fMask & CMIC_MASK_UNICODE))
- {
- LPCMINVOKECOMMANDINFOEX iciex = (LPCMINVOKECOMMANDINFOEX) lpici;
+ if ( lpici->cbSize == sizeof(CMINVOKECOMMANDINFOEX) &&
+ (lpici->fMask & CMIC_MASK_UNICODE) )
+ {
+ LPCMINVOKECOMMANDINFOEX iciex = (LPCMINVOKECOMMANDINFOEX)lpici;
DWORD len = 2;
if (sArgs)
@@ -1854,8 +1854,10 @@
SHELLEXECUTEINFOW sei;
memset(&sei, 0, sizeof sei);
sei.cbSize = sizeof sei;
- sei.fMask = SEE_MASK_UNICODE | (lpici->fMask & (SEE_MASK_NOASYNC |
SEE_MASK_ASYNCOK | SEE_MASK_FLAG_NO_UI));
+ sei.fMask = SEE_MASK_HASLINKNAME | SEE_MASK_UNICODE |
+ (lpici->fMask & (SEE_MASK_NOASYNC | SEE_MASK_ASYNCOK |
SEE_MASK_FLAG_NO_UI));
sei.lpFile = path;
+ sei.lpClass = sLinkPath;
sei.nShow = iShowCmd;
sei.lpDirectory = sWorkDir;
sei.lpParameters = args;
Modified: branches/ros-csrss/dll/win32/shell32/shelllink.h
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/dll/win32/shell32/she…
==============================================================================
--- branches/ros-csrss/dll/win32/shell32/shelllink.h [iso-8859-1] (original)
+++ branches/ros-csrss/dll/win32/shell32/shelllink.h [iso-8859-1] Wed Mar 13 01:35:46
2013
@@ -67,11 +67,11 @@
LPWSTR sWorkDir;
LPWSTR sDescription;
LPWSTR sPathRel;
- LPWSTR sProduct;
- LPWSTR sComponent;
+ LPWSTR sProduct;
+ LPWSTR sComponent;
volume_info volume;
- LPWSTR sLinkPath;
- BOOL bRunAs;
+ LPWSTR sLinkPath;
+ BOOL bRunAs;
BOOL bDirty;
INT iIdOpen; /* id of the "Open" entry in the context menu */
CComPtr<IUnknown> site;
Modified: branches/ros-csrss/dll/win32/shell32/shlexec.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/ros-csrss/dll/win32/shell32/shl…
==============================================================================
--- branches/ros-csrss/dll/win32/shell32/shlexec.cpp [iso-8859-1] (original)
+++ branches/ros-csrss/dll/win32/shell32/shlexec.cpp [iso-8859-1] Wed Mar 13 01:35:46
2013
@@ -450,6 +450,11 @@
startup.cb = sizeof(STARTUPINFOW);
startup.dwFlags = STARTF_USESHOWWINDOW;
startup.wShowWindow = psei->nShow;
+ startup.lpTitle = (LPWSTR)(psei->fMask & (SEE_MASK_HASLINKNAME |
SEE_MASK_HASTITLE) ? psei->lpClass : NULL);
+
+ if (psei->fMask & SEE_MASK_HASLINKNAME)
+ startup.dwFlags |= STARTF_TITLEISLINKNAME;
+
dwCreationFlags = CREATE_UNICODE_ENVIRONMENT;
if (psei->fMask & SEE_MASK_NO_CONSOLE)