Вообщем нашел такой код
| Код | #include <windows.h> #include <stdio.h> #include <conio.h> #include <string.h> #pragma hdrstop //#include <condefs.h> #define bzero(a) memset(a,0,sizeof(a)) //для сокращения писанины bool IsWinNT() //проверка запуска под NT { OSVERSIONINFO osv; osv.dwOSVersionInfoSize = sizeof(osv); GetVersionEx(&osv); return (osv.dwPlatformId == VER_PLATFORM_WIN32_NT); } void ErrorMessage(char *str) //вывод подробной информации об ошибке { LPVOID msg; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM ,NULL ,GetLastError() ,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT) ,(LPSTR)&msg ,0 ,NULL); printf("%s: %s\n",str,msg); LocalFree(msg); } //---------------------------------------------------------------------- void main() { char buf[1024]; //буфер ввода/вывода STARTUPINFO si; SECURITY_ATTRIBUTES sa; SECURITY_DESCRIPTOR sd; //структура security для пайпов PROCESS_INFORMATION pi; HANDLE newstdin,newstdout,read_stdout,write_stdin; //дескрипторы// пайпов if (IsWinNT()) //инициализация security для Windows NT { InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(&sd, true, NULL, false); sa.lpSecurityDescriptor = &sd; } else sa.lpSecurityDescriptor = NULL; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = true; //разрешаем наследование дескрипторов if (!CreatePipe(&newstdin,&write_stdin,&sa,0)) //создаем пайп// для stdin { ErrorMessage("CreatePipe"); getch(); return; } if (!CreatePipe(&read_stdout,&newstdout,&sa,0)) //создаем пайп// для stdout { ErrorMessage("CreatePipe"); getch(); CloseHandle(newstdin); CloseHandle(write_stdin); return; } GetStartupInfo(&si); //создаем startupinfo для // дочернего процесса /*Параметр dwFlags сообщает функции CreateProcess как именно надо создать процесс. STARTF_USESTDHANDLES управляет полями hStd*.STARTF_USESHOWWINDOW управляет полем wShowWindow.*/ si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; si.hStdOutput = newstdout; si.hStdError = newstdout; //подменяем дескрипторы для si.hStdInput = newstdin; // дочернего процесса //это просто //пример, //замените на то, //что вам нужно //создаем дочерний процесс if (!CreateProcess(NULL, "D:\\7za.exe a D:\\test.zip D:\\test.txt",NULL,NULL,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi)) { ErrorMessage("CreateProcess"); getch(); CloseHandle(newstdin); CloseHandle(newstdout); CloseHandle(read_stdout); CloseHandle(write_stdin); return; } unsigned long exit=0; //код завершения процесса unsigned long bread; //кол-во прочитанных байт unsigned long avail; //кол-во доступных байт unsigned long status; bzero(buf); for(;;) //основной цикл программы { GetExitCodeProcess(pi.hProcess,&exit); //пока дочерний процесс// не закрыт if (exit != STILL_ACTIVE) break; PeekNamedPipe(read_stdout,buf,1023,&bread,&avail,NULL);//Проверяем, есть ли данные для чтения в stdout if (bread != 0) { bzero(buf); if (avail > 1023) { while (bread >= 1023) { ReadFile(read_stdout,buf,1023,&bread,NULL); //читаем из // пайпа stdout printf("%s",buf); bzero(buf); } } else { ReadFile(read_stdout,buf,1023,&bread,NULL); printf("%s",buf); } } } CloseHandle(pi.hThread); CloseHandle(pi.hProcess); CloseHandle(newstdin); //небольшая уборка за собой CloseHandle(newstdout); CloseHandle(read_stdout); CloseHandle(write_stdin);}
|
Чего то все равно не выводит нифига. Где затык ? |