void Process::Start (/*[in]*/ const char * lpszFileName, /*[in]*/ const char * lpszArguments, /*[in]*/ FILE * pFileStandardInput, /*[out]*/ FILE ** ppFileStandardInput, /*[out]*/ FILE ** ppFileStandardOutput, /*[out]*/ FILE ** ppFileStandardError, /*[in]*/ const char * lpszWorkingDirectory) { MIKTEX_ASSERT_STRING (lpszFileName); MIKTEX_ASSERT_STRING_OR_NIL (lpszArguments); MIKTEX_ASSERT_STRING_OR_NIL (lpszWorkingDirectory); MIKTEX_ASSERT (pFileStandardInput == 0 || ppFileStandardInput == 0); ProcessStartInfo startinfo; startinfo.FileName = lpszFileName; if (lpszArguments != 0) { startinfo.Arguments = lpszArguments; } startinfo.StandardInput = pFileStandardInput; startinfo.RedirectStandardInput = (pFileStandardInput == 0 && ppFileStandardInput != 0); startinfo.RedirectStandardOutput = (ppFileStandardOutput != 0); startinfo.RedirectStandardError = (ppFileStandardError != 0); if (lpszWorkingDirectory != 0) { startinfo.WorkingDirectory = lpszWorkingDirectory; } auto_ptr<Process> pProcess (Process::Start(startinfo)); if (ppFileStandardInput != 0) { *ppFileStandardInput = pProcess->get_StandardInput(); } if (ppFileStandardOutput != 0) { *ppFileStandardOutput = pProcess->get_StandardOutput(); } if (ppFileStandardError != 0) { *ppFileStandardError = pProcess->get_StandardError(); } pProcess->Close (); }
void InternalScriptExports::AttachScriptProcess(LuaPlus::LuaObject scriptProcess) { LuaPlus::LuaObject temp = scriptProcess.Lookup("__object"); if (!temp.IsNil()) { shared_ptr<Process> pProcess(static_cast<Process*>(temp.GetLightUserData())); g_pApp->m_pGame->AttachProcess(pProcess); } else { GCC_ERROR("Couldn't find __object in script process"); } }
vector<string> Process2::GetInvokerNames () { vector<string> result; auto_ptr<Process2> pProcess (Process2::GetCurrentProcess()); auto_ptr<Process2> pParentProcess (pProcess->get_Parent()); const int maxLevels = 3; int level = 0; for (int level = 0; pParentProcess.get() != 0 && level < maxLevels; ++ level) { result.push_back (pParentProcess->get_ProcessName()); pParentProcess.reset (pParentProcess->get_Parent()); } if (pParentProcess.get() != 0) { result.push_back ("..."); } reverse (result.begin(), result.end()); return (result); }
bool Process::Run (/*[in]*/ const PathName & fileName, /*[in]*/ const char * lpszArguments, /*[out]*/ IRunProcessCallback * pCallback, /*[out]*/ int * pExitCode, /*[in]*/ const char * lpszWorkingDirectory) { MIKTEX_ASSERT_STRING_OR_NIL (lpszArguments); MIKTEX_ASSERT_STRING_OR_NIL (lpszWorkingDirectory); ProcessStartInfo startinfo; startinfo.FileName = fileName.Get(); if (lpszArguments != 0) { startinfo.Arguments = lpszArguments; } startinfo.StandardInput = 0; startinfo.RedirectStandardInput = false; startinfo.RedirectStandardOutput = (pCallback != 0); startinfo.RedirectStandardError = false; if (lpszWorkingDirectory != 0) { startinfo.WorkingDirectory = lpszWorkingDirectory; } auto_ptr<Process> pProcess (Process::Start(startinfo)); if (pCallback != 0) { SessionImpl::GetSession()->trace_process->WriteLine ("core", T_("start reading the pipe")); const size_t CHUNK_SIZE = 64; char buf[ CHUNK_SIZE ]; bool cancelled = false; FileStream stdoutStream (pProcess->get_StandardOutput()); size_t total = 0; while (! cancelled && feof(stdoutStream.Get()) == 0) { size_t n = fread(buf, 1, CHUNK_SIZE, stdoutStream.Get()); int err = ferror(stdoutStream.Get()); if (err != 0 && err != EPIPE) { FATAL_CRT_ERROR ("fread", 0); } // pass output to caller total += n; cancelled = ! pCallback->OnProcessOutput(buf, n); } SessionImpl::GetSession()->trace_process->WriteFormattedLine ("core", T_("read %u bytes from the pipe"), static_cast<unsigned>(total)); } // wait for the process to finish pProcess->WaitForExit (); // get the exit code & close process int exitCode = pProcess->get_ExitCode(); pProcess->Close (); if (pExitCode != 0) { *pExitCode = exitCode; return (true); } else if (exitCode == 0) { return (true); } else { TraceError (T_("%s returned %d"), Q_(fileName), static_cast<int>(exitCode)); return (false); } }