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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> printf в неконсольном приложении, перехват StdIn и StdOut 
:(
    Опции темы
Dem_max
Дата 14.5.2013, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



Как в не консольном (в своем же процессе) приложении перехватить то что выводит printf.
И если существует StdIn и StdOut для не консольного приложения как его перехватить и вывести в тот же Edit


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
GremlinProg
Дата 15.5.2013, 07:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Dem_max @  14.5.2013,  17:57 Найти цитируемый пост)
в не консольном

думаю, в таком случае надежнее будет использовать пайпы

Добавлено через 28 секунд
а не StdIn и StdOut


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Dem_max
Дата 15.5.2013, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



Пробовал так
Код

#define BUFSIZE     100
TCHAR chBuf[BUFSIZE];
 
    hStdin = GetStdHandle(STD_INPUT_HANDLE);
        if(hStdin == INVALID_HANDLE_VALUE)
        OutputDebugString("GetStdHandle");
 
    for(;;)
    {
 
        if(!ReadConsole(hStdin, chBuf, BUFSIZE, &dwRead, NULL))
        //if(!ReadFile(hStdin, chBuf, BUFSIZE, &dwRead, NULL))
        {
            wsprintf(txt, "ReadConsole FAIL = %0X", GetLastError());
            OutputDebugString(txt);
        }
    }


но возвращается ReadConsole FAIL = 8


Собственно к чему замут то, имею python.dll из которой вызываю функции и передаю им имя скрипта на выполнение, но результата не вижу. Нужно как то получать выполнения скрипта питона.

Это сообщение отредактировал(а) Dem_max - 15.5.2013, 07:34


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
DarthTon
Дата 15.5.2013, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня работает как-то так:

Код

#include <tchar.h>
#include <stdio.h>
#include <Io.h>
#include <Fcntl.h>
#include <windows.h>

DWORD CALLBACK ThdProc(LPVOID /*lpParam*/)
{
    DWORD dwBytes = 0;
    char buf[0x1000] = {0};

    HANDLE hPipe = CreateFile(_T("\\\\.\\pipe\\SomePipeName"), 
        GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);

    if(hPipe != INVALID_HANDLE_VALUE)
    {
        //for(;;)
        {
            DWORD dwBytes = 0;
            DWORD dwLeft  = 0;
            DWORD dwOfst  = 0;

            ReadFile(hPipe, buf, 0x1000, &dwBytes, NULL);

            dwOfst = dwBytes;

            PeekNamedPipe(hPipe, NULL, NULL, NULL, &dwLeft, 0);

            while(dwLeft > 0)
            {
                ReadFile(hPipe, buf + dwOfst, dwLeft, &dwBytes, NULL);
                dwOfst += dwBytes;

                PeekNamedPipe(hPipe, NULL, NULL, NULL, &dwLeft, 0);
            }

            MessageBoxA(NULL, buf, "Buffer", 0);
        }

        CloseHandle(hPipe);
    }

    return 0;
}

int APIENTRY _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    HANDLE hPipe = CreateNamedPipe(_T("\\\\.\\pipe\\SomePipeName"), PIPE_ACCESS_OUTBOUND,
        PIPE_TYPE_BYTE, 1, 0x1000, 0x1000, 0, NULL);

    if(hPipe != INVALID_HANDLE_VALUE)
    {
        HANDLE hThd = CreateThread(NULL, 0, &ThdProc, NULL, 0, NULL);

        if(hThd && ConnectNamedPipe(hPipe, NULL))
        {
            int pipeDesc = _open_osfhandle((intptr_t)hPipe, 0);

            if(pipeDesc > 0)
            {
                FILE *fp = _fdopen(pipeDesc, "w");

                if(fp)
                {
                    *stdout = *fp;
                    setvbuf(stdout, NULL, _IONBF, 0);

                    printf("This is test message\n");

                    WaitForSingleObject(hThd, INFINITE);
                    fclose(fp);
                }
            }
        }
    }
    
    return 0;
}


Тут возникают проблемы с буферизацией stdout, если её не отключить (setvbuf(stdout, NULL, _IONBF, 0)) то пайп ждёт либо полного заполнения буфера, либо надо флашить stdout вручную. В документации к setvbuf, однако, есть флаг _IOLBF, описание которого гласит 
Цитата

Line buffering: On output, data is written when a newline character is inserted into the stream or when the buffer is full (or flushed), whatever happens first. On Input, the buffer is filled up to the next newline character when an input operation is requested and the buffer is empty.

Но у меня он всё равно не заработал, как бы я не пытался отправить в поток newline character.
PM MAIL   Вверх
GremlinProg
Дата 15.5.2013, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(DarthTon @  15.5.2013,  13:31 Найти цитируемый пост)
Но у меня он всё равно не заработал, как бы я не пытался отправить в поток newline character.

а если не использовать CRT(printf), а писать в пайп с помощью WriteConsole?

Добавлено через 1 минуту и 18 секунд
или WriteFile?


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
DarthTon
Дата 15.5.2013, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



При помощи WriteConsole можно писать только в консольные хендлы (GetStdHandle(STD_OUTPUT_HANDLE) и т.п.), для хендла пайпа оно возвращает Invalid Handle; подмена дефолтного STD_OUTPUT_HANDLE на хендл пайпа тоже не помогает . 
Я не тестировал WriteFile в пайп на больших сообщениях, но на маленьких всё работает как и должно . Проблемы только при использовании CRT с буферизацией. 
PM MAIL   Вверх
Dem_max
Дата 15.5.2013, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



_open_osfhandl
это CRT от мелкомягких,  оно никак не подходит для других компиляторов.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0649 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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