Kinzoku31 Temat założony przez niniejszego użytkownika |
system(polecenia) » 2016-04-16 10:12:23 jak przechwycić kontrolę nad wyjściem CMD? #include <iostream> #include <cstdlib>
int main() { std::cout << system("kurcze"); return 0; } to zwraca int a ja potrzebuje mieć w stringu komunikat który CMD zwraca czyli tutaj 'kurcze' is not recognized...
|
|
j23 |
» 2016-04-16 10:32:07 Jedyne co mi przychodzi do głowy, to odpalenie cmd.exe z przekierowanymi standardowymi we/wy. Poczytaj o CreateProcess i CreatePipe. |
|
Kinzoku31 Temat założony przez niniejszego użytkownika |
» 2016-04-18 23:14:56 Problem leży tu, że nie mam pojęcia skąd wytrzasnąć stringa który zawiera informacje zwrotną cmd, proces udało mi się stworzyć ale na typach windowsa sie slabo znam |
|
michal11 |
» 2016-04-19 00:57:28 |
|
Kinzoku31 Temat założony przez niniejszego użytkownika |
» 2016-04-19 20:11:13 Wszystko pięknie jak ma się C++11, a w moim ulubionym kompilatorze nie ma i jedyne co mi się udało wymyślić to: #include <string> #include <iostream> #include <stdio.h> #include <windows.h>
std::string exec( const char * cmd ) { FILE * pipe = _popen( cmd, "r" ); if( !pipe ) return "ERROR"; char buffer[ MAX_PATH ]; std::string result = ""; while( !feof( pipe ) ) { if( fgets( buffer, MAX_PATH, pipe ) != NULL ) { result += buffer; std::cout << "result" << "-result"; } } _pclose( pipe ); return result; }
int main() { std::string lol = exec( "shutdown -a" ); std::cout << lol << "-\n" << lol; std::cin.get(); return 0; } I tak działa że lol jest puste |
|
j23 |
» 2016-04-20 14:39:37 Tu masz na szybko machniętą prze mnie funkcję, o której mowa. Pewnie można by ją jakoś dopracować, ale nie chce mi się już w tym dłubać. Kod wyjściowy masz, reszta zależy od Ciebie ;) std::string exec_cmd( const std::string cmd ) { HANDLE p_out_read, p_out_write, p_err_write; STARTUPINFOA startup_info; PROCESS_INFORMATION proc_info; SECURITY_ATTRIBUTES sats; sats.nLength = sizeof( sats ); sats.bInheritHandle = TRUE; sats.lpSecurityDescriptor = NULL; CreatePipe( & p_out_read, & p_out_write, & sats, 0 ); DuplicateHandle( GetCurrentProcess(), p_out_write, GetCurrentProcess(), & p_err_write, 0, TRUE, DUPLICATE_SAME_ACCESS ); memset( & startup_info, 0, sizeof( startup_info ) ); startup_info.cb = sizeof( startup_info ); startup_info.dwFlags = STARTF_USESTDHANDLES; startup_info.hStdOutput = p_out_write; startup_info.hStdError = p_err_write; startup_info.wShowWindow = SW_HIDE; std::string result; std::string comm_line; comm_line = getenv( "comspec" ); comm_line += " /c "; comm_line += cmd; std::vector < char > comm_line_buff( comm_line.begin(), comm_line.end() ); comm_line_buff.push_back( 0 ); if( CreateProcessA( NULL, & comm_line_buff.front(), NULL, NULL, TRUE, 0, NULL, NULL, & startup_info, & proc_info ) ) { char buff[ 1024 + 1 ]; DWORD read = 0; DWORD bytes_avail; while( PeekNamedPipe( p_out_read, NULL, 0, NULL, & bytes_avail, NULL ) ) { read = 0; if( bytes_avail > 0 && ReadFile( p_out_read, buff, std::min < DWORD >( 1024, bytes_avail ), & read, NULL ) ) { buff[ read ] = 0; result += buff; } else if( WaitForSingleObject( proc_info.hProcess, 0 ) != WAIT_TIMEOUT ) { break; } } CloseHandle( proc_info.hProcess ); } CloseHandle( p_err_write ); CloseHandle( p_out_read ); CloseHandle( p_out_write ); return result; } std::cout << exec_cmd( "dir c:\\" ) << '\n'; std::cout << exec_cmd( "ping www.wp.pl" ) << '\n';
|
|
Kinzoku31 Temat założony przez niniejszego użytkownika |
» 2016-04-22 15:05:32 Dziękuję bardzo, jest Pan wielki :D |
|
« 1 » |