想用creatprocess或者shellexecute 来执行一个命令 怎么写
本帖最后由 empshoot 于 2013-11-12 22:11:22 编辑 比如我想执行 7za.exe a D:\\test.zip D:\\test 怎么写
还有我想不要出现那个一闪而过黑框 还有怎么知道执行完了没有
求指导
[解决办法]
给你点代码吧。
启动一个Windows控制台进程,并将其输出转向。
截获目标进程输出的方式:
1、等待目标进程结束后读取缓冲区,并更新。
2、随时读取缓冲区并追加更新到指定输出。(但每次读之前需要清除缓冲区,否则输出重叠)
unsigned long SomeThread( LPVOID pVoid )
{
char Buffer [ 4096 ];
DWORD dwExit = 1;
HANDLE hReadPipe = NULL;
HANDLE hWritePipe = NULL;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof( SECURITY_ATTRIBUTES );
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
CString szCurPath = pDlg->GetFilePath();
STARTUPINFO StartupInfo = { sizeof(StartupInfo) };
PROCESS_INFORMATION ProcessInfo = { 0 };
TCHAR szCommandLine[ 256 ]; // = _T("c:\\windows\\system32\\cmd.exe /c dir");
_tcscpy_s( szCommandLine, 256, ( szCurPath + _T("VPNRel.EXE")));
ZeroMemory( Buffer, 4096 );
if( ! CreatePipe( &hReadPipe, &hWritePipe, &sa, 0 ))
{
goto EXIT_THREAD;
}
StartupInfo.cb = sizeof( STARTUPINFO );
GetStartupInfo( &StartupInfo );
StartupInfo.hStdError = hWritePipe;
StartupInfo.hStdOutput = hWritePipe;
StartupInfo.wShowWindow = SW_HIDE;
StartupInfo.dwFlags = STARTF_USESHOWWINDOW
[解决办法]
STARTF_USESTDHANDLES;
if( ! CreateProcess( NULL, szCommandLine, NULL, NULL, TRUE, 0, NULL, szCurPath, &StartupInfo, &ProcessInfo ))
{
goto EXIT_THREAD;
}
// - 创建目标进程成功,开始等待目标进程结束并监视其输出
// ----------------------------目标进程输出-------------------------------
CloseHandle( hWritePipe );
hWritePipe = NULL;
while( dwExit )
{
DWORD dwWait = WaitForSingleObject( ProcessInfo.hProcess, 200 );
DWORD dwReaded;
ZeroMemory( Buffer, sizeof( Buffer )); // Cleaer Buffer.
if( ReadFile( hReadPipe, Buffer, 4095, &dwReaded, NULL ) == false )
{
if( dwWait == WAIT_TIMEOUT )
continue;
else
break;
}
else
{
#ifdef _UNICODE
TCHAR szWBuffer[ 4096 ];
ZeroMemory( szWBuffer, sizeof( TCHAR ) * 4096 );
MultiByteToWideChar( CP_ACP, 0, Buffer, -1, szWBuffer, 4095 );
APPEND( szWBuffer ); // == m_strSomeEdit += szWBuffer; UpdateData( false );
#else
APPEND( Buffer ); // == m_strSomeEdit += Buffer; UpdateData( false );
#endif
}
if( dwWait == WAIT_OBJECT_0 )
break;
}
//--------------------------目标进程已经结束------------------------------
EXIT_THREAD:
if( ProcessInfo.hProcess != NULL )
CloseHandle( ProcessInfo.hProcess );
if( hWritePipe != NULL )
CloseHandle( hWritePipe );
if( hReadPipe != NULL )
CloseHandle( hReadPipe );
pDlg->m_hThread = NULL;
return 0;
}