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

Launch console app from console apps

本文关键字:应用程序 控制台 启动      更新时间:2023-10-16

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

您尝试执行shell了吗?我认为这行得通。。

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

还有一些,但其中一个一定对你有用!

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

希望有帮助!:-)

试试这个代码:

#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;
}