Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
6 / 6 / 2
Регистрация: 06.04.2011
Сообщений: 313

Как программно выполнить команду консольного приложения, запущенного CreateProcess?

29.01.2020, 18:15. Показов 2460. Ответов 22
Метки win7, xe7 (Все метки)

Студворк — интернет-сервис помощи студентам
Посылаю команду консольному приложению, которая выполняется только после закрытия хэндла = закрытия этого приложения. Вот рабочий пример (один из нашедшихся в сети):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
  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_USESTDHANDLES | STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;
    si.hStdInput   = hReadIn;
    si.hStdOutput  = hWriteOut;
 
    CreateProcess(NULL, Cons_App.c_str(), NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
 
    WriteFile(hWriteInDup, buf, len, &count, NULL);   //  запись команды
 
    CloseHandle(hWriteInDup);           // команда выполняется только после CloseHandle = закрытия консольного приложения
 
    CloseHandle(hReadOut);
    CloseHandle(hWriteIn);
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
Как выполнять команды и читать из командной строки консольного приложения без закрытия самого приложения?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.01.2020, 18:15
Ответы с готовыми решениями:

Особенности CreateProcess консольного приложения
Здравствуйте. Запускаю процесс консольного приложения. В итоге процесс запускается, но как только я нажимаю в запущенном консольном окне...

Выполнить программно команду от root-а
Подскажите, куда копать, что бы программно выполнить, допустим, mount от root-а ?

Программно выполнить cmd команду
Всем привет! Скажите как можно выполнить cmd команду в С#. вот Я знаю что в Java есть GetRuntime().exec(команда). А вот в С# могу...

22
6 / 6 / 2
Регистрация: 06.04.2011
Сообщений: 313
04.02.2020, 16:39  [ТС]
Студворк — интернет-сервис помощи студентам
Запись (WriteFile) работает, а чтение не получается. Вот рабочий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
  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.
Те же действия в командной строке нормально работают - см. вложение. Как программно реализовать чтение?
Изображения
 
0
6 / 6 / 2
Регистрация: 06.04.2011
Сообщений: 313
05.02.2020, 09:40  [ТС]
При этом команда записи в файл не проходит.
0
6 / 6 / 2
Регистрация: 06.04.2011
Сообщений: 313
11.02.2020, 10:01  [ТС]
Спасибо, вопрос на этом этапе пока закрываю. Там надо аккуратнее с хэнделами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.02.2020, 10:01

Как программно выполнить команду контекстного меню "обновить"?
Всем привет! Подскажите пожалуйста, я написал простенькую программку состоящую из 2-х кнопок которая делает скрытые папки видимыми и...

Как программно выполнить команду "Добавить из буфера..."?
Я пробовал DoCmd.RunCommand acCmdPasteAppendно чего-то не получается. Может надо по другому? (Команда 'Добавить из буфера' не...

Как получить текст из запущенного консольного предложения
Добрый день подскажите как мне получить текст который пишется при запуске консольного предложение (оно быстро закрывается) запускаю...

не получается программно сменить раскладку консольного приложения
Здравствуйте, вот код private static extern long GetKeyboardLayoutName(StringBuilder pwszKLID); ...

Выполнить команду Sleep без зависания приложения
Всем привет. Есть цикл: Dim SB As New StringBuilder Dim H As HtmlElementCollection =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru