Solved

Process.Exitcode returns wrong value

Posted on 2013-11-15
6
501 Views
Last Modified: 2013-11-19
I've written a C# class that calls a DOS application in the context of a Process. The problem is that Process.Exitcode always returns 0 indicating success even if the DOS program fails. I've run this DOS application in a batch file from a command prompt, and I know it returns an error code. Here's my setup for the process:

        public void Start()
        {
            m_isDone = false;
            m_result = 0;
            m_isStandardOutputDone = false;
            m_isErrorOutputDone = false;
            m_consoleProcess = new Process();
            m_consoleProcess.StartInfo.FileName = m_command;
            m_consoleProcess.StartInfo.Arguments = m_commandArguments;
            m_consoleProcess.StartInfo.UseShellExecute = false;
            m_consoleProcess.StartInfo.CreateNoWindow = true;
            m_consoleProcess.StartInfo.RedirectStandardOutput = true;
            m_consoleProcess.StartInfo.RedirectStandardError = true;
            m_consoleProcess.OutputDataReceived += StandardOutputEventHandler;
            m_consoleProcess.ErrorDataReceived += ErrorOutputEventHandler;
            m_consoleProcess.Start();
            m_consoleProcess.BeginOutputReadLine();
            m_consoleProcess.BeginErrorReadLine();
        }

And the standard output event handler:

        private void StandardOutputEventHandler(object sendingProcess, DataReceivedEventArgs eventArgs)
        {
            String output = eventArgs.Data;
            if ( !String.IsNullOrEmpty(output) )
            {
                // Notify standard output event subscribers that there's new text.
                StandardOutputEvent(this, eventArgs);
            }
            else
            if ( (output == null) && m_consoleProcess.HasExited )
            {
                m_isStandardOutputDone = true;

                if ( m_isErrorOutputDone && !m_isDone )
                {
                    // Signal process completion.
                    m_isDone = true;
                    m_result = m_consoleProcess.Exitcode;
                    EventArgs e = new EventArgs();
                    if ( ProcessDoneEvent != null )
                    {
                        ProcessDoneEvent(this, e);
                    }
                }
            }
        }

It's here in the standard output event handler that I determine whether the process has completed and record the exit code. This works well, except that the exit code doesn't represent the correct output of the DOS program. How do I obtain the correct exit code?
0
Comment
Question by:alconlabs
  • 3
  • 2
6 Comments
 
LVL 96

Expert Comment

by:Bob Learned
ID: 39653357
It doesn't look like you are waiting for the process to end, so the ExitCode won't be set yet.
0
 

Author Comment

by:alconlabs
ID: 39653940
m_consoleProcess.HasExited is true, so I assume the process has ended. The documentation for HasExited would seem to imply that if HasExited is true, it's safe to query the ExitCode and ExitTime properties, no?
0
 
LVL 96

Accepted Solution

by:
Bob Learned earned 500 total points
ID: 39653964
As a test, you can try Process.WaitForExit, and see if the ExitCode is set.
0
IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 
LVL 23

Expert Comment

by:Ioannis Paraskevopoulos
ID: 39654127
I think you could store the exit code of the DOS app, and just 'return' it from your main sub.
0
 

Author Comment

by:alconlabs
ID: 39661333
WaitForExit didn't return, and the event handler for the Exited event didn't fire. Turns out I need to set EnableRaisingEvents to get these to work (though OutputDataReceived and ErrorDataReceived events work just fine without it). I'll give the points to TheLearnedOne since he got me headed down the right path.
0
 
LVL 96

Expert Comment

by:Bob Learned
ID: 39661340
Aah, yes, the needle-in-the-haystack...glad you found it.
0

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

In order to hide the "ugly" records selectors (triangles) in the rowheaders, here are some suggestions. Microsoft doesn't have a direct method/property to do it. You can only hide the rowheader column. First solution, the easy way The first sol…
Summary: Persistence is the capability of an application to store the state of objects and recover it when necessary. This article compares the two common types of serialization in aspects of data access, readability, and runtime cost. A ready-to…
Get a first impression of how PRTG looks and learn how it works.   This video is a short introduction to PRTG, as an initial overview or as a quick start for new PRTG users.
This video demonstrates how to create an example email signature rule for a department in a company using CodeTwo Exchange Rules. The signature will be inserted beneath users' latest emails in conversations and will be displayed in users' Sent Items…

707 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now