0

我刚开始学习 c++ 中的 windows 编程。我有一个疯狂的形象,win32 编程是基于调用 windows 函数并从它们发送参数。就像,当你想创建窗口时,你调用一些处理 windows GUI 的 win32 函数并说“嗨,请给我创建一个新窗口,100 x 100 像素,有两个按钮”,然后那个 GUI 函数说“嗨,没问题,当发生某些事情时,例如用户单击一个按钮,我将更改位于此位置的变量 xy”。

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

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

那么,请问为什么有 WinMain() 函数而不是 main()?当我认为 C++ 编程与汇编程序一样合乎逻辑时,它再次让我感到困惑。

4

4 回答 4

6

main()是任意的入口点WinMain()。该标准只需要一个main为一致性命名的函数。入口点(无论是main还是WinMain)实际上是由作为真正入口点的隐藏函数调用的。在某些平台上,“真正的”入口点被称为类似_start. 正是这个函数完成了所有的初始工作,比如初始化全局变量、设置环境等,然后它调用main(). WinMain()在 Windows 上,如果可用,该 start 函数恰好会调用。

编辑:查看这个答案以获得更详细的解释。

于 2010-03-07T21:15:53.723 回答
2

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

“我有一个疯狂的形象,win32 编程是基于调用 windows 函数和向它们发送参数”

我的提示...

1 ) 是的,还有作为 Windows 应用程序节拍的 Windows 消息,一些示例包括 WM_CREATE、WM_MOUSExx、WM_KEYxx、WM_PAINT,其中 xx 可以 DOWN UP 等等。消息由 Windows 本身发送到您的应用程序,您可以定义一个特定的函数来捕获它们(“WindowFunc”)。有数百条消息,幸运的是,一开始并不需要全部了解。

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

3 您可以想象有许多不同类别的窗口(主窗口、客户端区域、编辑、按钮),既可以从系统中获得,也可以由您自己创建……Windows 是不同的,因为它们属于不同的 WindowClass……

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

4 WindowFunc 是一个接受 4 个输入参数 (HWND,WM_XX,wParam,lParam) 的函数

说让我重写你的陈述

“就像,当你想创建窗口时,你调用一些处理 windows GUI 的 win32 函数并说“嗨,请给我创建一个新窗口,100 x 100 像素,有两个按钮”,然后那个 GUI 函数说“嗨,不问题,当发生某些事情时,例如用户单击一个按钮,...当用户单击时,我会向 windowFunc 发送一条消息...请自行检查消息类型,如果是您等待的 WM_MOUSEDOWN 然后更改xy 的值

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

干杯

于 2010-03-07T21:57:00.503 回答
1

您可以查看这篇文章以及来自微软开发人员的另一篇文章。简而言之,有几个原因:名称是任意的,windows 的 WinMain 需要不同的签名,以及 windows 早于 c++ 标准化。

于 2010-03-08T03:10:23.297 回答
1

这只是本机 Win32 程序的约定。您可以轻松更改它,MSVC 链接器接受/ENTRY:main 命令行选项将入口点名称更改为“main”。但是,您还必须更改 main() 函数的签名,它需要不同的参数:

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

我想这是 20 年前给它一个不同的名字的意义所在。

于 2010-03-07T22:37:02.963 回答