ReactOS  0.4.15-dev-488-gc7a1924
ShellExecCmdLine.cpp File Reference
#include "shelltest.h"
#include <shlwapi.h>
#include <strsafe.h>
#include <versionhelpers.h>
#include <debug.h>
#include <stdio.h>
Include dependency graph for ShellExecCmdLine.cpp:

Go to the source code of this file.

Classes

struct  TEST_ENTRY
 

Macros

#define NDEBUG
 
#define SECL_NO_UI   0x2
 
#define SECL_LOG_USAGE   0x8
 
#define SECL_USE_IDLIST   0x10
 
#define SECL_ALLOW_NONEXE   0x20
 
#define SECL_RUNAS   0x40
 
#define RETRY_COUNT   5
 
#define RETRY_INTERVAL   250
 

Typedefs

typedef HRESULT(WINAPISHELLEXECCMDLINE) (HWND, LPCWSTR, LPCWSTR, INT, LPVOID, DWORD)
 
typedef struct TEST_ENTRY TEST_ENTRY
 

Functions

static void DoEntry (const TEST_ENTRY *pEntry)
 
 START_TEST (ShellExecCmdLine)
 

Variables

SHELLEXECCMDLINE g_pShellExecCmdLine = NULL
 
static const char s_testfile1 [] = "Test File.txt"
 
static const char s_testfile2 [] = "Test File.bat"
 
static char s_notepad [] = "notepad.exe"
 
static const TEST_ENTRY s_entries []
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 12 of file ShellExecCmdLine.cpp.

◆ RETRY_COUNT

#define RETRY_COUNT   5

◆ RETRY_INTERVAL

#define RETRY_INTERVAL   250

◆ SECL_ALLOW_NONEXE

#define SECL_ALLOW_NONEXE   0x20

Definition at line 22 of file ShellExecCmdLine.cpp.

◆ SECL_LOG_USAGE

#define SECL_LOG_USAGE   0x8

Definition at line 20 of file ShellExecCmdLine.cpp.

◆ SECL_NO_UI

#define SECL_NO_UI   0x2

Definition at line 19 of file ShellExecCmdLine.cpp.

◆ SECL_RUNAS

#define SECL_RUNAS   0x40

Definition at line 23 of file ShellExecCmdLine.cpp.

◆ SECL_USE_IDLIST

#define SECL_USE_IDLIST   0x10

Definition at line 21 of file ShellExecCmdLine.cpp.

Typedef Documentation

◆ SHELLEXECCMDLINE

typedef HRESULT(WINAPI * SHELLEXECCMDLINE) (HWND, LPCWSTR, LPCWSTR, INT, LPVOID, DWORD)

Definition at line 240 of file ShellExecCmdLine.cpp.

◆ TEST_ENTRY

Function Documentation

◆ DoEntry()

static void DoEntry ( const TEST_ENTRY pEntry)
static

Definition at line 401 of file ShellExecCmdLine.cpp.

402 {
403  HRESULT hr;
404  DWORD dwSeclFlags;
405 
406  if (pEntry->bAllowNonExe)
407  dwSeclFlags = SECL_NO_UI | SECL_ALLOW_NONEXE;
408  else
409  dwSeclFlags = SECL_NO_UI;
410 
411  _SEH2_TRY
412  {
413 #ifdef ShellExecCmdLine
414  hr = ShellExecCmdLine(NULL, pEntry->pwszCommand, pEntry->pwszStartDir,
415  SW_SHOWNORMAL, NULL, dwSeclFlags);
416 #else
417  hr = (*g_pShellExecCmdLine)(NULL, pEntry->pwszCommand, pEntry->pwszStartDir,
418  SW_SHOWNORMAL, NULL, dwSeclFlags);
419 #endif
420  }
422  {
423  hr = 0xDEADFACE;
424  }
425  _SEH2_END;
426 
427  ok(hr == pEntry->hr, "Line %d: hr expected 0x%lX, was 0x%lX\n", pEntry->lineno, pEntry->hr, hr);
428 
429 #define RETRY_COUNT 5
430 #define RETRY_INTERVAL 250
431  if (SUCCEEDED(hr) && pEntry->pwszWindowClass)
432  {
433  BOOL bFound = FALSE;
434  Sleep(RETRY_INTERVAL / 2);
435  for (int i = 0; i < RETRY_COUNT; ++i)
436  {
438  if (hwnd)
439  {
440  bFound = TRUE;
441  SendMessage(hwnd, WM_CLOSE, 0, 0);
443  break;
444  }
446  }
447  ok(bFound, "Line %d: The window not found\n", pEntry->lineno);
448  }
449 #undef RETRY_COUNT
450 #undef RETRY_INTERVAL
451 }
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
#define TRUE
Definition: types.h:120
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:790
HRESULT hr
Definition: shlfolder.c:183
LPCWSTR pwszStartDir
LPCWSTR pwszCommand
#define SECL_NO_UI
_SEH2_TRY
Definition: create.c:4226
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define RETRY_INTERVAL
unsigned int BOOL
Definition: ntddk_ex.h:94
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
smooth NULL
Definition: ftsmooth.c:416
#define SECL_ALLOW_NONEXE
INT lineno
Definition: DPtoLP.c:34
HWND WINAPI FindWindowW(_In_opt_ LPCWSTR, _In_opt_ LPCWSTR)
LONG HRESULT
Definition: typedefs.h:78
LPCWSTR pwszWindowClass
#define WM_CLOSE
Definition: winuser.h:1603
BOOL bAllowNonExe
unsigned long DWORD
Definition: ntddk_ex.h:95
HRESULT WINAPI ShellExecCmdLine(HWND hwnd, LPCWSTR pwszCommand, LPCWSTR pwszStartDir, int nShow, LPVOID pUnused, DWORD dwSeclFlags)
Definition: shlexec.cpp:2415
HRESULT hr
#define SW_SHOWNORMAL
Definition: winuser.h:764
_SEH2_END
Definition: create.c:4400
#define ok(value,...)
Definition: atltest.h:57
#define SendMessage
Definition: winuser.h:5818
#define RETRY_COUNT
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:6
#define SUCCEEDED(hr)
Definition: intsafe.h:57

Referenced by START_TEST().

◆ START_TEST()

START_TEST ( ShellExecCmdLine  )

Definition at line 453 of file ShellExecCmdLine.cpp.

454 {
455  using namespace std;
456 
457 #ifndef ShellExecCmdLine
458  // CHECKME
460  {
461  skip("ShellExecCmdLine is not available on this platform\n");
462  return;
463  }
464 
465  HMODULE hShell32 = GetModuleHandleA("shell32");
467  if (!g_pShellExecCmdLine)
468  {
469  skip("ShellExecCmdLine is not found\n");
470  return;
471  }
472 #endif
473 
474  // s_testfile1
475  FILE *fp = fopen(s_testfile1, "wb");
476  ok(fp != NULL, "failed to create a test file\n");
477  fclose(fp);
478 
479  // s_testfile2
480  fp = fopen(s_testfile2, "wb");
481  ok(fp != NULL, "failed to create a test file\n");
482  if (fp)
483  {
484  fprintf(fp, "echo OK\n");
485  }
486  fclose(fp);
487 
488  for (size_t i = 0; i < _countof(s_entries); ++i)
489  {
490  DoEntry(&s_entries[i]);
491  }
492 
493  WCHAR buf0[MAX_PATH];
494  WCHAR buf1[MAX_PATH];
495  WCHAR buf2[MAX_PATH];
496  TEST_ENTRY additionals[] =
497  {
498  { __LINE__, CO_E_APPNOTFOUND, FALSE, L"Notepad", buf0, NULL },
499  { __LINE__, CO_E_APPNOTFOUND, FALSE, L"Notepad", buf0, L"." },
500  { __LINE__, CO_E_APPNOTFOUND, FALSE, L"Notepad", buf0, L"system32" },
501  { __LINE__, CO_E_APPNOTFOUND, FALSE, L"Notepad", buf1, NULL },
502  { __LINE__, CO_E_APPNOTFOUND, FALSE, L"Notepad", buf1, L"." },
503  { __LINE__, CO_E_APPNOTFOUND, FALSE, L"Notepad", buf1, L"system32" },
504  { __LINE__, CO_E_APPNOTFOUND, FALSE, L"Notepad", buf2, NULL },
505  { __LINE__, CO_E_APPNOTFOUND, FALSE, L"Notepad", buf2, L"." },
506  { __LINE__, CO_E_APPNOTFOUND, FALSE, L"Notepad", buf2, L"system32" },
507  { __LINE__, HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), TRUE, L"Notepad", buf0, NULL }, // FIXME
508  { __LINE__, S_OK, TRUE, L"Notepad", buf0, L"." },
509  { __LINE__, HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), TRUE, L"Notepad", buf0, L"system32" }, // FIXME
510  { __LINE__, HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), TRUE, L"Notepad", buf1, NULL }, // FIXME
511  { __LINE__, S_OK, TRUE, L"Notepad", buf1, L"." },
512  { __LINE__, S_OK, TRUE, L"Notepad", buf1, L"system32" },
513  { __LINE__, HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), TRUE, L"Notepad", buf2, NULL }, // FIXME
514  { __LINE__, S_OK, TRUE, L"Notepad", buf2, L"." },
515  { __LINE__, S_OK, TRUE, L"Notepad", buf2, L"system32" },
516  };
517 
518  wsprintfW(buf0, L"%hs", s_testfile1);
519  wsprintfW(buf1, L"\"%hs\"", s_testfile1);
520  wsprintfW(buf2, L"\"%hs\" \"Test File.txt\"", s_testfile1);
521  for (size_t i = 0; i < _countof(additionals); ++i)
522  {
523  DoEntry(&additionals[i]);
524  }
525 
526  TEST_ENTRY additionals2[] =
527  {
528  { __LINE__, CO_E_APPNOTFOUND, FALSE, NULL, buf0, NULL },
529  { __LINE__, CO_E_APPNOTFOUND, FALSE, NULL, buf0, L"." },
530  { __LINE__, CO_E_APPNOTFOUND, FALSE, NULL, buf0, L"system32" },
531  { __LINE__, CO_E_APPNOTFOUND, FALSE, NULL, buf1, NULL },
532  { __LINE__, CO_E_APPNOTFOUND, FALSE, NULL, buf1, L"." },
533  { __LINE__, CO_E_APPNOTFOUND, FALSE, NULL, buf1, L"system32" },
534  { __LINE__, CO_E_APPNOTFOUND, FALSE, NULL, buf2, NULL },
535  { __LINE__, CO_E_APPNOTFOUND, FALSE, NULL, buf2, L"." },
536  { __LINE__, CO_E_APPNOTFOUND, FALSE, NULL, buf2, L"system32" },
537  { __LINE__, HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), TRUE, NULL, buf0, NULL }, // FIXME
538  { __LINE__, S_OK, TRUE, NULL, buf0, L"." },
539  { __LINE__, HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), TRUE, NULL, buf0, L"system32" }, // FIXME
540  { __LINE__, HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), TRUE, NULL, buf1, NULL }, // FIXME
541  { __LINE__, S_OK, TRUE, NULL, buf1, L"." },
542  { __LINE__, S_OK, TRUE, NULL, buf1, L"system32" },
543  { __LINE__, HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), TRUE, NULL, buf2, NULL }, // FIXME
544  { __LINE__, S_OK, TRUE, NULL, buf2, L"." },
545  { __LINE__, S_OK, TRUE, NULL, buf2, L"system32" },
546  };
547 
548  wsprintfW(buf0, L"%hs", s_testfile2);
549  wsprintfW(buf1, L"\"%hs\"", s_testfile2);
550  wsprintfW(buf2, L"\"%hs\" \"Test File.txt\"", s_testfile2);
551  for (size_t i = 0; i < _countof(additionals2); ++i)
552  {
553  DoEntry(&additionals2[i]);
554  }
555 
556  char path[MAX_PATH];
557  ok((INT_PTR)FindExecutableA("notepad.exe", NULL, s_notepad) >= 32, "FindExecutableA failed\n");
558  ok(GetModuleFileNameA(NULL, path, _countof(path)), "GetModuleFileNameA failed\n");
559  char *pch = strrchr(path, '\\');
560 
561  if (pch == NULL)
562  {
563  skip("pch == NULL\n");
564  }
565  else
566  {
567  // create "My Directory"
568  strcpy(pch, "\\My Directory");
570  ok(CreateDirectoryA(path, NULL), "CreateDirectoryA failed\n");
571 
572  // create "My Directory\\Notepad.exe" as clone of Notepad.exe
573  strcpy(pch, "\\My Directory\\Notepad.exe");
574  ok(CopyFileA(s_notepad, path, FALSE), "CopyFileA failed\n");
575 
576  wsprintfW(buf0, L"%hs", path);
577  wsprintfW(buf1, L"\"%hs\"", path);
578  wsprintfW(buf2, L"\"%hs\" \"Test File.txt\"", path);
579  TEST_ENTRY additionals3[] =
580  {
581  { __LINE__, S_OK, FALSE, NULL, buf0, NULL },
582  { __LINE__, S_OK, FALSE, NULL, buf0, L"." },
583  { __LINE__, S_OK, FALSE, NULL, buf0, L"system32" },
584  { __LINE__, S_OK, FALSE, NULL, buf1, NULL },
585  { __LINE__, S_OK, FALSE, NULL, buf1, L"." },
586  { __LINE__, S_OK, FALSE, NULL, buf1, L"system32" },
587  { __LINE__, S_OK, FALSE, NULL, buf2, NULL },
588  { __LINE__, S_OK, FALSE, NULL, buf2, L"." },
589  { __LINE__, S_OK, FALSE, NULL, buf2, L"system32" },
590  { __LINE__, S_OK, TRUE, NULL, buf0, NULL },
591  { __LINE__, S_OK, TRUE, NULL, buf0, L"." },
592  { __LINE__, S_OK, TRUE, NULL, buf0, L"system32" },
593  { __LINE__, S_OK, TRUE, NULL, buf1, NULL },
594  { __LINE__, S_OK, TRUE, NULL, buf1, L"." },
595  { __LINE__, S_OK, TRUE, NULL, buf1, L"system32" },
596  { __LINE__, S_OK, TRUE, NULL, buf2, NULL },
597  { __LINE__, S_OK, TRUE, NULL, buf2, L"." },
598  { __LINE__, S_OK, TRUE, NULL, buf2, L"system32" },
599  };
600  for (size_t i = 0; i < _countof(additionals3); ++i)
601  {
602  DoEntry(&additionals3[i]);
603  }
604 
605  DeleteFileA(path);
606 
607  strcpy(pch, "\\My Directory");
609  }
610 
611  // clean up
612  ok(DeleteFileA(s_testfile1), "failed to delete the test file\n");
613  ok(DeleteFileA(s_testfile2), "failed to delete the test file\n");
614 }
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
#define TRUE
Definition: types.h:120
static const char s_testfile2[]
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
HRESULT(WINAPI * SHELLEXECCMDLINE)(HWND, LPCWSTR, LPCWSTR, INT, LPVOID, DWORD)
#define RemoveDirectory
Definition: winbase.h:3735
BOOL WINAPI CopyFileA(IN LPCSTR lpExistingFileName, IN LPCSTR lpNewFileName, IN BOOL bFailIfExists)
Definition: copy.c:404
_Check_return_ _CRTIMP _CONST_RETURN char *__cdecl strrchr(_In_z_ const char *_Str, _In_ int _Ch)
int32_t INT_PTR
Definition: typedefs.h:63
Definition: features.h:417
DWORD WINAPI GetModuleFileNameA(HINSTANCE hModule, LPSTR lpFilename, DWORD nSize)
Definition: loader.c:539
#define pch(ap)
Definition: match.c:418
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
DWORD WINAPI GetFileAttributesA(LPCSTR lpFileName)
Definition: fileinfo.c:786
BOOL WINAPI CreateDirectoryA(IN LPCSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: dir.c:37
smooth NULL
Definition: ftsmooth.c:416
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
VERSIONHELPERAPI IsWindowsVistaOrGreater()
const char * LPCSTR
Definition: xmlstorage.h:183
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static const char s_testfile1[]
SHELLEXECCMDLINE g_pShellExecCmdLine
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define _countof(array)
Definition: sndvol32.h:68
#define MAX_PATH
Definition: compat.h:26
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23
static const TEST_ENTRY s_entries[]
HINSTANCE WINAPI FindExecutableA(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult)
Definition: shlexec.cpp:1223
Definition: cmd.c:12
static const WCHAR L[]
Definition: oid.c:1250
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
#define S_OK
Definition: intsafe.h:59
#define ok(value,...)
Definition: atltest.h:57
static void DoEntry(const TEST_ENTRY *pEntry)
#define skip(...)
Definition: atltest.h:64
static char s_notepad[]
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
#define GetProcAddress(x, y)
Definition: compat.h:419
#define CO_E_APPNOTFOUND
Definition: winerror.h:2808
static HMODULE hShell32
Definition: string.c:34

Variable Documentation

◆ g_pShellExecCmdLine

SHELLEXECCMDLINE g_pShellExecCmdLine = NULL

Definition at line 241 of file ShellExecCmdLine.cpp.

Referenced by START_TEST().

◆ s_entries

const TEST_ENTRY s_entries[]
static

Definition at line 258 of file ShellExecCmdLine.cpp.

Referenced by START_TEST().

◆ s_notepad

char s_notepad[] = "notepad.exe"
static

Definition at line 256 of file ShellExecCmdLine.cpp.

Referenced by START_TEST().

◆ s_testfile1

const char s_testfile1[] = "Test File.txt"
static

Definition at line 254 of file ShellExecCmdLine.cpp.

Referenced by START_TEST().

◆ s_testfile2

const char s_testfile2[] = "Test File.bat"
static

Definition at line 255 of file ShellExecCmdLine.cpp.

Referenced by START_TEST().