Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Лишняя консоль в оконном приложении


Автор: Курсант 22.1.2017, 23:24
Всем здравствуйте!

Создаю оконное приложение (обычный пример оконного приложения), но рядом с окном запускается консоль. Откуда она берётся?

Использую компилятор gcc и среду Code::Blocks.

Автор: vol4ek 22.1.2017, 23:35
 код покажите или ссылку дайте на пример который скачивали

Автор: GremlinProg 23.1.2017, 05:39
Цитата(Курсант @  23.1.2017,  01:24 Найти цитируемый пост)
но рядом с окном запускается консоль. Откуда она берётся?

Значит, создаете консольное приложение. Проверьте свойства проекта.

Автор: Курсант 24.1.2017, 13:55
Цитата(vol4ek @ 22.1.2017,  23:35)
код покажите или ссылку дайте на пример который скачивали

Код

#if defined(UNICODE) && !defined(_UNICODE)
    #define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
    #define UNICODE
#endif

#include <tchar.h>
#include <windows.h>

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
TCHAR szClassName[ ] = _T("CodeBlocksWindowsApp");

int WINAPI WinMain (HINSTANCE hThisInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszArgument,
                     int nCmdShow)
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default colour as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           _T("Code::Blocks Template Windows App"),       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nCmdShow);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}



Добавлено @ 13:58
Цитата(GremlinProg @ 23.1.2017,  05:39)
Цитата(Курсант @  23.1.2017,  01:24 Найти цитируемый пост)
но рядом с окном запускается консоль. Откуда она берётся?

Значит, создаете консольное приложение. Проверьте свойства проекта.

Спасибо, наверное, так и есть. Правда в Code::Blocks я создаю GUI-приложение, Frame-Based. По идее это ведь ни на что не влияет, только на начальный код проекта? Если формат файла PE, если я явно нигде не создаю консоль, значит никто не может мне вызвать консоль, кроме меня? Но я нигде её явно не вызываю.

Получается, есть отдельный вид приложений, для которых консоль создаётся по умолчанию операционной системой?

Какая-то муть. Решил попробовать поработать в gcc, и вот уже какие-то сюрпризы непонятные.

Автор: vol4ek 24.1.2017, 14:24
код нормальный и в студии все ок. откуда Code::Bloks берет консоль и как приаттачивает ее к виндовс окну я хз  smile 
никогда не пользовался этой IDE.

Добавлено через 1 минуту и 39 секунд
смотрите настройки проекта в Code::Bloks или взьмите VS если есть под рукой

Автор: xvr 24.1.2017, 14:45
Запустите полученный exe вне CodeBlocks. Есть консольное окно? Если нет - то это происки самого CodeBlocks, если есть - то это происки компилятора  smile 

Автор: vol4ek 24.1.2017, 14:51
Цитата(xvr @ 24.1.2017,  14:45)
Запустите полученный exe вне CodeBlocks. Есть консольное окно? Если нет - то это происки самого CodeBlocks, если есть - то это происки компилятора  smile

студия выплюнет такой код на функции WinMain если проект будет консольный, какого его CodeBloks жреть smile 

Автор: Курсант 24.1.2017, 17:41
Цитата(xvr @ 24.1.2017,  14:45)
Запустите полученный exe вне CodeBlocks. Есть консольное окно? Если нет - то это происки самого CodeBlocks, если есть - то это происки компилятора  smile

Хы, запустил - консоль есть и вне Code::Blocks, и в Code::Blocks. Только вне Code::Blocks консоль закрывается при закрытии окна, а при запуске из под Code::Blocks при закрытии окна в консоли отображается время работы программы и предлагается нажать любую кнопку. Очень похоже на какой-нибудь дебагер из состава gcc, но не уверен. Что происходит в скомпилированном проекте - вообще понять не могу.

Хотелось бы понять логику...

Всё-таки так хочется оседлать и настроить вменяемо хотя бы одну бесплатную IDE и компилятор. Но ничего не получается, всё время какая-то ерунда получается...

Добавлено через 2 минуты и 46 секунд
Цитата(vol4ek @ 24.1.2017,  14:24)
код нормальный и в студии все ок. откуда Code::Bloks берет консоль и как приаттачивает ее к виндовс окну я хз  smile 
никогда не пользовался этой IDE.

Добавлено @ 14:25
смотрите настройки проекта в Code::Bloks или взьмите VS если есть под рукой

Взять VS, конечно, проще всего. Хочу запустить бесплатную IDE с компилятором, и разобраться, как работает. Люди же его делали, не обезьяны, наверное как-то работать должно...

Автор: vol4ek 24.1.2017, 17:48
Цитата(Курсант @ 24.1.2017,  17:41)
Что происходит в скомпилированном проекте - вообще понять не могу.
Хотелось бы понять логику...

-Видишь суслика?
- Нет.
-А он есть  smile 

Автор: xvr 24.1.2017, 20:41
Цитата(Курсант @  24.1.2017,  17:41 Найти цитируемый пост)
Хы, запустил - консоль есть и вне Code::Blocks, и в Code::Blocks.

Значит проект консольный.
Цитата

int WINAPI WinMain (HINSTANCE hThisInstance,
И при это с WinMain'ом. Круть. Это специально сделать не получится, только случайно  smile 
Еще можете глянуть http://stackoverflow.com/error?aspxerrorpath=/questions/33690697/running-my-c-code-gives-me-a-blank-console, вроде что то похожее (сам посмотреть не могу - StackOverflow висит)

Автор: GremlinProg 24.1.2017, 21:53
Здесь где-то уже разбирался подобный вопрос.
В PE есть флаг, отвечающий за подсистему (subsystem) приложения. Если его выставить, то будет автоматически создаваться консоль.
При этом, Вам ни кто не мешает тут же создать обычное окно.

В WinApi есть аналог - AllocConsole. Если эта функция ни где у Вас не вызывается, значит консоль создается ядром, по флагу в PE.
Посмотрите в документацию к своему компоновщику, как сменить подсистему.
В vs тоже есть аналогичная опция: https://msdn.microsoft.com/en-us/library/fcc1zstk.aspx

Автор: xvr 25.1.2017, 16:36
Исправленная ссылка - http://stackoverflow.com/questions/33690697/running-my-c-code-gives-me-a-blank-console

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)