2015-02-21 2 views
2

Недавно я переключился с кодовых блоков на VC++. Когда я создал базовую оконную программу в кодовых блоках с winapi, у меня было бы окно консоли в фоновом режиме, в котором отображались такие вещи, как std :: cout. Теперь, когда я запускаю ту же программу на Visual C++, она показывает мне окно winapi, а не консоль. Поэтому, если я установил его в cout < < «нажмите», когда я нажимаю, он не отображается, потому что theres no console.Консоль, показывающая при запуске программы winapi

Кто-нибудь знает, как это исправить? Я не знаю, нужно ли вставлять строку или изменять настройку.

UPDATE:

Я создал следующий код, чтобы прикрепить консоль к моему окну и иметь его зарегистрировать соиЬ, CIN и заблуждаться.

AllocConsole(); 
AttachConsole(GetCurrentProcessId()); 
freopen_s(&conin, "conin$", "r", stdin); 
freopen_s(&conout, "conout$", "w", stdout); 
freopen_s(&conout, "conout$", "w", stderr); 

хотя, когда я строй, я получаю сообщение об ошибке сказав, что & CONIN, & CONOUT является необъявленным. Я действительно не знаю, каким должен быть этот первый параметр, даже после прочтения это «Указатель на указатель файла, который будет предоставляться вызовом». Что я должен здесь положить?

+1

Используйте 'AllocConsole()', чтобы добавить консоль в вашу программу GUI. –

+0

Почему кодовые блоки сделали это автоматически? – 23scurtu

+1

В MSVC++ это не работает. Трудно догадаться, что вы делаете неправильно, если вы говорите о C++ и Visual Basic. Но высокие шансы, что вы используете неправильный шаблон проекта для начала работы. Используйте консольное приложение Win32. –

ответ

3

При связывании исполняемого файла для Windows, у вас есть возможность определить флаг в PE заголовок, который определяет, является ли или не исполняемый файл приложения в консоли или приложение для Windows . Единственное, что делает этот флаг, - определить, создает ли Windows консоль для вашей программы при ее запуске (и, возможно, также подключит к ней стандартные дескрипторы, я точно не знаю, но в документах AllocConsole() подразумевается так). Типичные программы Windows не используют консоль, поэтому для них это хорошо.

Я не знаю, какие шаблоны проектов Code :: Blocks предоставляет по умолчанию, но Visual Studio предоставляет как консольное приложение, так и шаблоны приложений Windows, и который вы выбираете, определяет, для чего установлен этот флаг компоновщика. Вы должны иметь возможность изменять флаг с помощью IDE на странице параметров проекта. (Различные шаблоны проектов в основном дают вам разные стартовые коды и настройки для работы, но они отнюдь не абсолютные показатели того, что вы можете написать.)

Если вы использовали Code :: Blocks без создания проекта (как-то , Я не использую Code :: Blocks), важно знать, что MinGW, который, скорее всего, является компилятором, с которым поставляется Code :: Blocks, создает консольные приложения по умолчанию.

Как пояснил комментарий Джонатана Поттера выше, в консоли нет ничего особенного; вы можете создавать консоли и использовать их на лету в своей программе. Подробнее см. В MSDN. Однако, если вы это сделаете, см. Комментарий Remy Lebeau ниже, поскольку вам нужно сообщить об этом stdio (и iostream, в случае C++). Аналогично, консольная программа может создавать обычные окна по своему усмотрению.

Последняя ошибка заключается в том, что компилятор Microsoft фактически различает main) для консольных приложений и WinMain() для приложений Windows. WinMain() был введен потому, что 16-разрядная Windows требовала дополнительной информации при запуске: аргументы hPrevInstance и lpCmdLine устарели, а аргументы hInstance и nCmdShow могут быть доступны с помощью множества других средств. При этом я не знаю, как заставить компиляторы Microsoft принять main() в проекте приложения Windows и наоборот; вы, вероятно, могли бы найти где-нибудь с некоторыми поисками ...

Также будьте осторожны, когда обратитесь к компонентам Visual Studio: Visual C++ и Visual Basic - это разные вещи.

+0

Хммм, когда я беру тот же код, который использовал и поместил его в консольный проект wind32, я получаю две ошибки: нерешенные внешние и неразрешенные внешние символы _main ссылаются на функцию ___tmainCRTStartup – 23scurtu

+1

Существует одно важное отличие. Если вы создаете * Windows Applicaton *, а затем вызываете 'AllocConsole()', чтобы дать ему новую консоль, 'std :: cout' ** не ** подключается к ней автоматически, поскольку она инициализируется перед' AllocConsole() ' называется. Вы должны [использовать 'freopen()' для перенаправления 'stdout'] (http://stackoverflow.com/a/15547699/65863) на новую консоль, тогда будет работать' std :: cout'. В противном случае вместо этого вы должны использовать 'WriteConsole()'. –

+0

@RemyLebe Почему это не требует также 'cout.sync_with_stdio()', как предполагает пример кода? что-то о реализации Microsoft iostream? Спасибо, что указали это; не знал этого и обновил ответ, чтобы указать – andlabs

Смежные вопросы