c++使用winmain()

scyqe7ek  于 2023-11-19  发布在  其他
关注(0)|答案(4)|浏览(151)

我刚开始用c学习windows编程。我有一个疯狂的想法,win32编程是基于调用windows函数并向它们发送参数的。比如,当你想创建窗口时,你调用一些处理windows GUI的win32函数并说“嗨,请为我创建新窗口,100 x 100 px,有两个按钮”,GUI函数说“嗨,没问题,当某些事情发生时,比如用户点击一个按钮,我会改变这个位置的变量xy”。
所以,我认为这将是非常相似的控制台编程。但第一条指令让我惊讶。我一直认为每个程序都先执行main()函数。所以,当我启动应用程序时,windows将一些参数存储在堆栈顶部并运行该应用程序。所以我认为初始化main()只是c
告诉编译器第一条指令应该在哪里的方法。
但是在win32编程中,有一个叫做WinMain()的函数,它首先启动。所以我有点困惑。我认为这是编译器必须有main()作为启动的规则,main只是定义了它的开始位置,就像一些起始点标识符一样。
那么,请问,为什么有WinMain()函数而不是main()?当我认为C++编程和汇编程序一样逻辑时,它又一次让我困惑。

7d7tgy0s

7d7tgy0s1#

main()WinMain()一样是一个任意的入口点。为了保持一致性,标准只需要一个名为main的函数。入口点(无论是main还是WinMain)实际上是由一个隐藏的函数调用的,该函数是 * 真实的 * 入口点。入口点被称为类似_start的东西。它是执行所有初始工作的函数,如初始化全局变量,设置环境等,然后它调用main()。在Windows上,如果可用的话,start函数会调用WinMain()
编辑:查看此答案以获得更详细的解释。

lbsnaicq

lbsnaicq2#

要了解Win32应用程序的工作原理,与通常的控制台应用程序相比,需要额外的努力。
“我有这个疯狂的形象,win32编程是基于调用windows函数和发送参数,并从他们”
我的暗示...
1)真的,但也是Windows应用程序的节拍的Windows消息,一些例子包括WM_CREATE,WM_MOUSExx,WM_KEYxx,WM_PAINT其中xx可以是DOWN UP等。消息由Windows本身发送到您的应用程序,这取决于您定义一个特定的函数来捕获它们(“WindowFunc”)。有数百条消息,幸运的是没有必要一开始就理解所有的消息。
2)你可以想象在你的应用程序中创建的每一个小部件都是一个“窗口”,你可以通过Windows Window函数创建Windows。每个窗口将由一个32位整数值标识,即所谓的窗口句柄(HWND)。
3有这么多不同类别的窗口,你可以想象(主窗口,客户区,编辑,按钮)都可以从系统中,也可以由自己创建.
要定义WindowClass,您必须填充WNDCLASS c结构并调用RegisterClass。结构中的字段是指向WindowFunc的指针
4 WindowFunc是一个接受4个输入参数(HWND,WM_XX,wParam,lParam)的函数。一旦发生与该窗口(HWND)有关的事件,系统就会调用该函数。
让我重写你的证词
“就像,当你想创建窗口时,你调用一些处理窗口GUI的win32函数,说“嗨,请为我创建一个新窗口,100 x 100 px,有两个按钮”,GUI函数说“嗨,没问题,当发生什么事情时,比如用户点击一个按钮,.我将向您发送一条消息到windowFunc作为用户点击.请检查自己的messagetype,如果它是WM_MOUSEDOWN你正在等待,然后改变xy值
还有什么?我建议看看SDK中的一些简单示例,以了解Win32应用程序流是如何工作的
欢呼

bqujaahr

bqujaahr3#

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

int APIENTRY main(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
  // etc..
}

字符串
我想这就是20年前给它起另一个名字的原因。

igsr9ssn

igsr9ssn4#

你可以从微软的开发人员那里检查this articleanother one,简单来说有几个原因:名字是任意的,windows的WinMain需要不同的签名,windows早于c++标准化。

相关问题