Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

system(polecenia)

Ostatnio zmodyfikowano 2016-04-22 15:05
Autor Wiadomość
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...
P-147317
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.
P-147318
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
P-147417
michal11
» 2016-04-19 00:57:28
P-147419
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:
C/C++
#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"; } //to sie wgl nie wyswietla
    }
    _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
P-147441
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 ;)
C/C++
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;
}

C/C++
//przykładowe użycie
std::cout << exec_cmd( "dir c:\\" ) << '\n';
std::cout << exec_cmd( "ping www.wp.pl" ) << '\n';
P-147464
Kinzoku31
Temat założony przez niniejszego użytkownika
» 2016-04-22 15:05:32
Dziękuję bardzo, jest Pan wielki :D
P-147542
« 1 »
  Strona 1 z 1