Win32 API 你好,世界

示例

Microsoft Windows应用程序通常被编写为控制台应用程序或窗口应用程序(还有其他类型,例如服务和插件)。程序员的区别在于程序员提供的应用程序源的主要入口点的接口方面的差异。

当C或C ++应用程序启动时,可执行装入程序使用的可执行入口点是编译器提供的运行时。可执行文件加载器读取可执行文件,对所需的映像进行任何修复,然后调用可执行文件入口点,对于C或C ++程序,该入口点是编译器提供的运行时。

加载程序调用的可执行文件入口点不是应用程序程序员提供的主要入口点,而是由编译器和创建可执行文件的链接器提供的运行时。运行时为应用程序设置环境,然后调用程序员提供的主入口点。

Windows控制台应用程序对于程序员提供的主要入口点可能具有几个略有不同的界面。两者之间的区别在于,主要的入口点是传统入口点int main (int argc, char *argv[])还是Windows特定版本,int _tmain(int argc, _TCHAR* argv[])该入口点在应用程序参数中提供了宽字符。如果使用Visual Studio生成Windows Win32控制台应用程序项目,则生成的源将是Windows特定的版本。

Windows窗口(GUI)应用程序为程序员提供的主要入口点具有不同的接口。程序员提供的这个主要入口点具有更复杂的界面,因为运行时设置了GUI环境,并提供了附加信息以及应用程序参数。

本示例说明Windows窗口(GUI)主入口点界面。要探索此主题,您应该具有:

  • 具有编译器的IDE(最好是Visual Studio)

  • C知识

使用IDE创建一个空的Win32 Windows(GUI,而不是控制台)项目。必须为窗口应用程序(而非控制台应用程序)设置项目设置,以使链接器链接到正确的运行系统。创建一个main.c文件,将其添加到项目中,然后键入以下代码:

#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow)
{
    return MessageBox(NULL, "hello, world", "caption", 0);
}

这是我们的Win32“ Hello,world”程序。第一步是包括Windows头文件。所有Windows的主要标头是windows.h,但还有其他标头。

的WinMain是从一个标准的不同与控制台应用程序中使用。接口中使用了更多参数,更重要的是,窗口应用程序的主入口点使用的调用约定与标准C / C ++不同。int main()

限定符APIENTRY表示调用约定,这是将参数压入堆栈的顺序。默认情况下,调用约定是指示的标准C约定__cdecl。但是,Microsoft对Windows API函数使用了另一种类型的调用约定,即PASCAL约定,由__stdcall限定符指示。APIENTRY是__stdcall其中包含的头文件之一中的已定义名称windows.h(另请参见__stdcall是什么?)。

接下来的参数WinMain如下:

  • hInst:实例句柄

  • hInstPrev:上一个实例句柄。不再使用。

  • cmdline:命令行参数(请参阅将WinMain(或wWinMain)参数传递给普通main)

  • cmdshow:指示是否应显示一个窗口。

我们还没有使用任何这些参数。

在内WinMain(),是对的调用MessageBox(),该调用显示带有消息(消息框)的简单对话框。第一个参数是所有者窗口的句柄。由于我们还没有自己的窗口,请通过NULL。第二个参数是正文。第三个参数是标题,第四个参数包含标志。传递0时,将显示默认消息框。下图剖析了消息框对话框。

好的链接:

  • winprog.org上的教程

  • MessageBox MSDN上的功能文档

仅在32位系统上。其他体系结构具有不同的调用约定。