Можно ли как-нибудь реализовать запуск MFC-приложения в оконном или консольном режиме в зависимости от параметра командной строки?
Здравствуйте, ahaos, Вы писали:
A>Можно ли как-нибудь реализовать запуск MFC-приложения в оконном или консольном режиме в зависимости от параметра командной строки?
Для exe способ запуска задается в параметрах линкера /SUBSYSTEM:WINDOWS или /SUBSYSTEM:CONSOLE.
Соответственно, в рантайме изменить его не получится.
Для настоящих консольных приложений (которые /SUBSYSTEM:CONSOLE) возможно использование одного консольного окна несколькими процессами.
Например, из Far запускаем консольную прогу, она вываливает свой вывод в консоль Far'a.
Если устраивает вариант, когда будет всегда создаваться свое консольное окно, то можно скрестить MFC-шные окошки и консоль.
Вот так можно инициализировать MFC в рантайм:
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR /*lpCmdLine*/,
int nCmdShow)
{
if (AfxWinInit(hInstance, hPrevInstance, ::GetCommandLineW(), nCmdShow))
{
// ... здесь можем работать с MFC
AfxWinTerm();
}
}
А так создать новое консольное окно:
if (AllocConsole())
{
SetConsoleCtrlHandler(..., TRUE);
SetConsoleTitleW(L"My Console");
freopen("CON", "at", stdout);
freopen("CON", "at", stderr);
}
Теоретически в WinMain можно делать одно или другое, в зависимости от командной строки.
Здравствуйте, ahaos, Вы писали:
A>Можно ли как-нибудь реализовать запуск MFC-приложения в оконном или консольном режиме в зависимости от параметра командной строки?
вся беда я так понимаю в
Subsystem и сделать оба варианта в одном приложении скорее всего не выйдет.
однако, т.к. дело в консоли, то можно (если соотв. параметр запуска из консоли задан) самому определить, запускается ли приложение из консоли (тогда используем ее, printf, etc.), а если ее нет, то создаем сами и работаем через нее (AllocConsole, WriteConsole, etc.)