На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
Страницы: (4) 1 [2] 3 4  все  ( Перейти к последнему сообщению )  
> Как программно выполнить команду консольного приложения? , Win7, XE7
    Прани, сорри конечно ... но я совсем не вкурил, как производится запуск?

    Через сиспемный пайп? Типа:

    ExpandedWrap disabled
      proramm-1 | proramm-2


    Или как-то иначе??
      Цитата JoeUser @
      Или как-то иначе??
      Нет, сугубо программно. Но смысл ровно таков же с той лишь разницей, что пишуемое в пайп заранее неизвестно и формируется по ходу дела.
        Цитата Qraizer @
        Нет, сугубо программно.

        Qraizer, стоп. Есть две программы. Пайп - это решение обмена, стандартизованное ОС. Если это не оно - то что оно?

        Добавлено
        АДД: да, есть еще атавизмы в виде "мэйл-слотов", но это явно не они.
          Цитата vlad2 @
          Прочитал про особенность Питона с предложением, как обойти проблему.
          Вообще говоря, за такие вещи нужно по рукам и розгами. Вот что в голове у этих иксоидов творится, что они с пеной у рта рассказывают, какая у них вся из себя унифицированная архитектура, всё суть файлы, даже внешние устройства, даже процессор и память, а на деле чекают, чё им подсунули и меняют алгоритмы. Какая тебе нафик разница, что у тебя с той стороны stdin-а? Зла не хватает, половина кроссплатформенного оперсорса более кроссплатформенен на винде, чем в позиксе...

          Добавлено
          Цитата JoeUser @
          Пайп - это решение обмена, стандартизованное ОС. Если это не оно - то что оно?
          Это оно. Только оно для юзера. Оно программно как раз так и реализуется, через CreatePipe() etc. Только делает это оболочка. Ну, в винде это cmd. И ничего не надо программить. Но это решение статично. Если нужно динамически общаться, юзер не справится, ему придётся что-нить наскриптовать хотя бы.
          Сообщение отредактировано: Qraizer -
            Цитата Qraizer @
            Но оно статично.

            Ой ли ... ой лю ли ... :lol:

            ExpandedWrap disabled
              echo "Oi li, oi lu li" | program


            ExpandedWrap disabled
              cat myfile | program


            ExpandedWrap disabled
              ls /usr/local/bin | grep YO | program


            & etc ... !!!

            Все наоборот! Изначальная обработка может быть любая, но вывод в STDOUT будет одинаков. А вот как его отработает прога в STDIN - вопрос. ИМХО, И ящетаю - привязываться к API Венды (именно в этом случае) - это кощунство и сатанинство!!! И издевательство над православными!
              И где тут динамика, JoeUser? Наладь между grep и program двусторонний диалог.
                Цитата Qraizer @
                Наладь между grep и program двусторонний диалог.

                Ну я так понимаю, "двусторонность" не равна "динамичности"? Как я понимаю, динамичность может просто подразумевать какую-то зависимость исходящих величин - от входящих (читай функцию). А если обобщить - рассматриваем не только способ обработки, но и его построение, читай - получаем что-то типа "функтора". Хотя может я и загоняюсь :-?
                  В результате получилась запись, но не получается чтение. Вот рабочий код:
                  ExpandedWrap disabled
                      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 -
                    А с чего ты уверен, что команды туда приходят? Я ради такого случая поставил себе Python, не факт, что твоей версии, правда, и ничего работающего не обнаружил. Написал свою простейшую аппликуху, без этого дурацкого ветвления по типу tty, и в ней всё работает как часы, в обе стороны.
                    Сообщение отредактировано: Qraizer -
                      Цитата Qraizer @
                      А с чего ты уверен, что команды туда приходят?

                      Файл образуется (f=open) и закрывается (f.close).

                      Добавлено
                      Цитата vlad2 @
                      без этого дурацкого ветвления по типу tty

                      Что имеется в виду?

                      Добавлено
                      В сообщении #8 давал ссылку на Питон. Запускать его надо с опцией -i.
                        У меня 3.8.1. Поведение отличается.
                        Короче, долби саппорт питона. Боюсь, без их помощи не обойтись. Тебе вот надо, чтобы твой код под каждую версию работал по-разному? Думаю, такое веселье никому не понравится.
                          Цитата Qraizer @
                          Думаю, такое веселье никому не понравится
                          Это точно(.
                            Цитата vlad2 @
                            Цитата Qraizer @
                            Думаю, такое веселье никому не понравится
                            Это точно(.

                            А у меня всё получилось - после "python -i".
                            Только я делал для x86.
                            Где то у тебя ошибка.
                            ---
                            А вот этого я не делал никогда.
                            ExpandedWrap disabled
                              ...
                               DuplicateHandle(GetCurrentProcess(), hReadOut, GetCurrentProcess(), &hWriteOutDup, 0, FALSE, DUPLICATE_SAME_ACCESS);
                              ...
                               DuplicateHandle(GetCurrentProcess(), hWriteIn, GetCurrentProcess(), &hWriteInDup, 0, FALSE, DUPLICATE_SAME_ACCESS);
                              ...
                            Сообщение отредактировано: ЫукпШ -
                              Цитата ЫукпШ @
                              А у меня всё получилось

                              Здорово! Я упростил код, убрал DuplicateHandle:
                              ExpandedWrap disabled
                                  UnicodeString Cons_App = L"Python -i";
                                  HANDLE hReadIn, hWriteIn, hReadOut, hWriteOut, hWriteInDup, hWriteOutDup;
                                 
                                  SECURITY_ATTRIBUTES sa;
                                  PROCESS_INFORMATION pi;
                                  STARTUPINFO si;
                                  try
                                  {
                                    ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
                                    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
                                    sa.bInheritHandle = TRUE;
                                    sa.lpSecurityDescriptor = NULL;
                                 
                                    CreatePipe(&hReadOut, &hWriteOut, &sa, NULL);
                                    CreatePipe(&hReadIn, &hWriteIn, &sa, NULL);
                                 
                                    ZeroMemory(&si, sizeof(STARTUPINFO));
                                    si.cb=sizeof(STARTUPINFO);
                                    si.dwFlags     = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
                                    si.wShowWindow = SW_HIDE;
                                    si.hStdInput   = hReadIn;
                                    si.hStdOutput  = hWriteOut;
                                    si.hStdError   = 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(hWriteIn, buf, strlen(buf), &count, NULL);   //  создание файла
                                 
                                    strcpy(buf,"f.write(\"1\n\")\r\n");
                                    WriteFile(hWriteIn, buf, strlen(buf), &count, NULL);   //  запись в файл "1\n"
                                 
                                    DWORD cread = 0;                                       //  чтение
                                    bool ret = true;
                                 
                                    for(int i=0; i < 10; i++)
                                    {
                                      ret = PeekNamedPipe(hWriteOut, NULL, 0, NULL, &count, NULL);
                                      ret = ret && (count > 0);
                                      if (ret) break;
                                      Sleep(1000);
                                    }
                                    if (ret)
                                    {
                                      if (count > strlen(buf)) count = strlen(buf);
                                      ret = ReadFile(hWriteOut, buf, count, &cread, NULL);
                                    }
                                 
                                    strcpy(buf,"f.close()\r\n");
                                    WriteFile(hWriteIn, buf, strlen(buf), &count, NULL);   //  закрытие файла
                                 
                                    strcpy(buf,"exit()\r\n");
                                    WriteFile(hWriteIn, buf, strlen(buf), &count, NULL);   //  выход из Питона
                                 
                                    CloseHandle(hReadIn);
                                    CloseHandle(hWriteOut);
                                 
                                    CloseHandle(hReadOut);
                                    CloseHandle(hWriteIn);
                                    CloseHandle(pi.hThread);
                                    CloseHandle(pi.hProcess);

                              Всё равно не записывает в файл и не читает. Остальные команды проходят.
                              Можешь посмотреть мой код на предмет ошибки или дать свой, который работает?
                              Сообщение отредактировано: vlad2 -
                                Цитата vlad2 @
                                Можешь посмотреть мой код на предмет ошибки или дать свой, который работает?

                                Да, но только вечером или ночью.
                                ---
                                Но я делал не так, как ты.
                                Чтобы мастерить такие приложения на постоянной основе,
                                я сделал некоторые классы и процедуры, которые занёс в библиотеку.
                                Поэтому исходников получается не один.
                                Но зато растёт производительность труда.

                                1. Делаем класс - Hahdle. Это весьма нужный класс.
                                2. Делаем класс - Pipe.
                                3. Делаем класс - Обёртку процесса для консольных приложений и .bat файлов.
                                4. Для удобства - обёртку вокруг памяти.
                                5. Класс - конвертор форматов
                                6. Делаем класс - обёртку для управления консольным приложением
                                На основе сделанного набора
                                И ещё там чего-то в виде библиотечных процедур.
                                В результате получился такой исходник:
                                ExpandedWrap disabled
                                  #include "cmdShell.h"
                                   
                                  bool WriteToPython(cmdShell& cSh, const char* pStr)
                                  {
                                   bool bRetC=false;
                                   
                                   size_t sizeWr = strlen(pStr);
                                   if(sizeWr)
                                   {
                                  //  ConvTchar2Char conv;
                                  //  DbgStr::TypeDebugString(_T("%s %s"),_T(__FUNCTION__), conv.Char2Tchar(pStr));
                                    if(!cSh.WriteToPipe (pStr,sizeWr)) return false;
                                   }
                                   
                                   MEMT<char> buf;
                                   bRetC = cSh.ReadFromPipe  (buf);
                                   size_t size = buf.GetDataSize();
                                   
                                  // _tprintf(_T("bRetC(ReadFromPipe)=%d size=%d\n"),bRetC,size);
                                   if((bRetC)&&(size))
                                   {
                                    for(size_t i=0;i<size;++i) { _tprintf(_T("%c"),buf[i]); }
                                   }
                                   
                                   _tprintf(_T("\n"));
                                   return bRetC;
                                  }
                                  // --------------------------------------------------------------------------
                                  int __cdecl _tmain(int argc, char **argv)
                                  {
                                   _tprintf(_T("\tHello, world!\n"));
                                   
                                    cmdShell cSh;
                                    bool bRetC = cSh.Install("python -i");
                                    if(bRetC)
                                    {
                                     WriteToPython(cSh, "");
                                  // создаём файл aa.txt в папке d:\0
                                     WriteToPython(cSh, "f=open(\"d:\\\\0\\\\aa.txt\",\"w+\")\n");
                                     WriteToPython(cSh, "f.write(\"223\")\n");
                                     WriteToPython(cSh, "f.close()\n");
                                     WriteToPython(cSh, "exit()\n");
                                    }
                                    else
                                    {
                                     _tprintf(_T("bRetC(install)=%d\n"),bRetC);
                                    }
                                   return 0;
                                  }

                                Приаттаченные исходники я надёргал из библиотеки, что-то мог и забыть.
                                Прикреплённый файлПрикреплённый файлForPython.zip (10,04 Кбайт, скачиваний: 337)
                                Сообщение отредактировано: ЫукпШ -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (4) 1 [2] 3 4  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0635 ]   [ 20 queries used ]   [ Generated: 16.04.24, 12:37 GMT ]