Author: jmorlan
Date: Sat Mar 21 05:12:23 2009
New Revision: 40148
URL:
http://svn.reactos.org/svn/reactos?rev=40148&view=rev
Log:
- When running a non-executable file, if the program handling the file type is a console
program (e.g. Perl/Python) it should run in the same console as cmd, and cmd should wait
for it. Implement this by using ShellExecuteEx instead of plain ShellExecute, with the
SEE_MASK_NOCLOSEPROCESS and SEE_MASK_NO_CONSOLE flags. (SEE_MASK_NO_CONSOLE does the
opposite of its MSDN description)
- Use NULL as the lpVerb to get the default action ("open" is not necessarily
the default)
- Allow passing parameters besides just the file name
Modified:
trunk/reactos/base/shell/cmd/cmd.c
Modified: trunk/reactos/base/shell/cmd/cmd.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/cmd.c?rev=4…
==============================================================================
--- trunk/reactos/base/shell/cmd/cmd.c [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/cmd.c [iso-8859-1] Sat Mar 21 05:12:23 2009
@@ -258,52 +258,50 @@
#ifdef _UNICODE
-#define SHELLEXECUTETEXT "ShellExecuteW"
+#define SHELLEXECUTETEXT "ShellExecuteExW"
#else
-#define SHELLEXECUTETEXT "ShellExecuteA"
+#define SHELLEXECUTETEXT "ShellExecuteExA"
#endif
-typedef HINSTANCE (WINAPI *MYEX)(
- HWND hwnd,
- LPCTSTR lpOperation,
- LPCTSTR lpFile,
- LPCTSTR lpParameters,
- LPCTSTR lpDirectory,
- INT nShowCmd
-);
-
-
-
-static BOOL RunFile(LPTSTR filename)
-{
+typedef BOOL (WINAPI *MYEX)(LPSHELLEXECUTEINFO lpExecInfo);
+
+static HANDLE RunFile(LPTSTR filename, LPTSTR params)
+{
+ SHELLEXECUTEINFO sei;
HMODULE hShell32;
MYEX hShExt;
- HINSTANCE ret;
+ BOOL ret;
TRACE ("RunFile(%s)\n", debugstr_aw(filename));
hShell32 = LoadLibrary(_T("SHELL32.DLL"));
if (!hShell32)
{
WARN ("RunFile: couldn't load SHELL32.DLL!\n");
- return FALSE;
+ return NULL;
}
hShExt = (MYEX)(FARPROC)GetProcAddress(hShell32, SHELLEXECUTETEXT);
if (!hShExt)
{
- WARN ("RunFile: couldn't find ShellExecuteA/W in SHELL32.DLL!\n");
+ WARN ("RunFile: couldn't find ShellExecuteExA/W in SHELL32.DLL!\n");
FreeLibrary(hShell32);
- return FALSE;
- }
-
- TRACE ("RunFile: ShellExecuteA/W is at %x\n", hShExt);
-
- ret = (hShExt)(NULL, _T("open"), filename, NULL, NULL, SW_SHOWNORMAL);
-
- TRACE ("RunFile: ShellExecuteA/W returned 0x%p\n", ret);
+ return NULL;
+ }
+
+ TRACE ("RunFile: ShellExecuteExA/W is at %x\n", hShExt);
+
+ memset(&sei, 0, sizeof sei);
+ sei.cbSize = sizeof sei;
+ sei.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_NO_CONSOLE;
+ sei.lpFile = filename;
+ sei.lpParameters = params;
+ sei.nShow = SW_SHOWNORMAL;
+ ret = hShExt(&sei);
+
+ TRACE ("RunFile: ShellExecuteExA/W returned 0x%p\n", ret);
FreeLibrary(hShell32);
- return (((DWORD_PTR)ret) > 32);
+ return ret ? sei.hProcess : NULL;
}
@@ -496,6 +494,16 @@
&prci))
{
+ CloseHandle(prci.hThread);
+ }
+ else
+ {
+ // See if we can run this with ShellExecute() ie myfile.xls
+ prci.hProcess = RunFile(szFullName, rest);
+ }
+
+ if (prci.hProcess != NULL)
+ {
if (IsConsoleProcess(prci.hProcess))
{
/* FIXME: Protect this with critical section */
@@ -514,24 +522,15 @@
{
nErrorLevel = 0;
}
- CloseHandle (prci.hThread);
CloseHandle (prci.hProcess);
}
else
{
- TRACE ("[ShellExecute: %s]\n", debugstr_aw(full));
- // See if we can run this with ShellExecute() ie myfile.xls
- if (!RunFile(full))
- {
- TRACE ("[ShellExecute failed!: %s]\n", debugstr_aw(full));
- error_bad_command (first);
- nErrorLevel = 1;
- }
- else
- {
- nErrorLevel = 0;
- }
- }
+ TRACE ("[ShellExecute failed!: %s]\n", debugstr_aw(full));
+ error_bad_command (first);
+ nErrorLevel = 1;
+ }
+
// restore console mode
SetConsoleMode (
GetStdHandle( STD_INPUT_HANDLE ),