首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >winmain()的c++用法

winmain()的c++用法
EN

Stack Overflow用户
提问于 2010-03-08 05:10:27
回答 4查看 3.8K关注 0票数 0

我刚刚开始学习c++的windows编程。我有一个疯狂的想法,win32编程是基于调用窗口函数并向它们发送参数。例如,当您想要创建窗口时,您调用一些处理windows GUI win32函数并说“嗨,请创建一个新窗口,100x100px,带两个按钮”,而GUI函数说“嗨,没问题,当发生一些事情时,比如用户单击一个按钮,我将更改位于此位置的变量xy”。

因此,我认为它将非常类似于控制台编程。但是第一个指令就让我很惊讶。我一直认为每个程序都会首先执行main()函数。因此,当我启动应用程序时,windows会在堆栈顶部存储一些参数并运行该应用程序。所以我假设初始化main()只是一种c++方式,用来告诉编译器第一条指令应该在哪里。

但在win32编程中,有一个名为WinMain()的函数,它首先启动。所以我有点困惑。我认为这是编译器必须有main()开始的规则,main只是定义它的开始位置,就像一些起始点标识符。

那么,为什么会有WinMain()函数而不是main()呢?当我认为C++编程和汇编器一样合乎逻辑时,我又一次感到困惑。

EN

回答 4

Stack Overflow用户

发布于 2010-03-08 05:15:54

WinMain()一样,main()也是任意的入口点。为了保持一致性,标准只需要一个名为main的函数。入口点(无论是main还是WinMain)实际上是由一个隐藏函数调用的,该函数是真正的入口点。在一些平台上,这种“真正的”入口点被称为_start之类的东西。该函数执行所有初始工作,如初始化全局变量、设置环境等,然后调用main()。在Windows上,启动函数恰好调用WinMain() (如果可用)。

编辑:有关更详细的解释,请查看this answer

票数 6
EN

Stack Overflow用户

发布于 2010-03-08 05:57:01

与通常的控制台应用程序相比,理解Win32应用程序的工作原理需要额外的工作。

“我有这样一个疯狂的想法,win32编程是基于调用windows函数并向它们发送参数。”

我的提示..。

1)正确,但也包括windows消息,这些消息是Windows应用程序的节拍,例如WM_CREATE、WM_MOUSExx、WM_KEYxx、WM_PAINT,其中xx可以关闭或关闭,等等。消息是由Windows本身发送到您的应用程序的,这取决于您定义一个特定的函数来捕获它们( "WindowFunc")。有成百上千条消息,幸运的是,一开始并不需要理解所有的消息。

2)你可以想象在你的应用程序中创建的每个小工具都是一个“窗口”,你可以通过CreateWindow函数来创建窗口。窗口将由一个32位的整数值来标识,即所谓的窗口句柄( .Each )。

3你可以想象到有很多不同类别的窗口(主窗口、客户区、编辑、按钮),既可以从系统中使用,也可以自己创建……Windows是不同的,因为它们属于不同的WindowClass ...

要定义WindowClass,必须填充WNDCLASS c结构并调用RegisterClass。该结构中的字段是指向WindowFunc的指针

4 WindowFunc是一个接受4个输入参数(HWND、WM_XX、wParam、lParam)的函数,该函数将在有关该窗口的情况发生时立即从系统中调用(HWND)

说让我重写你的声明

例如,当你想要创建窗口时,你调用一些处理windows GUI的win32函数并说“嗨,请创建一个新窗口,100x100px,带两个按钮”,而那个GUI函数说“嗨,没问题,当发生一些事情时,比如用户点击一个按钮,...I会在用户点击时向windowFunc发送一条消息...请自行检查消息类型,如果是您正在等待的WM_MOUSEDOWN,则更改xy的值

还有什么?我建议查看sdk中的一些简单示例,以了解win 32应用程序流是如何运行的

干杯

票数 2
EN

Stack Overflow用户

发布于 2010-03-08 06:37:03

这只是原生Win32程序的一个约定。您可以很容易地更改它,MSVC链接器接受/ENTRY:main command line option将入口点名称更改为"main“。但是,您还必须更改main()函数的签名,它接受不同的参数:

代码语言:javascript
复制
int APIENTRY main(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
  // etc..
}

我猜这就是20年前给它起个不同名字的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2397983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档