LocalProcess.patch
LocalProcess.cpp (working copy) | ||
---|---|---|
66 | 66 |
#endif |
67 | 67 |
|
68 | 68 |
#ifdef PLATFORM_WIN32 |
69 |
bool Win32CreateProcess(const char *command, const char *envptr, STARTUPINFOW& si, PROCESS_INFORMATION& pi) |
|
69 |
bool Win32CreateProcess(const char *command, const char *envptr, STARTUPINFOW& si, PROCESS_INFORMATION& pi, const char *processWorkDirectory)
|
|
70 | 70 |
{ // provides conversion of charset for cmdline and envptr |
71 | 71 |
WString wcmd(command); |
72 |
WString wpwd(processWorkDirectory); |
|
72 | 73 |
int n = wcmd.GetCount() + 1; |
73 | 74 |
Buffer<wchar> cmd(n); |
74 | 75 |
memcpy(cmd, wcmd, n * sizeof(wchar)); |
... | ... | |
84 | 85 |
memcpy(env, wenv, (len + 2) * sizeof(wchar)); |
85 | 86 |
} |
86 | 87 |
#endif |
87 |
return CreateProcessW(NULL, cmd, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, (void *)envptr, NULL, &si, &pi);
|
|
88 |
return CreateProcessW(NULL, cmd, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, (void *)envptr, wpwd, &si, &pi);
|
|
88 | 89 |
} |
89 | 90 |
#endif |
90 | 91 |
|
91 |
bool LocalProcess::DoStart(const char *command, const Vector<String> *arg, bool spliterr, const char *envptr) |
|
92 |
bool LocalProcess::DoStart(const char *command, const Vector<String> *arg, bool spliterr, const char *envptr, const char *processWorkDirectory)
|
|
92 | 93 |
{ |
93 | 94 |
LLOG("LocalProcess::Start(\"" << command << "\")"); |
94 | 95 |
|
... | ... | |
173 | 174 |
} |
174 | 175 |
command = cmdh; |
175 | 176 |
} |
176 |
bool h = Win32CreateProcess(command, envptr, si, pi); |
|
177 |
bool h = Win32CreateProcess(command, envptr, si, pi, processWorkDirectory);
|
|
177 | 178 |
LLOG("CreateProcess " << (h ? "succeeded" : "failed")); |
178 | 179 |
CloseHandle(hErrorWrite); |
179 | 180 |
CloseHandle(hInputRead); |
... | ... | |
338 | 339 |
LLOG("[" << a << "]: <" << (args[a] ? args[a] : "NULL") << ">"); |
339 | 340 |
#endif//DO_LLOG |
340 | 341 |
|
342 |
if(processWorkDirectory) |
|
343 |
chdir(processWorkDirectory); |
|
341 | 344 |
LLOG("running execve, app = " << app << ", #args = " << args.GetCount()); |
342 | 345 |
if(envptr) { |
343 | 346 |
const char *from = envptr; |
LocalProcess.h (working copy) | ||
---|---|---|
58 | 58 |
|
59 | 59 |
typedef LocalProcess CLASSNAME; |
60 | 60 |
|
61 |
bool DoStart(const char *cmdline, const Vector<String> *arg, bool spliterr, const char *envptr = NULL); |
|
61 |
bool DoStart(const char *cmdline, const Vector<String> *arg, bool spliterr, const char *envptr = NULL, const char *processWorkDirectory = NULL);
|
|
62 | 62 |
|
63 | 63 |
public: |
64 |
bool Start(const char *cmdline, const char *envptr = NULL) { return DoStart(cmdline, NULL, false, envptr); }
|
|
65 |
bool Start2(const char *cmdline, const char *envptr = NULL) { return DoStart(cmdline, NULL, true, envptr); }
|
|
64 |
bool Start(const char *cmdline, const char *envptr = NULL, const char *processWorkDirectory = NULL) { return DoStart(cmdline, NULL, false, envptr, processWorkDirectory); }
|
|
65 |
bool Start2(const char *cmdline, const char *envptr = NULL, const char *processWorkDirectory = NULL) { return DoStart(cmdline, NULL, true, envptr, processWorkDirectory); }
|
|
66 | 66 |
|
67 |
bool Start(const char *cmd, const Vector<String>& arg, const char *envptr = NULL) { return DoStart(cmd, &arg, false, envptr); }
|
|
68 |
bool Start2(const char *cmd, const Vector<String>& arg, const char *envptr = NULL) { return DoStart(cmd, &arg, true, envptr); }
|
|
67 |
bool Start(const char *cmd, const Vector<String>& arg, const char *envptr = NULL, const char *processWorkDirectory = NULL) { return DoStart(cmd, &arg, false, envptr, processWorkDirectory); }
|
|
68 |
bool Start2(const char *cmd, const Vector<String>& arg, const char *envptr = NULL, const char *processWorkDirectory = NULL) { return DoStart(cmd, &arg, true, envptr, processWorkDirectory); }
|
|
69 | 69 |
|
70 | 70 |
#ifdef PLATFORM_POSIX |
71 | 71 |
LocalProcess& DoubleFork(bool b = true) { doublefork = b; return *this; } |