Visual C++ 7.1Visual Studio 6Visual C++ 7.0Windows 2003Windows 2000Visual C++ 6.0Windows XPMFC中级开发Visual StudioWindowsC++
CreateProcess 函数的增强版本






4.57/5 (17投票s)
2004年4月27日
1分钟阅读

152674

2815
等待子进程退出,在子进程运行时最小化主窗口,并在子进程退出时自动恢复窗口。
引言
在我的一个程序中,我需要等待一个外部应用程序完成数据处理,并且希望在此期间最小化主窗口,以防止用户在结果可用之前执行任何其他操作。因此,我编写了 CreateProcessEx
。
CreateProcessEx
函数接受七个参数,但只有前两个是必需的
lpAppName
:指向以空字符结尾的字符串的指针,该字符串指定要执行的应用程序。该字符串可以指定要执行的应用程序的完整路径和文件名,也可以指定部分名称。如果
lpAppName
为NULL
,则应用程序名称必须是lpCmdLine
字符串中的第一个空格分隔的标记。lpCmdLine
:指向以空字符结尾的字符串的指针,该字符串指定要执行的命令行。此参数可以为NULL
。bAppInCmdLine
:指示lpAppName
字符串是否必须用作lpCmdLine
字符串中的第一个空格分隔的标记。bCompletePath
:指示lpAppName
字符串是否指定必须使用调用进程的路径完成的部分名称。bWaitForProcess
:指示调用进程是否必须等待子进程退出。bMinimizeOnWait
:指示在子进程运行时是否将最小化主窗口,并在子进程退出时自动恢复。hMainWnd
:要最小化的主窗口的句柄。如果hMainWnd
为NULL
,则使用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.h 和 CreateProcessEx.cpp 文件包含在您的项目中即可。就这些了!