65.9K
CodeProject 正在变化。 阅读更多。
Home

CreateProcess 函数的增强版本

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.57/5 (17投票s)

2004年4月27日

1分钟阅读

viewsIcon

152674

downloadIcon

2815

等待子进程退出,在子进程运行时最小化主窗口,并在子进程退出时自动恢复窗口。

引言

在我的一个程序中,我需要等待一个外部应用程序完成数据处理,并且希望在此期间最小化主窗口,以防止用户在结果可用之前执行任何其他操作。因此,我编写了 CreateProcessEx

CreateProcessEx 函数接受七个参数,但只有前两个是必需的

  • lpAppName:指向以空字符结尾的字符串的指针,该字符串指定要执行的应用程序。该字符串可以指定要执行的应用程序的完整路径和文件名,也可以指定部分名称。

    如果 lpAppNameNULL,则应用程序名称必须是 lpCmdLine 字符串中的第一个空格分隔的标记。

  • lpCmdLine:指向以空字符结尾的字符串的指针,该字符串指定要执行的命令行。此参数可以为 NULL
  • bAppInCmdLine:指示 lpAppName 字符串是否必须用作 lpCmdLine 字符串中的第一个空格分隔的标记。
  • bCompletePath:指示 lpAppName 字符串是否指定必须使用调用进程的路径完成的部分名称。
  • bWaitForProcess:指示调用进程是否必须等待子进程退出。
  • bMinimizeOnWait:指示在子进程运行时是否将最小化主窗口,并在子进程退出时自动恢复。
  • hMainWnd:要最小化的主窗口的句柄。如果 hMainWndNULL,则使用 AfxGetMainWnd()
DWORD CreateProcessEx ( LPCSTR lpAppPath, LPCSTR lpCmdLine, 
    BOOL bAppInCmdLine, BOOL bCompletePath,
    BOOL bWaitForProcess, BOOL bMinimizeOnWait, HWND hMainWnd ) {

    STARTUPINFO startupInfo;
    PROCESS_INFORMATION    processInformation;    

    char szAppPath    [ _MAX_PATH  ];
    char szCmdLine    [ _MAX_PATH  ];
    char drive        [ _MAX_DRIVE ];
    char dir        [ _MAX_DIR   ];
    char name       [ _MAX_FNAME ];
    char ext        [ _MAX_EXT ];

    szAppPath[ 0 ] = '\0';
    szCmdLine[ 0 ] = '\0';
    
    ZeroMemory( &startupInfo, sizeof( STARTUPINFO ));

    startupInfo.cb = sizeof( STARTUPINFO );

    ZeroMemory( &processInformation, sizeof( PROCESS_INFORMATION ));

    if ( bCompletePath ) {

        GetModuleFileName( GetModuleHandle( NULL ), szAppPath, _MAX_PATH );

        _splitpath( szAppPath, drive, dir, NULL, NULL );
        _splitpath( lpAppPath, NULL, NULL, name, ext );

        _makepath ( szAppPath, drive, dir, name, strlen( ext ) ? ext : ".exe" );
    }
    else strcpy( szAppPath, lpAppPath );

    if ( bAppInCmdLine ) {

        strcpy( szCmdLine, "\"" );
        strcat( szCmdLine, szAppPath );
        strcat( szCmdLine, "\"" );
    }

    if ( lpCmdLine ) {

        // We must use quotation marks around the command line (if any)...

        if ( bAppInCmdLine ) strcat( szCmdLine, " \"" );
                        else strcpy( szCmdLine, "\"" );

        strcat( szCmdLine, lpCmdLine );
        strcat( szCmdLine, "\"" );
    }

    DWORD dwExitCode = -1;
           
    if ( CreateProcess(    bAppInCmdLine ? NULL: szAppPath,    // lpszImageName
                        szCmdLine,                            // lpszCommandLine
                        0,                                    // lpsaProcess
                        0,                                    // lpsaThread
                        FALSE,                                // fInheritHandles
                        DETACHED_PROCESS,                    // fdwCreate
                        0,                                    // lpvEnvironment
                        0,                                    // lpszCurDir
                        &startupInfo,                        // lpsiStartupInfo
                        &processInformation                    // lppiProcInfo
                    )) {

        if ( bWaitForProcess ) {

            if ( bMinimizeOnWait )
                    
                if ( IsWindow( hMainWnd )) ShowWindow( hMainWnd, SW_MINIMIZE );
                #ifdef __AFX_H__
                else AfxGetMainWnd()->ShowWindow( SW_MINIMIZE );
                #endif

            WaitForSingleObject( processInformation.hProcess, INFINITE );

            if ( bMinimizeOnWait )

                if ( IsWindow( hMainWnd )) ShowWindow( hMainWnd, SW_RESTORE );
                #ifdef __AFX_H__
                else AfxGetMainWnd()->ShowWindow( SW_RESTORE );
                #endif

            GetExitCodeProcess( processInformation.hProcess, &dwExitCode );
        }
        else {

            CloseHandle( processInformation.hThread );
            CloseHandle( processInformation.hProcess );

            dwExitCode = 0;
        }
    }

    return dwExitCode;
}

要使用该函数,只需将 CreateProcessEx.hCreateProcessEx.cpp 文件包含在您的项目中即可。就这些了!

© . All rights reserved.