2012-09-20 274 views
0

我正在使用这段代码从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) */ 
+0

创建从一个控制台应用程序(或任何其他应用程序)一个子进程是微不足道的。这样做同时继承stdout,stdin和stderr重定向的句柄完全是另一个问题,并且似乎是此代码的要点(和错误)。你可能想先阅读。 – WhozCraig

+0

嗨克雷格,谢谢你的回复,但你有一段代码如何调用从控制台应用程序启动子进程?谢谢! – user1681210

+0

*您*有一段代码启动子进程。你*没有*是一段代码,它以你想要的方式设置句柄继承。为此,我将你转到我的事先评论。 – WhozCraig

回答

0

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

还有一些,但其中一个为你工作!

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

希望它有帮助! :-)

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; 
} 
+0

也许免费* app_to_launch * ptr(或者只是自动)。 – WhozCraig

相关问题