为什么WinAPI与“普通”C有很大不同?

时间:2009-12-02 15:52:23

标签: winapi

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

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

当我看到我的第一个WinAPI程序时,它看起来更像是一种新语言...;)

6 个答案:

答案 0 :(得分:15)

最初的Windows API是在25年前的1984-85时间框架内设计的。匈牙利表示法风靡一时,因此将变量的类型放入声明中就可以了。例如,在纯C中,没有办法指示'far'指针,这是LPCSTR中指示的LP,但在1985年,区分常规指针和远指针非常重要。 (当90位窗口在90年代中期接管时,这种重要性被抛到了一边,但语法仍然存在......)

此外,C并没有真正区分指向char的指针和指向静态字符串的指针。因此lpsz类型。

最后,它是关于为参数带来比1984年允许的普通C更强,更一致的类型。至于WinMain,这是因为Windows程序与命令行程序有根本的不同。如果你查看库,你可能会找到一个main()函数来设置参数然后调用extern WinMain函数(即你的函数)。

答案 1 :(得分:4)

主要有两个原因:

  • 复杂性。 C语言是最小的,提供了可以构建更复杂架构的构建块。您在Win32中找到的LPCSTR,BOOL和其他类型是在C之上构建的typedef或结构。
  • 活动方向。 C通常是假设您的程序是主动的并且控制事物。在面向事件的环境中,例如Windows(或任何其他基于GUI的操作系统),您的程序被操作系统称为,因此它通常位于循环中,等待消息到达。< / LI>

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

答案 2 :(得分:2)

微软的Raymand Chen writes in his blog

  

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

     

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

答案 3 :(得分:1)

他们真的没有像你说的那样“采取这种不同的方式”。

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

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

这个答案绝不应该被认为是详尽无遗的。这只是我在使用Win32 / MFC编程时注意到的几件事。

答案 4 :(得分:1)

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

其中一些也是对必要性的看法。例如WinMain()有类似nCmdShow的内容,因为图形应用会调用ShowWindow(),我想他们希望能够将参数传递给新发起的进程。是否真的需要可能是另一个问题。

当然,有些API会做很多不同的事情。在Windows中,很多人都强调传递消息,并在每个线程的基础上处理消息。 CreateFile()有许多Unix世界没有的标志,包括共享模式,用于确定在打开文件时另一个进程可以执行的操作。

答案 5 :(得分:0)

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

虽然我们在讨论这个主题,但是C内置的类型很少,而且当时几乎没有什么方法可以表明它们。窗口“类型”(HWND,LPSTR,BOOL等)反映了Windows编程中常用的数据类型,并尝试向程序员指示数据类型是什么。

匈牙利表示法对原始版本有点误用,因为许多变量中都有不必要数量的限定词。