Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Чтение из консольного приложения (CreateProcess)


Автор: vlad2 4.2.2020, 17:06
Осваиваю работу с консольным приложением из внешней проги. Записывать получается, а с чтением никак. Вот рабочий код:
Код
  UnicodeString Cons_App = L"Python -i";
  HANDLE hReadIn, hWriteIn, hReadOut, hWriteOut, hWriteInDup, hWriteOutDup;

  SECURITY_ATTRIBUTES sa;
  PROCESS_INFORMATION pi;
  STARTUPINFO si;
  try
  {
    SetCurrentDir(CurDir);

    ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle = TRUE;
    sa.lpSecurityDescriptor = NULL;

    CreatePipe(&hReadOut, &hWriteOut, &sa, NULL);
    DuplicateHandle(GetCurrentProcess(), hReadOut, GetCurrentProcess(), &hWriteOutDup, 0, FALSE, DUPLICATE_SAME_ACCESS);
    CloseHandle(hReadOut);

    CreatePipe(&hReadIn, &hWriteIn, &sa, NULL);
    DuplicateHandle(GetCurrentProcess(), hWriteIn, GetCurrentProcess(), &hWriteInDup, 0, FALSE, DUPLICATE_SAME_ACCESS);
    CloseHandle(hWriteIn);

    ZeroMemory(&si, sizeof(STARTUPINFO));
    si.cb=sizeof(STARTUPINFO);
    si.dwFlags     = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    si.wShowWindow = SW_HIDE;
    si.hStdInput   = hReadIn;
    si.hStdOutput  = hWriteOut;

    CreateProcess(NULL, Cons_App.c_str(), NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);

    DWORD count = 0;
    char buf[1024];

    strcpy(buf,"f= open(\"D:\\__aa.txt\",\"w+\")\r\n");
    WriteFile(hWriteInDup, buf, strlen(buf), &count, NULL);   //  создание файла

    strcpy(buf,"f.write(\"1\n\")\r\n");
    WriteFile(hWriteInDup, buf, strlen(buf), &count, NULL);   //  запись в файл "1\n"


    DWORD cread = 0;                                          //  чтение
    bool ret = true;

    for(int i=0; i < 10; i++)
    {
      ret = PeekNamedPipe(hWriteOutDup, NULL, 0, NULL, &count, NULL);
      ret = ret && (count > 0);
      if (ret) break;
      Sleep(1000);
    }
    if (ret)
    {
      ret = ReadFile(hWriteOutDup, buf, count, &cread, NULL);
    }


//    while (ret)
//    {
//      ret = ReadFile(hWriteOutDup, buf, strlen(buf), &count, NULL);   //  read from the pipe
//      if (!ret && GetLastError() != ERROR_MORE_DATA)
//        break;
//    }


    strcpy(buf,"f.close()\r\n");
    WriteFile(hWriteInDup, buf, strlen(buf), &count, NULL);   //  закрытие файла

    CloseHandle(hWriteInDup);

    CloseHandle(hReadOut);
    CloseHandle(hWriteIn);
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);

Результат PeekNamedPipe - всегда false.
Те же действия в командной строке нормально работают - см. вложение. Как программно реализовать чтение?
Спасибо.

Автор: vlad2 5.2.2020, 09:43
При этом команда записи в файл не проходит.

Автор: xvr 5.2.2020, 11:54
si.hStdError присвойте тоже

Кроме того, запись и чтение из одного и того же потока может привести к deadlock'у

Автор: vlad2 5.2.2020, 16:47
Цитата(xvr @  5.2.2020,  11:54 Найти цитируемый пост)
si.hStdError присвойте тоже

К сожалению, не помогло.

Автор: xvr 6.2.2020, 16:41
А если CREATE_NO_WINDOW не ставить - работает?

Автор: vlad2 7.2.2020, 10:56
Цитата(xvr @  6.2.2020,  16:41 Найти цитируемый пост)
А если CREATE_NO_WINDOW не ставить - работает?
Нет, увы.

Автор: xvr 7.2.2020, 16:13
странно. Попробуйте на той стороне вмсто Питона что нибудь попроще запустить - например cmd.exe

Автор: vlad2 11.2.2020, 09:58
Спасибо, вопрос на этом этапе пока закрываю.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)