我刚开始用c ++学习windows编程。我有这个疯狂的形象,win32编程基于调用windows函数并向它们发送参数。就像,当你想创建窗口时,你调用一些处理Windows GUI的win32函数并说“嗨,请创建我的新窗口,100 x 100 px,带两个按钮”,并且GUI功能说“嗨,没问题”当发生某些事情时,如用户点击一个按钮,我将更改位于此位置的此变量xy“。
所以,我认为它与控制台编程非常相似。但是第一条指令让我感到惊讶。我一直认为每个程序首先执行main()函数。因此,当我启动应用程序时,Windows会在堆栈顶部存储一些参数并运行该应用程序。所以我假设初始化main()只是一种c ++方式告诉编译器第一条指令应该在哪里。
但是在win32编程中,有一个名为WinMain()的函数首先启动。所以我有点困惑。我认为规则编译器必须有main()开头,main只是定义它的起始位置,就像一些起始点标识符一样。
那么,请问为什么WinMain()函数而不是main()?当我认为C ++编程与汇编程序一样合理时,它又让我感到困惑。
答案 0 :(得分:5)
main()
与WinMain()
一样是任意的入口点。标准只需要一个名为main
的函数来保持一致性。入口点(无论是main
还是WinMain
)实际上是由隐藏的函数调用的,该函数是真正的入口点。在某些平台上,“真实”入口点被称为_start
。正是这个函数执行所有初始工作,如初始化全局变量,设置环境等,然后然后调用main()
。在Windows上,如果可用,则启动函数会调用WinMain()
。
修改:查看this answer以获取更详细的说明。
答案 1 :(得分:2)
与常规控制台应用程序相比,了解Win32应用程序的工作原理需要额外的工作量。
“我有这个疯狂的形象,win32编程基于调用windows函数并向它们发送参数”
我的提示......
1)是的,但也是Windows消息,它是Windows应用程序的节拍,一些例子包括WM_CREATE,WM_MOUSExx,WM_KEYxx,WM_PAINT,其中xx可以向下,依此类推。 消息由Windows自身发送到您的应用程序,您可以定义一个特定的函数来捕获它们(“WindowFunc”)。 有数百条消息,幸运的是,一开始并不需要了解它们。
2)您可以想象在应用程序中创建的每个小部件都是“窗口”,您可以通过CreateWindow函数创建Windows。每个窗口将由32位整数值标识,即所谓的窗口句柄(HWND)< / p>
3你可以想象有许多不同类别的窗口(主窗口,客户区域,编辑,按钮),这些窗口都可以从系统中获得,也可以由你自己创建...... Windows是不同的,因为它们属于不同的WindowClass ......
要定义WindowClass,您必须填充WNDCLASS c结构并调用RegisterClass struct中的字段是指向WindowFunc
的指针4 WindowFunc是一个需要4个输入参数的函数(HWND,WM_XX,wParam,lParam) 一旦有关该窗口(HWND)的事情发生,就会从系统调用该函数
说让我改写你的陈述
“就像,当你想要创建窗口时,你调用一些处理Windows GUI的win32函数并说”嗨,请创建我的新窗口,100 x 100 px,带两个按钮“,并且GUI功能说”嗨,没问题,当有什么事情发生时,比如用户点击一个按钮, ...当用户点击时,我会向windowFunc发送一条消息...请自行检查消息类型,如果是您正在等待的WM_MOUSEDOWN则更改xy的值
还有什么?我建议在sdk中查看一些简单的示例,以确定win 32应用程序流程是如何
欢呼声
答案 2 :(得分:1)
这只是本机Win32程序的惯例。您可以轻松地更改它,MSVC链接器接受/ENTRY:main command line option将入口点名称更改为“main”。但是,您还必须更改main()函数的签名,它需要不同的参数:
int APIENTRY main(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// etc..
}
我想在20年前就给它一个不同的名字。
答案 3 :(得分:1)
您可以从微软开发者处查看this article和another one。简而言之,有几个原因:名称是任意的,Windows的WinMain需要不同的签名,而Windows早于c ++标准化。