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 |
|
mactec |
» 2013-03-17 20:00:13 Jeśli nie chcesz mieć konsoli to dodaj w linkerze -mwindows. |
|
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 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; if(( pPipe = _popen( w.c_str(), "rt" ) ) == NULL ) { exit( 1 ); } 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 ); _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() |
|
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. |
|
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 |
|
krzyk |
» 2013-03-17 20:38:20 |
|
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 |
|
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. class CPipe { public: CPipe() { Closed = true; } ~CPipe() { } bool exe( string cmdline ) { 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; } 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 ); } int read( char * Buffer, int BufferSize, DWORD & BytesRead ) { if( Closed ) { return 2; } DWORD TotalBytesAvail; DWORD BytesLeftThisMessage; if( !PeekNamedPipe( ReadPipeHandle, Buffer, BufferSize, & BytesRead, & TotalBytesAvail, & BytesLeftThisMessage ) ) { Closed = true; return 1; } if( BytesRead ) { if( !ReadFile( ReadPipeHandle, Buffer, BufferSize - 1, & BytesRead, NULL ) ) { Closed = true; return 1; } Buffer[ BytesRead ] = '\0'; } else { 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() ) ) { return; } while( 1 ) { int buffsize = 256; DWORD readed = 0; char buffer[ 256 ]; int res = pipe.read( buffer, buffsize, readed ); if( res == 0 ) { if( readed ) testt += buffer; } else if( res == 1 ) { break; } else if( res == 2 ) { 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 ); }
|
|
« 1 » 2 |