ПрограммированиеФорумОбщее

Win32 application + консоль, С++

Страницы: 1 2 3 Следующая »
#0
18:08, 3 апр 2008

Имеется win32-проект. Т.е. точкой входа в прогу является WinMain, рисуется окно, используется Direct3D и т.п... Можно ли как-то ко всему этому хозяйству подключить самую обычную консоль?
Желательно наиболее простым и быстрым способом. Т.е. что бы приложение работало так же как и раньше, но чтоб при его запуске, параллельно грузилась консоль, такая же как в обычном консольном проекте. И чтоб можно было через обычные потоки выводить туда данные.  Т.е. чтоб где-то в тексте проги попросту писать std::cout << ...  и т.п.  А то уже задолбали эти танцы с бубном, если проект не консольный. Иногда нужно в реальном времени выводить в прогу некоторые данные для отладки и такой гемор делать это например через GDI или через D3D выводить текст/значения переменных, перед этим форматировать, все это среди кучи другого кода и т.п. Сейчас все это опять понадобилась, а сил уже нет так мучится.

#1
19:49, 3 апр 2008

Насчет консоли я не знаю, но можно обойтись по другому.
как я понял тебе нужно динамически видеть изменения данных.
есть способ их вставлять в Output (VS6)

void dbgprintf( char * format, ... )
{
  va_list args;
  int len;
  char * buffer;

  va_start( args, format );
  len = _vscprintf( format, args ) // _vscprintf doesn't count
    + 4; // terminating '\0'
  buffer = (char*)malloc( len * sizeof(char) );
  unsigned u =vsprintf( buffer, format, args );
  buffer[u]=13;
  buffer[u+1]=10;
  buffer[u+2]=0;
  OutputDebugString(buffer );
  free( buffer );
}
#2
20:06, 3 апр 2008

Насколько я понял, если ИЗНАЧАЛЬНО сделать проект как консольный, но ничуть не смущаясь начать в нём по принципу оконного создавать оконные классы, вызывать CreateWindow и так далее, в общем как в обычном оконном приложении, то он и будет таким "миксом" - будет и консоль и окна.
Так вроде бы SDL работает.

#3
20:38, 3 апр 2008

В догонку к вопросу автора - может кто нибудь ткнуть носом в статью, где
объясняются такие вещи как: отличие Console App от Win32 App, как в Console App
эту самую консоль не показывать (если это возможно), как в Win32 App показать консоль
(если это возможно) итп. ?

#4
21:08, 3 апр 2008

Можно выводить на стандартный выход (printf) и это будет отображаться в окне Output в Visual Studio. А если запустить из терминала (cmd), будет выводиться в этот терминал.

#5
22:31, 3 апр 2008

В свойствах проекта
Configuration Properties -> Linker -> System выставить у параметра SubSystem "Console (/SUBSYSTEM:CONSOLE)"

В коде проекта заменить
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
на
int main(void)

Итого - консоль + виндузятные окошки.

#6
22:48, 3 апр 2008

Palich
Как в GUI приложении открыть консоль и назначить stdin, stdout, stderr?

const NULL
>как в Console App эту самую консоль не показывать
Как получить хэндл окна консольного приложения?
А там уже ShowWindow, к примеру...

#7
22:49, 3 апр 2008

Всего-то и надо сделать AllocConsole(), чтобы в GUI-приложении открыть консоль. И далее можно писать в неё обычными printf или WriteFile с хендлом, полученным из CreateFile($CONOUT, ...) (второй способ позволяет писать с цветами, двигать текстовый курсор, работать с мышью и т. д.)

>Иногда нужно в реальном времени выводить в прогу некоторые данные для отладки и такой гемор делать это например через GDI или через D3D выводить текст/значения переменных, перед этим форматировать, все это среди кучи другого кода и т.п.
Если для отладки, то бывает удобней иметь нормальный файл с логом (его можно хоть сохранить, и поиск удобней, и любимый текстовый редактор юзать). И OutputDebugString, да.

#8
23:49, 3 апр 2008

Всем спасибо за ответы, все работает. Вот бы еще сделать чтоб при выходе из программы консоль оставалась, пока явно ее не закроешь.
А то когда программа быстро срабатывает, то и консоль только на миг появляется, ничего не прочитать :)

Если для отладки, то бывает удобней иметь нормальный файл с логом (его можно хоть сохранить, и поиск удобней, и любимый текстовый редактор юзать).
Ага. Файл с логом я давно юзаю. Просто в данной ситуации и этого мало :)

#9
0:23, 4 апр 2008

Palich
Самый простой выход - это для отладочной версии создавать консольное приложение. В релизе собирать WINDOWS приложение.

#10
0:52, 4 апр 2008

Palich
праскакивало уже. загружай через cmd (Пуск->Выполнить->cmd)

#11
1:00, 4 апр 2008

>Вот бы еще сделать чтоб при выходе из программы консоль оставалась, пока явно ее не закроешь.
system("pause")

#12
8:47, 4 апр 2008

Palich
>Всем спасибо за ответы, все работает. Вот бы еще сделать чтоб при выходе из
>программы консоль оставалась, пока явно ее не закроешь.
>А то когда программа быстро срабатывает, то и консоль только на миг появляется,
>ничего не прочитать :)

я делаю так:

#include <conio.h>

...
// в конце main()
getch(); // ждет нажатия любой клавиши

microsoft specific

Прошло более 2 лет
#13
5:51, 31 окт 2010

еще можно консольку сделать так:

#include <windows.h> 
#include <stdio.h>
#include <io.h>
#include <fcntl.h>

BOOL CreateConsole(void)
{
  FreeConsole(); //на всякий случай
  if ( AllocConsole() )
  {
    int hCrt = _open_osfhandle((long)
    GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
    *stdout = *(::_fdopen(hCrt, "w"));
    ::setvbuf(stdout, NULL, _IONBF, 0);
    *stderr = *(::_fdopen(hCrt, "w"));
    ::setvbuf(stderr, NULL, _IONBF, 0);
    return TRUE;
  }
  return FALSE;
}

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  CreateConsole();
  printf("WinMain with Console test\n");

  MSG msg;
  while (GetMessage(&msg, NULL, 0, 0))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg); 
  }
  return TRUE;
}

С выводом все очень просто, у мя ща загвоздка в другом.
Не могу сделать ввод команд в консольное окно не прерывая главного цикла.
ведь если сделать тупо std::cin или scanf гденьть в update, то она будет висеть пока я не введу ченить... народ хелп ми

#14
9:54, 31 окт 2010

6Ap+
> Не могу сделать ввод команд в консольное окно не прерывая главного цикла.
> ведь если сделать тупо std::cin или scanf гденьть в update, то она будет висеть
> пока я не введу ченить... народ хелп ми

Запусти консоль в отдельном потоке.  Ну и синхронизации чутка добавить тоже надо...

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.