有请guotianyu2000,你那个以main开始的windows程序有事请问

有请guotianyu2000,你那个以main开始的windows程序有事请教
首先声明,这个程序我完全能理解在干什么,只是有不少细节还理解的不深,需要指教。

我所谓的有出处,是指是你自己想出来的么?
能解释下console子系统和Windows API的联系,还有main和WinMain?
还有可能运行时不显示那个console窗口?(当然现在显示是很正常的,因为首先它是个console应用,然后新开了线程创建窗口)
有无可能用WinMain开始,但是又带个console窗口?

我想我最疑惑的是:我一直没有用C++开发过窗口,即像这里的“纯”C++,当然我知道这个纯其实很好笑,我也经常笑这种纯论;只是我没有找到像这个程序的一个入口,纯粹由传统的main做入口,我想是我对Windows不太熟悉导致的吧,当然也跟Windows“隐藏”了不少东西有关,总是那么朦朦胧胧。

唠叨了很多,还望指教,咱就聊聊。


# include <windows.h>
# include <iostream>
 
using namespace std;
 
HWND g_hWnd = NULL;
HINSTANCE g_hInst;
volatile bool bCanExit = false;
 
# pragma comment(linker, "/subsystem:\"console\" /entry:\"main\"")
 
LRESULT WndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
    switch (wMsg)
    {
    case WM_CLOSE:
        bCanExit = true;
        PostQuitMessage(0);
        return 0;
 
    default:
        return ::DefWindowProc(hWnd, wMsg, wParam, lParam);
    }
}
 
void CreateWnd()
{
    WNDCLASS wc = {0};
 
    wc.style = 0;
    wc.lpfnWndProc = (WNDPROC)WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = g_hInst;
    wc.hIcon = NULL;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetSysColorBrush(COLOR_GRAYTEXT);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = TEXT("SimpleWindow");
 
    RegisterClass(&wc);
 
    g_hWnd = CreateWindowEx(0, TEXT("SimpleWindow"), TEXT("SimpleWindow"),
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL,
        g_hInst, 0);
}
 
DWORD MyThread(PVOID pArg)
{
    CreateWnd();
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}
 
int main()
{
    g_hInst = GetModuleHandle(NULL);
    HANDLE hThrd = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MyThread,
        NULL, 0, NULL);
    CloseHandle(hThrd);
 
    while (!bCanExit)
    {
        Sleep(10);
    }
 
    cout << "windows has closed" << endl;
 
    getchar();
    return 0;
}


------解决方案--------------------
i remember developing with VC, Application entrance is WinMain.
of course, if you have included VC lib in your system environment, it is also fine to use VC lib but take main as entrance.

有请guotianyu2000,你那个以main开始的windows程序有事请问
------解决方案--------------------
引用:
能解释下console子系统和Windows API的联系,还有main和WinMain?

还有可能运行时不显示那个console窗口?(当然现在显示是很正常的,因为首先它是个console应用,然后新开了线程创建窗口)

有无可能用WinMain开始,但是又带个console窗口?


尝试解释一下,说错请纠正哈:
1、console和win32是两个不同的子系统,风格不太一样,运行机制也不一样。console是win32下模拟以前的dos窗口而已。win32是基于消息机制运行的。
2、你帖出来的代码,是没办法去掉console窗口的。
3、从winmain开始,又带console的话,那么你的程序就是纯win32程序了。最简单的办法是用ShellExecute("cmd"),也可以用AllocConsole函数。操作console窗口也是可以的,你搜一下吧。
------解决方案--------------------
你可以创建一个WIN32应用程序,在连接器设置中把子系统改成控制台,再把_tWinMain的定义改成int _tmain(int argc, _TCHAR* argv[]),在此基础上修改代码试试看,当然如果处理多字节的话,没有t之类的东东。