Imported Upstream version 9.20
[platform/upstream/7zip.git] / CPP / Windows / Process.cpp
1 // Process.cpp\r
2 \r
3 #include "StdAfx.h"\r
4 \r
5 #include "../Common/StringConvert.h"\r
6 \r
7 #include "Process.h"\r
8 \r
9 #ifndef _UNICODE\r
10 extern bool g_IsNT;\r
11 #endif\r
12 \r
13 namespace NWindows {\r
14 \r
15 static UString GetQuotedString(const UString &s)\r
16 {\r
17   return UString(L'\"') + s + UString(L'\"');\r
18 }\r
19 \r
20 WRes CProcess::Create(LPCWSTR imageName, const UString &params, LPCWSTR curDir)\r
21 {\r
22   Close();\r
23   const UString params2 =\r
24       #ifndef UNDER_CE\r
25       GetQuotedString(imageName) + L' ' +\r
26       #endif\r
27       params;\r
28   #ifdef UNDER_CE\r
29   curDir = 0;\r
30   #else\r
31   imageName = 0;\r
32   #endif\r
33   PROCESS_INFORMATION pi;\r
34   BOOL result;\r
35   #ifndef _UNICODE\r
36   if (!g_IsNT)\r
37   {\r
38     STARTUPINFOA si;\r
39     si.cb = sizeof(si);\r
40     si.lpReserved = 0;\r
41     si.lpDesktop = 0;\r
42     si.lpTitle = 0;\r
43     si.dwFlags = 0;\r
44     si.cbReserved2 = 0;\r
45     si.lpReserved2 = 0;\r
46     \r
47     CSysString curDirA;\r
48     if (curDir != 0)\r
49       curDirA = GetSystemString(curDir);\r
50     result = ::CreateProcessA(NULL, (LPSTR)(LPCSTR)GetSystemString(params2),\r
51         NULL, NULL, FALSE, 0, NULL, ((curDir != 0) ? (LPCSTR)curDirA: 0), &si, &pi);\r
52   }\r
53   else\r
54   #endif\r
55   {\r
56     STARTUPINFOW si;\r
57     si.cb = sizeof(si);\r
58     si.lpReserved = 0;\r
59     si.lpDesktop = 0;\r
60     si.lpTitle = 0;\r
61     si.dwFlags = 0;\r
62     si.cbReserved2 = 0;\r
63     si.lpReserved2 = 0;\r
64     \r
65     result = CreateProcessW(imageName, (LPWSTR)(LPCWSTR)params2,\r
66         NULL, NULL, FALSE, 0, NULL, (LPWSTR)curDir, &si, &pi);\r
67   }\r
68   if (result == 0)\r
69     return ::GetLastError();\r
70   ::CloseHandle(pi.hThread);\r
71   _handle = pi.hProcess;\r
72   return 0;\r
73 }\r
74 \r
75 WRes MyCreateProcess(LPCWSTR imageName, const UString &params)\r
76 {\r
77   CProcess process;\r
78   return process.Create(imageName, params, 0);\r
79 }\r
80 \r
81 }\r