[shell32]
[reactos.git] / reactos / dll / win32 / shell32 / shlexec.cpp
index 51f2d7f..7adbd0d 100644 (file)
@@ -19,8 +19,7 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#include <precomp.h>
-#include <windef.h>
+#include "precomp.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(exec);
 
@@ -452,9 +451,12 @@ static UINT_PTR SHELL_ExecuteW(const WCHAR *lpCmd, WCHAR *env, BOOL shWait,
     startup.dwFlags = STARTF_USESHOWWINDOW;
     startup.wShowWindow = psei->nShow;
     dwCreationFlags = CREATE_UNICODE_ENVIRONMENT;
+   if (psei->fMask & SEE_MASK_NO_CONSOLE)
+        dwCreationFlags |= CREATE_NEW_CONSOLE;    
+    startup.lpTitle = (LPWSTR)(psei->fMask & (SEE_MASK_HASLINKNAME | SEE_MASK_HASTITLE) ? psei->lpClass : NULL);
 
-    if (psei->fMask & SEE_MASK_NO_CONSOLE)
-        dwCreationFlags |= CREATE_NEW_CONSOLE;
+    if (psei->fMask & SEE_MASK_HASLINKNAME)
+        startup.dwFlags |= STARTF_TITLEISLINKNAME;
 
     if (CreateProcessW(NULL, (LPWSTR)lpCmd, NULL, NULL, FALSE, dwCreationFlags, env,
                        lpDirectory, &startup, &info))
@@ -699,7 +701,13 @@ static UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOpera
         lpFile = xlpFile;
         /* Hey, isn't this value ignored?  Why make this call?  Shouldn't we return here?  --dank*/
     }
-
+    else if (lpPath && SearchPathW(NULL, lpFile, wszExe, sizeof(xlpFile)/sizeof(WCHAR), xlpFile, NULL))
+    {
+        TRACE("SearchPathW returned non-zero\n");
+        lpFile = xlpFile;
+        /* The file was found in one of the directories in the system-wide search path */
+    }
+    
     attribs = GetFileAttributesW(lpFile);
     if (attribs != INVALID_FILE_ATTRIBUTES && (attribs & FILE_ATTRIBUTE_DIRECTORY))
     {
@@ -1220,7 +1228,7 @@ static IDataObject *shellex_get_dataobj( LPSHELLEXECUTEINFOW sei )
         pidl = ILCreateFromPathW(fullpath);
     }
 
-    r = SHBindToParent(pidl, IID_IShellFolder, (LPVOID*)&shf, &pidllast);
+    r = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &shf), &pidllast);
     if (FAILED(r))
         goto end;
 
@@ -1320,7 +1328,7 @@ static HRESULT shellex_load_object_and_run(HKEY hkey, LPCGUID guid, LPSHELLEXECU
         goto end;
 
     r = CoCreateInstance(*guid, NULL, CLSCTX_INPROC_SERVER,
-                         IID_IShellExtInit, (LPVOID*)&obj);
+                         IID_PPV_ARG(IShellExtInit, &obj));
     if (FAILED(r))
     {
         ERR("failed %08x\n", r);
@@ -1501,7 +1509,7 @@ static UINT_PTR SHELL_quote_and_execute(LPCWSTR wcmd, LPCWSTR wszParameters, LPC
     strcatW(wszQuotedCmd, L"\"");
     if (wszParameters[0])
     {
-        strcatW(wszQuotedCmd, " ");
+        strcatW(wszQuotedCmd, L" ");
         strcatW(wszQuotedCmd, wszParameters);
     }
 
@@ -1689,7 +1697,7 @@ BOOL SHELL_execute(LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc)
     {
         IShellExecuteHookW* pSEH;
 
-        HRESULT hr = SHBindToParent((LPCITEMIDLIST)sei_tmp.lpIDList, IID_IShellExecuteHookW, (LPVOID*)&pSEH, NULL);
+        HRESULT hr = SHBindToParent((LPCITEMIDLIST)sei_tmp.lpIDList, IID_PPV_ARG(IShellExecuteHookW, &pSEH), NULL);
 
         if (SUCCEEDED(hr))
         {
@@ -2021,7 +2029,10 @@ HINSTANCE WINAPI ShellExecuteA(HWND hWnd, LPCSTR lpOperation, LPCSTR lpFile,
  * ShellExecuteExA                [SHELL32.292]
  *
  */
-BOOL WINAPI ShellExecuteExA(LPSHELLEXECUTEINFOA sei)
+BOOL
+WINAPI
+DECLSPEC_HOTPATCH
+ShellExecuteExA(LPSHELLEXECUTEINFOA sei)
 {
     SHELLEXECUTEINFOW seiW;
     BOOL ret;
@@ -2068,7 +2079,10 @@ BOOL WINAPI ShellExecuteExA(LPSHELLEXECUTEINFOA sei)
  * ShellExecuteExW                [SHELL32.293]
  *
  */
-BOOL WINAPI ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
+BOOL
+WINAPI
+DECLSPEC_HOTPATCH
+ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
 {
     return SHELL_execute(sei, SHELL_ExecuteW);
 }