В именованном канале нет байтов - PullRequest
2 голосов
/ 21 октября 2011

Услуги: Создает стандартный вывод в именованных каналах. Присоединяет их к процессу, который он создает.

HANDLE hStdOut = CreateNamedPipe(szStdOutPipeName,
            PIPE_ACCESS_DUPLEX,
            PIPE_TYPE_BYTE,
            1,
            100,
            100,
            15000,
            pSa);
yStartupInfo.hStdOutput = hStdOut;
CreateProcessAsUserW( ..., yStartupInfo, ... );

Эта часть работает. Вывод созданного процесса перенаправляется в каналы.

Клиент: Соединение с именованным каналом, успешно. Проверьте, есть ли байты для считывания с просмотром (в этот момент байты помещаются в канал!). Затем прочитайте байты из канала.

hStdOutPide = CreateFileW(szPipeNameStdOut,
                          GENERIC_READ|GENERIC_WRITE,
                          FILE_SHARE_READ|FILE_SHARE_WRITE,
                          NULL, 
                          OPEN_EXISTING, 
                          0, 
                          NULL );
PeekNamedPipe(hStdOutPide,
              szBuffer,
              kunBufferSize,
              &ulBytesRead,
              &ulBytesAvailable,
              &ulRemainingBytes);
if( ulBytesAvailable > 0)
      ReadFile(hStdOutPide, szBuffer, 1000, &ulBytesRead, NULL)

Я удалил окружающий код, который проверяет правильность дескрипторов, процесс запущен и т. Д.

Пик показывает, что ulRemainingBytes - это ВСЕГДА 0. Кто-нибудь видит, где может быть моя ошибка? Я пытался заставить это работать в течение некоторого времени, и я не знаю, каковы правильные флаги для чего-либо. Пожалуйста, спросите, нужна ли вам дополнительная информация!

Атрибуты безопасности в CreateNamesPipe генерируются методом. Он используется во многих других местах кода, поэтому я не думаю, что проблема там.

Спасибо.

Ответы [ 2 ]

1 голос
/ 24 октября 2011

PeekNamedPipe() возвращает BOOL, который должен быть проверен.

В случае неудачи (FALSE или 0) используйте GetLastError(), чтобы выяснить причину.* И перед этим вы должны также проверить возвращаемое значение CreateFile() (hStdOutPide) против INVALID_HANDLE_VALUE.Если возвращенный дескриптор недействителен, это вполне может быть причиной неудачи PeekNamedPipe().

В целом вы, похоже, получаете слишком много (хороших) результатов для получения.Не надо!Проверьте свои коды возврата и никогда не полагайтесь на удачу.

Еще одна вещь: возможно, что флаги общего доступа установлены неправильно.Убедитесь, что они не противоречат тому, что вы хотите сделать.В любом случае, GetLastError() снова сообщит вам о такой проблеме в случае сбоя CreateFile().

0 голосов
/ 24 октября 2011

Я подозреваю, что вы пытаетесь читать с stdout, а не с stdin в вашем дочернем процессе. Но из ограниченного кода я не могу подтвердить это. Обратитесь к этому вопросу для IPC с использованием труб

Как взять выходные данные одной программы и использовать их в качестве входных данных для другой на C ++?

...