MinGW的,建立与控制台GUI应用程序(MinGW, build GUI application

2019-08-02 01:17发布

我使用MinGW的建立我的Windows应用程序。 当编译和链接,选择“-mwindows”放在命令行有Win32 API函数。

更具体地讲:叫MinGW的海湾合作委员会无时“-mwindows”是这样的:

c:\>g++ -c main.cpp 
c:\>g++ -o main.exe main.o

2个命令行之后的“MAIN.EXE”以上将与控制台运行,和Win32 API函数将无法使用。

当调用MinGW的海湾合作委员会与“-mwindows”是这样的:

c:\>g++ -c main.cpp
c:\>g++ -o main.exe main.o -mwindows

现在,随着“-mwindows”链接,在“MAIN.EXE”可以使用Win32 API的,但是,它不会启动一个控制台应用程序运行时。

这种“-mwindows”选项禁用控制台,这使我无法打印出调试信息。 任何方式保持在控制台和选项“-mwindows”?

Answer 1:

我对这个答案没有证据,只有一点点的说是成功的实验。 如果我有一个Hello应用程序,就像这样:

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

int main(void)
{
    puts("hi");
    MessageBox(NULL, "test", "test", NULL);
    GetStockObject(0);
    return 0;
}

不能编译-mconsole ,因为链接抱怨GetStockObject 。 但是,当我与添加必要的库-lgdi32我的命令行开关 ,应用程序编译和执行干净。 也许这是保持在控制台和GDI方式。 这是命令行:

gcc -mconsole test_gdi.c -lgdi32


Answer 2:

-mconsole开关用于指定您要定位的控制台子系统。 你真的想这样做,以确保如果从一个控制台应用程序启动的过程中连接到现有的控制台。 例如,假设你下去你的瞄准GUI子系统,然后调用的路线AllocConsole()按你自己的答案。 然后你会发现你的应用程序显示了一个全新的控制台,而不是从另一个控制台应用程序,例如启动时,使用现有cmd.exe

如果你需要用到其他库,那么您可以自由使用,将它们添加命令行-l 。 没有什么特别的一个控制台应用程序,这意味着它不能连接到任何Win32 API函数。 只是,与相关库的默认设置-mconsole缺少一些你想要的库。

在另一方面,你可以同时使用-mconsole-mwindows当你建立你的应用程序。 他们不是相互排斥的。

gcc -mconsole -mwindows main.c

这产生了针对控制台子系统的应用程序。 而你得到的标准-mwindows设置自动链接的Win32库。 它可能实现你的目标,最简单的方法。



Answer 3:

我找到了答案。 如从采取使用STDIN与AllocConsole()

AllocConsole();
freopen("CONIN$", "r",stdin); 
freopen("CONOUT$","w",stdout); 
freopen("CONOUT$","w",stderr);  

它的工作原理像变魔术一样!

参考对'freopen函数': http://www.cplusplus.com/reference/clibrary/cstdio/freopen/



Answer 4:

您需要手动捕捉的hInstance和的nCmdShow(WinMain函数参数)。 您可以使用下面的C函数来做到这一点:

HINSTANCE GetHInstance( ) {
    return (HINSTANCE) GetModuleHandleW(NULL);
}

int GetNCmdShow() {
    STARTUPINFOW startupInfo;
    GetStartupInfoW(&startupInfo);
    if ((startupInfo.dwFlags & STARTF_USESHOWWINDOW) != 0) {
        return startupInfo.wShowWindow;
    }
    return SW_SHOWDEFAULT;

}



文章来源: MinGW, build GUI application with console