Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Subgrando
40 / 40 / 3
Регистрация: 28.01.2011
Сообщений: 175
#1

Вывод процесса в стрим - C++

20.02.2011, 22:30. Просмотров 857. Ответов 5
Метки нет (Все метки)

У меня есть следующий код, который я затем использую для CreateProcess();

C++
1
2
3
4
STARTUPINFO info;
ZeroMemory(&info, sizeof(STARTUPINFO));
 
info.wShowWindow = SW_HIDE;
Какое значение должно быть у info.hStdOutput, чтобы переопределить вывод в стрим, который я мог бы сразу прочитать?

Добавлено через 1 час 50 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
    HANDLE hread;
    DWORD read;
    char readbuf[8192];
    info.hStdOutput = hread;
           ZeroMemory(readbuf, 8192);
        cout << "hread is  " << hread << "\n";
        if(ReadFile(hread, readbuf, 8192, &read, NULL)) {
            cout << "Got output!\n";
            cout << read << " bytes.\n";
            TerminateProcess(pi.hProcess, 0);
            return string(readbuf);
        } else { cout << "No output.\n"; TerminateProcess(pi.hProcess, 999); }
Данный код выводит:
Код
hread is 20
No output.
Вместо желаемого результата. Неужели никто не знает ответа на этот вопрос?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.02.2011, 22:30     Вывод процесса в стрим
Посмотрите здесь:

Вывод дескрипторов процесса в окна - C++ WinAPI
Нужно вывести дескрипторы процесса из структуры: typedef struct _PROCESS_INFORMATION { HANDLE hProcess; HANDLE hThread; ...

Вывод процесса решения в методе Крамера - C++ Builder
Народ, помогите сделать в Мемо вывод процесса решения в программе. Дело в том, что программа в маине отсылает значения в функцию, а оттуда...

добавить стрим в текстовой бинарный файл - C++
ê ïðèåðó åñòü òàêîé êîä, ìû çàãðóçèëè bmp ôàéë â ïåðåìåííóþ pic Graphics::TBitmap *pic = new Graphics::TBitmap(); ...

Чтение памяти другого процесса по таймеру: нужно ли закрывать хэндл процесса? - C++ Builder
В моём варианте работает так: По таймеру (0,1 сек) определяю ID процесса по ехе-шнику, получаю хэндл процесса(открываю процесс) ...

при создании процесса создаётся ярлык в трее, по окончании процесса он не убираетс сам, как его убрать оттуда? - C++ WinAPI
Друзья! Вот исходник процесса, качнул с инета. Это в консольном режиме запускат аудио файлы, например mp3: // cmdmp3 // A command-line...

Как узнать id процесса по имени процесса? - C++ WinAPI
Как узнать id процесса по имени процесса? Например ищем notepad.exe и возвращается id этого процесса. Пол гугла обшарил.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 1
20.02.2011, 22:36     Вывод процесса в стрим #2
Creating a Child Process with Redirected Input and Output
Subgrando
40 / 40 / 3
Регистрация: 28.01.2011
Сообщений: 175
21.02.2011, 21:34  [ТС]     Вывод процесса в стрим #3
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
int hidden_process(char* resultStr, const char* path, PROCESS_INFORMATION* p, char* param = "") {
    HANDLE out_rd = NULL;
    HANDLE out_wr = NULL;
 
    STARTUPINFO info;
    ZeroMemory(&info, sizeof(STARTUPINFO));
 
    info.wShowWindow = SW_HIDE;
    info.hStdOutput = out_wr;
    info.dwFlags |= STARTF_USESTDHANDLES;
 
    PROCESS_INFORMATION pi;
    BOOL result = CreateProcess(path, param, NULL, NULL, FALSE, NULL, NULL, NULL, &info, &pi);
    if(result == true) {
        p->hProcess = pi.hProcess;
        p->hThread = pi.hThread;
        p->dwProcessId = pi.dwProcessId;
        p->dwThreadId = pi.dwThreadId;
 
        SECURITY_ATTRIBUTES saAttr;
        saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
        saAttr.bInheritHandle = TRUE;
        saAttr.lpSecurityDescriptor = NULL;
 
        // STDOUT pipe
        if(!CreatePipe(&out_rd, &out_wr, &saAttr, 0)) return 1;
 
        // set handle information STDOUT
        if(!SetHandleInformation(out_rd, HANDLE_FLAG_INHERIT, 0)) return 2;
 
        // # Read from pipe #
        DWORD read;
        char mbuf[8192] = "";
        char buf[1024];
        bool success = FALSE;
 
        for(;;) {
            cout << "hm...\n";
            success = ReadFile(out_rd, buf, 1024, &read, NULL);
            cout << "Got chars: " << buf << "\n\n";
            if(!success || read == 0) break;
            else strcat(mbuf, buf);
        }
 
        strcpy(resultStr, mbuf);
        // # end #
    }
}
Эта функция выводит:
Код
hm...
А должна выводить:
Код
hm...
Got chars: 100500
Выполнение программы останавливается здесь:
C++
1
            success = ReadFile(out_rd, buf, 1024, &read, NULL);
Что я сделал неправильно?

Добавлено через 22 часа 10 минут
Неужели никто никогда не сталкивался с этой проблемой?
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 1
22.02.2011, 16:32     Вывод процесса в стрим #4
Сначала создаёшь процесс с перенаправлением вывода неизвестно куда, потом создаёшь пайп. При этом ещё у CreateProcess bInheritHandles равен FALSE. И как это будет работать?
Subgrando
40 / 40 / 3
Регистрация: 28.01.2011
Сообщений: 175
22.02.2011, 17:12  [ТС]     Вывод процесса в стрим #5
Большое спасибо за ответ. Переписал, но всё равно не работает:

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
bool hidden_process(char* result, const char* path, PROCESS_INFORMATION* p, char* param = "") {
    SECURITY_ATTRIBUTES saAttr;
    BOOL success;
    HANDLE hSaveStdout;
    HANDLE hChildStdoutRd;
    HANDLE hChildStdoutWr;
    HANDLE hChildStdoutRdDup;
 
 
    saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
    saAttr.bInheritHandle = TRUE;
    saAttr.lpSecurityDescriptor = NULL;
 
    hSaveStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    if(!CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0)) {
        return false;
    }
 
    if(!SetStdHandle(STD_OUTPUT_HANDLE, hChildStdoutWr)) {
        return false;
    }
 
 
    success = DuplicateHandle(GetCurrentProcess(), hChildStdoutRd,
              GetCurrentProcess(), &hChildStdoutRdDup,
              0, FALSE, DUPLICATE_SAME_ACCESS);
    if(!success) {
        return false;
    }
 
    CloseHandle(hChildStdoutRd);
 
    PROCESS_INFORMATION piProcInfo;
    STARTUPINFO siStartInfo;
 
    ZeroMemory(&siStartInfo, sizeof(STARTUPINFO));
    siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
    siStartInfo.hStdOutput = hChildStdoutWr;
 
    BOOL ret = CreateProcess(path, param, NULL,
    NULL, TRUE, DETACHED_PROCESS, NULL, NULL,
    &siStartInfo, &piProcInfo);
    if(ret) {
        // now we can read! :)
        char bufr[8192];
        pipe_read(hChildStdoutRd, hChildStdoutWr, bufr); // it's my function
        strcpy(result, bufr);
    }
}
Читается 0 байтов и всё.
А если указать как источник - STDIN текущего приложения, всё работает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2011, 13:41     Вывод процесса в стрим
Еще ссылки по теме:

Библиотеки процесса, защита от изменения процесса - C++
Здраствуйте. 1) Как можно получить список библиотек (dll, asi), которые уже загружены в процесс какой-то программы? Мне нужно чекать...

Завершение процесса - C++ Builder
Доброго времени суток, помогите. вот так завершаю процесс HANDLE hProcess; BOOL pid; pid= тут какойто id ; ...

Создание процесса - C++ WinAPI
Меня интересует вопрос: процесс можно создавать - открывае .exe файл. Можно ли создать процесс из самого кода, всмысле - под некую...

Распаралеливание процесса. - C++
Здравствуйте! у меня небольшая проблема. Небольшая преамбула: сейчас я пишу консольную игру(тапками не кидаться) по мотивам фильма...


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

Или воспользуйтесь поиском по форуму:
Subgrando
40 / 40 / 3
Регистрация: 28.01.2011
Сообщений: 175
25.02.2011, 13:41  [ТС]     Вывод процесса в стрим #6
Лол, ну да.

C++
1
 CloseHandle(hChildStdoutRd);
Yandex
Объявления
25.02.2011, 13:41     Вывод процесса в стрим
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru