Приветствую. Есть задача: разработать программу для вывода списка файлов в указанном каталоге. Для получения списка использовать анонимные каналы.
Как пытаюсь решить: создаю приложение которое вызывает консоль, процессу консоли передаются дескрипторы канала. Вбиваю в консоли нужные команды, вывод идёт на "сервер". Но что-то не получается, запускается консоль не реагирующая ни на что:
Как пытаюсь решить: создаю приложение которое вызывает консоль, процессу консоли передаются дескрипторы канала. Вбиваю в консоли нужные команды, вывод идёт на "сервер". Но что-то не получается, запускается консоль не реагирующая ни на что:
C++:
#include <windows.h>
#include <conio.h>
#include <iostream>
using namespace std;
int main()
{
WCHAR CommandLine[] = L"C:\\Windows\\System32\\cmd.exe";
STARTUPINFO si;
PROCESS_INFORMATION pi;
HANDLE hWritePipe, hReadPipe;
SECURITY_ATTRIBUTES sa;
// устанавливает атрибуты защиты канала
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
// защита по умолчанию
sa.bInheritHandle = TRUE;
// дескрипторы наследуемые
// создаем анонимный канал
if (!CreatePipe(
&hReadPipe,
// дескриптор для чтения
&hWritePipe,
// дескриптор для записи
&sa,
// атрибуты защиты по умолчанию,
// в этом случае дескрипторы
// hReadPipe и hWritePipe ненаследуемые
0))
// размер буфера по умолчанию
{
_cputs("Create pipe failed.\n");
_cputs("Press any key to finish.\n");
_getch();
return GetLastError();
}
ZeroMemory(&si, sizeof(si)); //обнуляем память
ZeroMemory(&pi, sizeof(pi));
si.cb = sizeof(STARTUPINFO);
// использовать стандартные дескрипторы
si.dwFlags = STARTF_USESTDHANDLES;
// устанавливаем стандартные дескрипторы
si.hStdInput = hReadPipe;
si.hStdOutput = hWritePipe;
si.hStdError = hWritePipe;
// запускаем новый консольный процесс
if (!CreateProcess(
CommandLine,
// имя процесса
NULL,
// командная строка
NULL,
// атрибуты защиты процесса по умолчанию
NULL,
// атрибуты защиты первичного потока по умолчанию
TRUE,
// наследуемые дескрипторы текущего процесса
// наследуются новым процессом
CREATE_NEW_CONSOLE,
// новая консоль
NULL,
// используем среду окружения процесса предка
NULL,
// текущий диск и каталог, как и в процессе предке
&si,
// вид главного окна - по умолчанию
&pi
))
{
_cputs("Create process failed.\n");
_cputs("Press any key to finish.\n");
_getch();
return GetLastError();
}
// закрываем дескрипторы нового процесса
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
// читаем из анонимного канала
WIN32_FIND_DATA FindFileData;
do
{
DWORD dwBytesRead;
if (!ReadFile(
hReadPipe,
&FindFileData.cFileName,
sizeof(FindFileData),
&dwBytesRead,
NULL))
{
_cputs("Press any key to finish.\n");
_getch();
return GetLastError();
}
wcout << FindFileData.cFileName << endl;
} while (FindFileData.cFileName);
// закрываем дескриптор канала
CloseHandle(hReadPipe);
_cputs("The process finished reading from the pipe.\n");
_cputs("Press any key to exit.\n");
_getch();
return 0;
}