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) */ 
4

3 に答える 3

1

shellexecuteを試しましたか?私はそれがうまくいくと思う..

于 2012-09-20T17:47:48.590 に答える
0

試すことができます: ShellExecute()、ShellExecuteEx()、CreateProcess()、system()、_wsystem()。

他にもいくつかありますが、そのうちの 1 つが役に立ちます。

個人的には、CreateProcess を使用し、プロセスが終了するのを待ちます (Google でこの例を見つけました: http://www.codeproject.com/Tips/333559/CreateProcess-and-wait-for-result )。system()/_wsystem() が最も使いやすいですが、注意しないと悪用される可能性があることに注意してください!!!

それが役に立てば幸い!:-)

于 2012-09-20T19:17:32.163 に答える
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;
}
于 2012-09-20T19:26:12.587 に答える