示例#1
0
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 ();
}
示例#2
0
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");
	}
}
示例#3
0
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);
}
示例#4
0
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);
    }
}