This question comes up at least once a week in the Microsoft public newsgroups. It seems simple, but there are many options for running another program, and the differences between them can be subtle. Basically, the available methods are as follows :
|System||Passes a command to the command interpreter (CMD.EXE). The simplest way of getting something done, but you might not like the "DOS" box that pops up when you invoke it.|
|_spawn||Part of the C runtime, _spawn is actually a family of functions - see the runtime library help for details. Because it's part of the CRT, it is at least portable.|
|WinExec||Obsolete in the 32-bit world, included only for compatibility with 16 bit code.|
|ShellExecute||Part of the Win32 API, ShellExecute is the simple launching API of choice for the foreseeable future, because it automatically checks against file type associations, so you can ShellExecute a data file and it will automatically invoke the associated executable.|
|ShellExecuteEx||Essentially the same as ShellExecute, but takes a structure for a little more flexibility. One notable extra feature is that the Ex version allows you to get a handle to the created process.|
|CreateProcess||This is how real men launch their processes :-). CreateProcess is the underlying API for starting another process, and give maximum power at the expense of being a little more troublesome to drive.|
The last two functions have the advantage that you can get a process handle back from them and then wait on that handle, allowing you to invoke another process synchronously : so you can invoke another process, have that process run to completion, and then your original process resumes, knowing that the child process at least ran (you have to invent your own mechanism for finding out whether the child did what it was supposed to, of course).
One problem can arise with this "spawn and wait" technique - see Tip #34 for details.