从控制台应用启动控制台应用

时间:2012-09-20 17:01:48

标签: c++ createprocess

我正在使用这段代码从GUI应用程序启动进程。但是,根据此代码的注释,无法从控制台应用程序启动进程。实际上我想这样做,我想要一个控制台应用程序来启动另一个控制台进程,请你知道怎么做吗?

// This technique must be used for "console-less" parents such as GUI
//  applications or detached applications.
// Using the STARTUPINFO STARTF_USESTDHANDLES flag, requires that
//  the CreateProcess fInheritHandles parameter be set TRUE so that
//  the file handles specified in the STARTUPINFO structure will be
//  inherited by the child.

    // setup the child process's handles for stdin, stdout, & stderr.
STARTUPINFO childProcStartupInfo;
memset( &childProcStartupInfo, 0, sizeof(childProcStartupInfo));
childProcStartupInfo.cb = sizeof(childProcStartupInfo);
childProcStartupInfo.hStdInput = hFromParent;   // stdin
childProcStartupInfo.hStdOutput = hToParent;    //  stdout
childProcStartupInfo.hStdError = hToParentDup;  // stderr
childProcStartupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
childProcStartupInfo.wShowWindow = SW_HIDE;

    // Now create the child process, inheriting handles
PROCESS_INFORMATION childProcInfo;  /* for CreateProcess call */

bOk = CreateProcess(
    NULL,           // filename
    pCmdLine,   // full command line for child
    NULL,           // process security descriptor */
    NULL,           // thread security descriptor */
    TRUE,           // inherit handles? Also use if STARTF_USESTDHANDLES */
    0,              // creation flags */
    NULL,           // inherited environment address */
    NULL,           // startup dir; NULL = start in current */
    &childProcStartupInfo,          // pointer to startup info (input) */
    &childProcInfo);            // pointer to process info (output) */ 

3 个答案:

答案 0 :(得分:1)

你尝试shellexecute了吗?我觉得有用..

答案 1 :(得分:0)

您可以尝试: ShellExecute(),ShellExecuteEx(),CreateProcess(),system(),_wsystem()。

还有一些,但其中一个适合你!

就个人而言,我会选择CreateProcess而不是等待进程退出(在google上找到这个例子:http://www.codeproject.com/Tips/333559/CreateProcess-and-wait-for-result)。请注意,system()/ _ wsystem()是最容易使用的,但如果你不小心它们可以被利用!!!

希望它有所帮助! : - )

答案 2 :(得分:0)

试试这段代码:

#include <Windows.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{

    char* app_to_launch=new char[80];
    strcpy(app_to_launch,"app.exe");

    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );


    // Start the child process. 
    if( !CreateProcess( NULL,   // No module name (use command line)
        app_to_launch,        // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        0,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi )           // Pointer to PROCESS_INFORMATION structure
    ) 
    {
        printf( "CreateProcess failed (%d).\n", GetLastError() );

    }


    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );

    return 0;
}