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/shel... ============================================================================== --- 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/shel... ============================================================================== --- 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/shle... ============================================================================== --- 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)