1*f6dc9357SAndroid Build Coastguard Worker // ProcessUtils.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #include "../Common/StringConvert.h"
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #include "ProcessUtils.h"
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
10*f6dc9357SAndroid Build Coastguard Worker extern bool g_IsNT;
11*f6dc9357SAndroid Build Coastguard Worker #endif
12*f6dc9357SAndroid Build Coastguard Worker
13*f6dc9357SAndroid Build Coastguard Worker namespace NWindows {
14*f6dc9357SAndroid Build Coastguard Worker
15*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
GetQuotedString(const UString & s)16*f6dc9357SAndroid Build Coastguard Worker static UString GetQuotedString(const UString &s)
17*f6dc9357SAndroid Build Coastguard Worker {
18*f6dc9357SAndroid Build Coastguard Worker UString s2 ('\"');
19*f6dc9357SAndroid Build Coastguard Worker s2 += s;
20*f6dc9357SAndroid Build Coastguard Worker s2.Add_Char('\"');
21*f6dc9357SAndroid Build Coastguard Worker return s2;
22*f6dc9357SAndroid Build Coastguard Worker }
23*f6dc9357SAndroid Build Coastguard Worker #endif
24*f6dc9357SAndroid Build Coastguard Worker
Create(LPCWSTR imageName,const UString & params,LPCWSTR curDir)25*f6dc9357SAndroid Build Coastguard Worker WRes CProcess::Create(LPCWSTR imageName, const UString ¶ms, LPCWSTR curDir)
26*f6dc9357SAndroid Build Coastguard Worker {
27*f6dc9357SAndroid Build Coastguard Worker /*
28*f6dc9357SAndroid Build Coastguard Worker OutputDebugStringW(L"CProcess::Create");
29*f6dc9357SAndroid Build Coastguard Worker OutputDebugStringW(imageName);
30*f6dc9357SAndroid Build Coastguard Worker if (params)
31*f6dc9357SAndroid Build Coastguard Worker {
32*f6dc9357SAndroid Build Coastguard Worker OutputDebugStringW(L"params:");
33*f6dc9357SAndroid Build Coastguard Worker OutputDebugStringW(params);
34*f6dc9357SAndroid Build Coastguard Worker }
35*f6dc9357SAndroid Build Coastguard Worker if (curDir)
36*f6dc9357SAndroid Build Coastguard Worker {
37*f6dc9357SAndroid Build Coastguard Worker OutputDebugStringW(L"cur dir:");
38*f6dc9357SAndroid Build Coastguard Worker OutputDebugStringW(curDir);
39*f6dc9357SAndroid Build Coastguard Worker }
40*f6dc9357SAndroid Build Coastguard Worker */
41*f6dc9357SAndroid Build Coastguard Worker
42*f6dc9357SAndroid Build Coastguard Worker Close();
43*f6dc9357SAndroid Build Coastguard Worker const UString params2 =
44*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
45*f6dc9357SAndroid Build Coastguard Worker GetQuotedString(imageName) + L' ' +
46*f6dc9357SAndroid Build Coastguard Worker #endif
47*f6dc9357SAndroid Build Coastguard Worker params;
48*f6dc9357SAndroid Build Coastguard Worker #ifdef UNDER_CE
49*f6dc9357SAndroid Build Coastguard Worker curDir = NULL;
50*f6dc9357SAndroid Build Coastguard Worker #else
51*f6dc9357SAndroid Build Coastguard Worker imageName = NULL;
52*f6dc9357SAndroid Build Coastguard Worker #endif
53*f6dc9357SAndroid Build Coastguard Worker PROCESS_INFORMATION pi;
54*f6dc9357SAndroid Build Coastguard Worker BOOL result;
55*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
56*f6dc9357SAndroid Build Coastguard Worker if (!g_IsNT)
57*f6dc9357SAndroid Build Coastguard Worker {
58*f6dc9357SAndroid Build Coastguard Worker STARTUPINFOA si;
59*f6dc9357SAndroid Build Coastguard Worker si.cb = sizeof(si);
60*f6dc9357SAndroid Build Coastguard Worker si.lpReserved = NULL;
61*f6dc9357SAndroid Build Coastguard Worker si.lpDesktop = NULL;
62*f6dc9357SAndroid Build Coastguard Worker si.lpTitle = NULL;
63*f6dc9357SAndroid Build Coastguard Worker si.dwFlags = 0;
64*f6dc9357SAndroid Build Coastguard Worker si.cbReserved2 = 0;
65*f6dc9357SAndroid Build Coastguard Worker si.lpReserved2 = NULL;
66*f6dc9357SAndroid Build Coastguard Worker
67*f6dc9357SAndroid Build Coastguard Worker CSysString curDirA;
68*f6dc9357SAndroid Build Coastguard Worker if (curDir != 0)
69*f6dc9357SAndroid Build Coastguard Worker curDirA = GetSystemString(curDir);
70*f6dc9357SAndroid Build Coastguard Worker const AString s = GetSystemString(params2);
71*f6dc9357SAndroid Build Coastguard Worker result = ::CreateProcessA(NULL, s.Ptr_non_const(),
72*f6dc9357SAndroid Build Coastguard Worker NULL, NULL, FALSE, 0, NULL, ((curDir != 0) ? (LPCSTR)curDirA: 0), &si, &pi);
73*f6dc9357SAndroid Build Coastguard Worker }
74*f6dc9357SAndroid Build Coastguard Worker else
75*f6dc9357SAndroid Build Coastguard Worker #endif
76*f6dc9357SAndroid Build Coastguard Worker {
77*f6dc9357SAndroid Build Coastguard Worker STARTUPINFOW si;
78*f6dc9357SAndroid Build Coastguard Worker si.cb = sizeof(si);
79*f6dc9357SAndroid Build Coastguard Worker si.lpReserved = NULL;
80*f6dc9357SAndroid Build Coastguard Worker si.lpDesktop = NULL;
81*f6dc9357SAndroid Build Coastguard Worker si.lpTitle = NULL;
82*f6dc9357SAndroid Build Coastguard Worker si.dwFlags = 0;
83*f6dc9357SAndroid Build Coastguard Worker si.cbReserved2 = 0;
84*f6dc9357SAndroid Build Coastguard Worker si.lpReserved2 = NULL;
85*f6dc9357SAndroid Build Coastguard Worker
86*f6dc9357SAndroid Build Coastguard Worker result = CreateProcessW(imageName, params2.Ptr_non_const(),
87*f6dc9357SAndroid Build Coastguard Worker NULL, NULL, FALSE, 0, NULL, curDir, &si, &pi);
88*f6dc9357SAndroid Build Coastguard Worker }
89*f6dc9357SAndroid Build Coastguard Worker if (result == 0)
90*f6dc9357SAndroid Build Coastguard Worker return ::GetLastError();
91*f6dc9357SAndroid Build Coastguard Worker ::CloseHandle(pi.hThread);
92*f6dc9357SAndroid Build Coastguard Worker _handle = pi.hProcess;
93*f6dc9357SAndroid Build Coastguard Worker return 0;
94*f6dc9357SAndroid Build Coastguard Worker }
95*f6dc9357SAndroid Build Coastguard Worker
MyCreateProcess(LPCWSTR imageName,const UString & params)96*f6dc9357SAndroid Build Coastguard Worker WRes MyCreateProcess(LPCWSTR imageName, const UString ¶ms)
97*f6dc9357SAndroid Build Coastguard Worker {
98*f6dc9357SAndroid Build Coastguard Worker CProcess process;
99*f6dc9357SAndroid Build Coastguard Worker return process.Create(imageName, params, NULL);
100*f6dc9357SAndroid Build Coastguard Worker }
101*f6dc9357SAndroid Build Coastguard Worker
102*f6dc9357SAndroid Build Coastguard Worker }
103