Имеется win32-проект. Т.е. точкой входа в прогу является WinMain, рисуется окно, используется Direct3D и т.п... Можно ли как-то ко всему этому хозяйству подключить самую обычную консоль?
Желательно наиболее простым и быстрым способом. Т.е. что бы приложение работало так же как и раньше, но чтоб при его запуске, параллельно грузилась консоль, такая же как в обычном консольном проекте. И чтоб можно было через обычные потоки выводить туда данные. Т.е. чтоб где-то в тексте проги попросту писать std::cout << ... и т.п. А то уже задолбали эти танцы с бубном, если проект не консольный. Иногда нужно в реальном времени выводить в прогу некоторые данные для отладки и такой гемор делать это например через GDI или через D3D выводить текст/значения переменных, перед этим форматировать, все это среди кучи другого кода и т.п. Сейчас все это опять понадобилась, а сил уже нет так мучится.
Насчет консоли я не знаю, но можно обойтись по другому.
как я понял тебе нужно динамически видеть изменения данных.
есть способ их вставлять в 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 ); }
Насколько я понял, если ИЗНАЧАЛЬНО сделать проект как консольный, но ничуть не смущаясь начать в нём по принципу оконного создавать оконные классы, вызывать CreateWindow и так далее, в общем как в обычном оконном приложении, то он и будет таким "миксом" - будет и консоль и окна.
Так вроде бы SDL работает.
В догонку к вопросу автора - может кто нибудь ткнуть носом в статью, где
объясняются такие вещи как: отличие Console App от Win32 App, как в Console App
эту самую консоль не показывать (если это возможно), как в Win32 App показать консоль
(если это возможно) итп. ?
Можно выводить на стандартный выход (printf) и это будет отображаться в окне Output в Visual Studio. А если запустить из терминала (cmd), будет выводиться в этот терминал.
В свойствах проекта
Configuration Properties -> Linker -> System выставить у параметра SubSystem "Console (/SUBSYSTEM:CONSOLE)"
В коде проекта заменить
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
на
int main(void)
Итого - консоль + виндузятные окошки.
Palich
Как в GUI приложении открыть консоль и назначить stdin, stdout, stderr?
const NULL
>как в Console App эту самую консоль не показывать
Как получить хэндл окна консольного приложения?
А там уже ShowWindow, к примеру...
Всего-то и надо сделать AllocConsole(), чтобы в GUI-приложении открыть консоль. И далее можно писать в неё обычными printf или WriteFile с хендлом, полученным из CreateFile($CONOUT, ...) (второй способ позволяет писать с цветами, двигать текстовый курсор, работать с мышью и т. д.)
>Иногда нужно в реальном времени выводить в прогу некоторые данные для отладки и такой гемор делать это например через GDI или через D3D выводить текст/значения переменных, перед этим форматировать, все это среди кучи другого кода и т.п.
Если для отладки, то бывает удобней иметь нормальный файл с логом (его можно хоть сохранить, и поиск удобней, и любимый текстовый редактор юзать). И OutputDebugString, да.
Всем спасибо за ответы, все работает. Вот бы еще сделать чтоб при выходе из программы консоль оставалась, пока явно ее не закроешь.
А то когда программа быстро срабатывает, то и консоль только на миг появляется, ничего не прочитать :)
Если для отладки, то бывает удобней иметь нормальный файл с логом (его можно хоть сохранить, и поиск удобней, и любимый текстовый редактор юзать).
Ага. Файл с логом я давно юзаю. Просто в данной ситуации и этого мало :)
Palich
Самый простой выход - это для отладочной версии создавать консольное приложение. В релизе собирать WINDOWS приложение.
Palich
праскакивало уже. загружай через cmd (Пуск->Выполнить->cmd)
>Вот бы еще сделать чтоб при выходе из программы консоль оставалась, пока явно ее не закроешь.
system("pause")
Palich
>Всем спасибо за ответы, все работает. Вот бы еще сделать чтоб при выходе из
>программы консоль оставалась, пока явно ее не закроешь.
>А то когда программа быстро срабатывает, то и консоль только на миг появляется,
>ничего не прочитать :)
я делаю так:
#include <conio.h>
...
// в конце main()
getch(); // ждет нажатия любой клавиши
microsoft specific
еще можно консольку сделать так:
#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, то она будет висеть пока я не введу ченить... народ хелп ми
6Ap+
> Не могу сделать ввод команд в консольное окно не прерывая главного цикла.
> ведь если сделать тупо std::cin или scanf гденьть в update, то она будет висеть
> пока я не введу ченить... народ хелп ми
Запусти консоль в отдельном потоке. Ну и синхронизации чутка добавить тоже надо...
Тема в архиве.