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

ForestDB 2012-12-21 10:30:42
首先声明,这个程序我完全能理解在干什么,只是有不少细节还理解的不深,需要指教。

我所谓的有出处,是指是你自己想出来的么?
能解释下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;
}

...全文
257 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2013-11-22
  • 打赏
  • 举报
回复
居然一年就过去了。
图灵狗 2012-12-21
  • 打赏
  • 举报
回复
你可以创建一个WIN32应用程序,在连接器设置中把子系统改成控制台,再把_tWinMain的定义改成int _tmain(int argc, _TCHAR* argv[]),在此基础上修改代码试试看,当然如果处理多字节的话,没有t之类的东东。
边走边瞧 2012-12-21
  • 打赏
  • 举报
回复
引用 楼主 ForestDB 的回复:
能解释下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窗口也是可以的,你搜一下吧。
东大坡居士 2012-12-21
  • 打赏
  • 举报
回复
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 2012-12-21
  • 打赏
  • 举报
回复
真的有点受宠若惊,昨天的回答并没有针对个人的,我的意思是在Win32 Console Application条件下也可以使用Windows API创建窗体程序,所以不要太针对出处。 下面仅是我的理解,有可能是错误的,仅供讨论! 1、Win32 Console Application和Win32 Application都是Windows 32位平台程序。Win32 Application是标准windows程序,基于消息机制的,完全拥有windows的特性!Win32 console application 类似于DOS程序(因为传统DOS是16位),但也可以访问windows系统API! 关键在于,一个的入口点WinMain,而另一个是main()。编译时,编译器总是寻找相应的函数来链接。具体如何判断其实我也并没有深入研究过,所以这一点我也不是很清楚。 2、但是,我在网上曾看到又问分析过这个问题,他说:1)EXE文件本身有区别:在文件头里(PE头)有一个标记表明该文件是Application还是Console。2)OS在创建对应的进程时,如果是Console,除了载入文件映像并开启进程外(这一点和Application相同),同时创建一个Console对象(就是那个黑黑的窗口)与之关联,而且这种关联是可以编程脱开的。从这个观点来看,在Win 32Application中即以WinMain为入口函数时,是不会产生控制台窗口即所谓的Console窗口。 3、Windows API和前两者应该是不具比较特征的吧,Windows API是Windows平台下的接口函数,而前两者是平台上的不同应用类型。但是二者都可以使用这种接口。
ForestDB 2012-12-21
  • 打赏
  • 举报
回复
人 工 置 顶。

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧