Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение из консольного приложения (CreateProcess) 
:(
    Опции темы
vlad2
Дата 4.2.2020, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.7.2011

Репутация: нет
Всего: нет



Осваиваю работу с консольным приложением из внешней проги. Записывать получается, а с чтением никак. Вот рабочий код:
Код
  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.
Те же действия в командной строке нормально работают - см. вложение. Как программно реализовать чтение?
Спасибо.

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  cmd_p.jpg 7,45 Kb
PM MAIL   Вверх
vlad2
Дата 5.2.2020, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.7.2011

Репутация: нет
Всего: нет



При этом команда записи в файл не проходит.
PM MAIL   Вверх
xvr
Дата 5.2.2020, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7019
Регистрация: 28.8.2007
Где: Химки, Московская обл

Репутация: 40
Всего: 223



si.hStdError присвойте тоже

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


Это сообщение отредактировал(а) xvr - 5.2.2020, 11:55
PM MAIL   Вверх
vlad2
Дата 5.2.2020, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.7.2011

Репутация: нет
Всего: нет



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

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

PM MAIL   Вверх
xvr
Дата 6.2.2020, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7019
Регистрация: 28.8.2007
Где: Химки, Московская обл

Репутация: 40
Всего: 223



А если CREATE_NO_WINDOW не ставить - работает?

PM MAIL   Вверх
vlad2
Дата 7.2.2020, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.7.2011

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
xvr
Дата 7.2.2020, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7019
Регистрация: 28.8.2007
Где: Химки, Московская обл

Репутация: 40
Всего: 223



странно. Попробуйте на той стороне вмсто Питона что нибудь попроще запустить - например cmd.exe

PM MAIL   Вверх
vlad2
Дата 11.2.2020, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.7.2011

Репутация: нет
Всего: нет



Спасибо, вопрос на этом этапе пока закрываю.
PM MAIL   Вверх
Google
  Дата 23.2.2020, 08:44 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0817 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.