为什么WinAPI与;“正常”;C

为什么WinAPI与;“正常”;C,winapi,Winapi,我想知道为什么WinAPI与“普通”C编程有如此大的不同 我的意思是,在学校里,我了解到每个C程序都有一个main()函数(WinAPI使用带有一些特殊参数的WinMain)、一些变量类型,如int、long、char等(WinAPI使用LPCSTR、BOOL等),那么为什么微软决定在他们的OS API上采取如此不同的方式呢 当我看到我的第一个WinAPI程序时,我觉得它更像是一种新语言……;) 有两个主要原因: 复杂性。C语言是最小的,它提供了可以构建更复杂体系结构的构建块。在Win32中可

我想知道为什么WinAPI与“普通”C编程有如此大的不同

我的意思是,在学校里,我了解到每个C程序都有一个main()函数(WinAPI使用带有一些特殊参数的WinMain)、一些变量类型,如int、long、char等(WinAPI使用LPCSTR、BOOL等),那么为什么微软决定在他们的OS API上采取如此不同的方式呢


当我看到我的第一个WinAPI程序时,我觉得它更像是一种新语言……;)

有两个主要原因:

  • 复杂性。C语言是最小的,它提供了可以构建更复杂体系结构的构建块。在Win32中可以找到的LPCSTR、BOOL和其他类型是构建在C之上的typedef或structs
  • 事件导向。C语言通常是假定你的程序是主动的,并且能够控制事情。在面向事件的环境中,例如Windows(或任何其他基于GUI的操作系统),您的程序由操作系统调用,因此它通常位于循环中,等待消息到达

其他基于GUI的操作系统的API可能与Win32有所不同,因为没有单一的解决方案,但它们解决的问题是同一个问题。

最初的Windows API是在25年前的1984-85年间设计的。匈牙利符号非常流行,因此将变量的类型放入声明中是一件需要做的事情。例如,在纯C语言中,无法指示“远”指针,这是LPCSTR中LP所指示的,但在1985年,区分常规指针和远指针非常重要。(当32位windows在90年代中期开始流行时,这种重要性被忽略了,但语法依然存在……)

另外,C实际上并不区分指向字符的指针和指向静态字符串的指针。因此,lpsz类型

最后,它将给参数带来比1984年的普通C语言更强大、一致的输入。至于WinMain,这是因为Windows程序与命令行程序有着本质上的不同。如果您在库中查找,可能会发现一个main()函数,该函数设置参数,然后调用外部WinMain函数(即您的函数)。

正如您所说,它们并没有“走如此不同的路”

WinMain()只是Windows操作系统寻找的入口点。从概念上讲,它与main()没有什么不同

至于符号定义(LPCSTR、BOOL等),部分是为了便于使用。例如,写入
LPCSTR
比写入
const char*
要短。另一个例子是C语言不支持的
BOOL
typedef。另一个原因是将开发人员与底层硬件的更改隔离开来,例如,从16位到32位再到64位架构的更改


这一回答决不能被认为是详尽无遗的。这只是我在使用Win32/MFC进行编程时注意到的几件事。

我想说的是,大部分都是风格问题。这些标准起源于Unix世界,因此,例如,库函数具有短名称,并且没有太多的typedef。我认为这反映了C和Unix设计者的选择。另一方面,Windows有
LongFunctionNamesInMixedCase
,以及
LOTSOFTYPEDEFS
*ptypedefsforpointersoo

其中一些也是对必然性的感知。例如,
WinMain()
具有类似于
nCmdShow
的功能,因为图形应用程序将调用
ShowWindow()
,我想他们希望能够将参数传递给新启动的进程。这是否真的需要可能是另一个问题

当然,有些API做了非常不同的事情。在Windows中,非常强调传递消息,以及在每个线程的基础上处理消息
CreateFile()
有许多Unix世界所没有的标志,包括共享模式,这些模式决定了当您打开文件时另一个进程可以做什么。

Microsoft的Raymand Chen:

虽然函数WinMain是 在平台SDK中记录,它是 不是平台的一部分。 相反,WinMain是传统的 用户提供的入口点的名称 到Windows程序

真正的切入点是C 运行库,用于初始化 运行时,运行全局构造函数,以及 然后调用WinMain函数(或 如果您喜欢Unicode条目,请输入wWinMain 点)


Windows API编程是事件驱动的,而在此之前,大多数C编程都是线性的。因此,WinMain()是使用操作系统功能编写库的快捷方式,而main()是C语言的一部分

在我们讨论这个问题时,C几乎没有内置类型,而且在当时,几乎没有指示它们的方法。windows“类型”(HWND、LPSTR、BOOL等)反映了windows编程中常用的数据类型,并试图向程序员指示数据类型


匈牙利符号有点误用了原始版本,因为在许多变量中有不必要数量的限定符。

Inno-我不确定MS为什么使用#define来定义许多变量类型。如果你想知道他们为什么决定这么做,我会给查尔斯·佩佐德发电子邮件。如果有人知道,他会。@J.Polfer:对于库代码来说,为参数类型使用别名是非常常见的。它允许作者在保持源代码兼容性的同时更改接口中的特定类型。您仍然可以编译有效的16位Windows代码以针对64位版本的Windows,即使
WPARAM
LPARAM
等的底层类型已多次更改<但是,code>BOOL有一个不同的历史:当Windows上的工作开始时,C语言中没有布尔类型