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

problem z _popen()

Ostatnio zmodyfikowano 2013-03-18 11:30
Autor Wiadomość
luky92
Temat założony przez niniejszego użytkownika
problem z _popen()
» 2013-03-17 19:48:56
Tak jak napisałem w temacie mam program w WINAPI (nakładka GUI na wybrane polecenia dosa) do przechwytywania wyjścia z konsoli wykorzystuje  funkcje _popen() niestety aplikacja nie działa na Windows XP (na Viście i Win 7 działa bezproblemowo) w jaki sposób przystosować aplikacje do działania w Win XP (bez pokazywania konsoli)??

To mój pierwszy temat jeżeli jest w złym dziale proszę moda przeniesienie
P-78679
mactec
» 2013-03-17 20:00:13
Jeśli nie chcesz mieć konsoli to dodaj w linkerze -mwindows.
P-78684
luky92
Temat założony przez niniejszego użytkownika
» 2013-03-17 20:10:32
nie chodzi tylko o ukrycie konsoli chodzi o to żeby po wykonaniu polecenia to co normalnie wypisuje sie w konsoli wyszło do messageboxa jedna z funkcji wygląda tak

C/C++
void usertogroupdomain( string b, string c )
{
    string a, s, w, d, x, e;
    a = "net group";
    s = " ";
    x = "\"";
    d = "/add";
    e = "/domain";
    w = a + s + x + c + x + s + x + b + x + s + d + s + e;
    string testt;
    FILE * pPipe;
   
    /* Run DIR so that it writes its output to a pipe. Open this
             * pipe with read text attribute so that we can read it
             * like a text file.
             */
   
    if(( pPipe = _popen( w.c_str(), "rt" ) ) == NULL ) {
       
        exit( 1 );
    }
    /* Read pipe until end of file. */
   
    while( !feof( pPipe ) )
    {
        if( fgets( psBuffer, 1280, pPipe ) != NULL )
        {
           
            testt = testt + psBuffer;
           
        }
    }
    if( testt == "" ) {
        MessageBox( NULL, "Użytkownik nie istnieje", "", MB_ICONEXCLAMATION );
       
    } else
         MessageBox( NULL, testt.c_str(), "", MB_ICONEXCLAMATION );
   
    /* Close pipe and print return value of pPipe. */
   
    _pclose( pPipe );
   
   
}
 ona działa problem w tym że na xp nie działa funkcja _popen() (nie wiem czemu) jaką inną funkcją (która dzała na xp ) moge zastąpić _popen()
P-78687
krzyk
» 2013-03-17 20:24:28
_popen w XP działa tylko w konsoli no chyba że znowu czegoś niewiem.
Użyj CreatePipe i CreateProcess.
P-78689
luky92
Temat założony przez niniejszego użytkownika
» 2013-03-17 20:35:27
mógłbyś podać przykład jak to zrobić wujek Google nie pomógł niestety
P-78691
krzyk
» 2013-03-17 20:38:20
P-78694
luky92
Temat założony przez niniejszego użytkownika
» 2013-03-17 20:57:10
to znalazłem ale jestem początkującym programistą i nie za bardzo potrafie ten kod wykorzytac prosiłbym o krótkie tłumaczenie
z góry thx
P-78702
krzyk
» 2013-03-18 10:13:24
Ciężko to wszystko opisać.Zrobiłem uproszczony do granic możliwości przykład ale nie mam pewności czy wszystko w nim działa prawidłowo,może się przyda.
C/C++
class CPipe
{
public:
    CPipe()
    {
        Closed = true;
    }
    ~CPipe() { }
   
    bool exe( string cmdline )
    {
        // tworzenie pipy xD
        SECURITY_ATTRIBUTES sa;
        ZeroMemory( & sa, sizeof( SECURITY_ATTRIBUTES ) );
        sa.nLength = sizeof( SECURITY_ATTRIBUTES );
        sa.bInheritHandle = true;
        sa.lpSecurityDescriptor = NULL;
        if( !CreatePipe( & ReadPipeHandle, & WritePipeHandle, & sa, 0 ) ) {
            return false;
        }
       
        //uruchamianie procesu
        STARTUPINFO si;
        ZeroMemory( & si, sizeof( STARTUPINFO ) );
        si.cb = sizeof( STARTUPINFO );
        si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
        si.wShowWindow = SW_HIDE;
        si.hStdOutput = WritePipeHandle;
        si.hStdError = WritePipeHandle;
       
        ZeroMemory( & pi, sizeof( PROCESS_INFORMATION ) );
        if( !CreateProcess( 0,( char * ) cmdline.c_str(), NULL, NULL, true, 0, NULL, NULL, & si, & pi ) ) {
            CloseHandle( ReadPipeHandle );
            CloseHandle( WritePipeHandle );
            return false;
        }
        Closed = false;
        return true;
    }
   
    void close()
    {
        Closed = true;
        CloseHandle( pi.hThread );
        CloseHandle( pi.hProcess );
        CloseHandle( ReadPipeHandle );
        CloseHandle( WritePipeHandle );
    }
   
    // 0 = kontynuj ,1 = blad ,2 = koniec
    int read( char * Buffer, int BufferSize, DWORD & BytesRead )
    {
        if( Closed ) {
            return 2;
        }
        DWORD TotalBytesAvail;
        DWORD BytesLeftThisMessage;
       
        //sprawdzamy czy cos do pobrania
        if( !PeekNamedPipe( ReadPipeHandle, Buffer, BufferSize, & BytesRead, & TotalBytesAvail, & BytesLeftThisMessage ) ) {
            Closed = true;
            return 1;
        }
       
        if( BytesRead ) {
            // czytamy
            if( !ReadFile( ReadPipeHandle, Buffer, BufferSize - 1, & BytesRead, NULL ) ) {
                Closed = true;
                return 1;
            }
            Buffer[ BytesRead ] = '\0';
        } else {
            // sprawdzamy czy proces jeszce działa
            if( WaitForSingleObject( pi.hProcess, 0 ) == WAIT_OBJECT_0 ) {
                Closed = true;
                return 2;
            }
        }
       
        return 0;
    }
   
    bool Closed;
    HANDLE ReadPipeHandle;
    HANDLE WritePipeHandle;
    PROCESS_INFORMATION pi;
};

void usertogroupdomain( string b, string c )
{
    string w = "test.exe " + b + " " + c; //
   
    string testt;
   
    CPipe pipe;
    if( !pipe.exe( w.c_str() ) ) {
        // blad
        return;
    }
    while( 1 ) {
        int buffsize = 256;
        DWORD readed = 0;
        char buffer[ 256 ];
        int res = pipe.read( buffer, buffsize, readed );
       
        if( res == 0 ) { // kontynuj
            if( readed )
                 testt += buffer;
           
        } else if( res == 1 ) { // blad
            break;
        } else if( res == 2 ) { // koniec
            if( readed )
                 testt += buffer;
           
            break;
        }
        Sleep( 100 );
    }
   
    pipe.close();
   
    if( testt == "" ) {
        MessageBox( NULL, "Użytkownik nie istnieje", "", MB_ICONEXCLAMATION );
       
    } else
         MessageBox( NULL, testt.c_str(), "", MB_ICONEXCLAMATION );
   
   
   
}
P-78748
« 1 » 2
  Strona 1 z 2 Następna strona