Перехват вывода консоли

Тема в разделе "WASM.ASSEMBLER", создана пользователем Stardah, 5 май 2008.

  1. Stardah

    Stardah New Member

    Публикаций:
    0
    Регистрация:
    5 май 2008
    Сообщения:
    5
    Привет всем.

    Подскажите, пожалуйста, в чем моя ошибка.

    Задача: перехватить вывод консоли. В качестве примера взята строка 'cmd /c dir'. В примере указано место в котором возникает ошибка ERROR_BROKEN_PIPE(0000006D). Не могу понять в чем дело...

    Вот основная часть:
    Код (Text):
    1. . . .
    2.     mov [security.nlength], sizeof.SECURITY_ATTRIBUTES
    3.     mov [security.lpSecutityDescriptor], NULL
    4.     mov [security.pInheritHandle], TRUE
    5.     invoke  CreatePipe, hReadPipe, hWritePipe, security, 0
    6.     test    eax, eax
    7.     jz  @FreeResource
    8.     xor eax, eax
    9.     mov [sinfo.cb], sizeof.STARTUPINFO
    10.     mov eax, [hWritePipe]
    11.     mov [sinfo.hStdOutput], eax
    12.     mov [sinfo.hStdError], eax 
    13.     mov [sinfo.dwFlags], STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW
    14.     mov [sinfo.wShowWindow], SW_HIDE
    15.     invoke  CreateProcess, NULL, pCmd, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, sinfo, pinfo   
    16.     test    eax, eax
    17.     jz  @FreeResource
    18.     invoke  CloseHandle, [hWritePipe]
    19. @WiatLoop: 
    20.     invoke  ReadFile, [hReadPipe], pReadStr, 1023, iBytesRead, NULL ; Здесь возвращается ERROR_BROKEN_PIPE(0000006D)
    21.     mov eax, [iBytesRead]
    22.     test    eax, eax
    23.     jz  @WiatLoop
    24.     invoke   MessageBox, 0, pReadStr, NULL, MB_OK
    25. . . .
    Исходник тестового приложения вложен
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    попробуй так
     
  3. Stardah

    Stardah New Member

    Публикаций:
    0
    Регистрация:
    5 май 2008
    Сообщения:
    5
    Сорри, забыл указать это FASM, поэтому там addr и есть :dntknw:
     
  4. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Stardah
    Может просто процесс еще не успел стратовать ?
    CreateProcess returns without waiting for the new process to finish its initialization.
     
  5. Stardah

    Stardah New Member

    Публикаций:
    0
    Регистрация:
    5 май 2008
    Сообщения:
    5
    valterg
    Добавил Sleep, не помогло :-\
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    а перед записью в пайп случайно не надо сделать ConnectPipe или че-то такое?
     
  7. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Stardah
    Так.
    раз
    два
    три

    Кроме того у вас возможны двойные закрытия и закрытие неоткрытых хэндлов. Вы бы их обнуляли вначале и сразу после закрытия на всякий пожарный.
     
  8. Stardah

    Stardah New Member

    Публикаций:
    0
    Регистрация:
    5 май 2008
    Сообщения:
    5
    _basmp_
    Ура, заработало!
    (с) Кот матроскин

    Спасибо Вам большое!

    и всем кто откликнулся тоже..:)
     
  9. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Stardah
    Так как заработало если применить все поправки то в MessageBox выдается только
    Код (Text):
    1.  Том в устройстве C не имеет метки.
    и все.
    Разве только эту надпись нужно было вывести? А остальное ?
     
  10. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Ну так вы собирайте все полученое в один буфер. Или выводите по мере получения. А в приведеном коде и должна выводиться только самая последняя инфа. Почему - спросите к топикстартера.
     
  11. Stardah

    Stardah New Member

    Публикаций:
    0
    Регистрация:
    5 май 2008
    Сообщения:
    5
    _sheva740
    Да, конечно, MessageBox только для проверки, его вообще нет в итоговом коде, это тестовое приложение. Я удалил все ненужное для того чтобы опубликовать здесь.