我想知道为什么WinAPI与“普通”C编程有很大的不同?
我的意思是,在学校里我了解到每个C程序都有一个main()函数(WinAPI使用带有一些特殊参数的WinMain),一些变量类型,如int,long,char等。(WinAPI使用类似LPCSTR,BOOL,那么为什么微软决定采用与他们的OS API不同的方式呢?
当我看到我的第一个WinAPI程序时,它看起来更像是一种新语言...;)
答案 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)
主要有两个原因:
其他基于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等),部分内容是为了便于使用。例如,写LPCSTR
比const char *
更短。另一个例子是C语言不支持的BOOL
typedef。另一个原因是将开发人员与底层硬件的更改隔离开来,例如,从16位更改为32位到64位架构。
这个答案绝不应该被认为是详尽无遗的。这只是我在使用Win32 / MFC编程时注意到的几件事。
答案 4 :(得分:1)
我会说大部分都是风格问题。标准源于Unix世界,因此例如库函数具有短名称,并且没有很多typedef。我认为这反映了C和Unix设计者的选择。另一方面,Windows有LongFunctionNamesInMixedCase
和LOTSOFTYPEDEFS
,*PTYPEDEFSFORPOINTERSTOO
。
其中一些也是对必要性的看法。例如WinMain()
有类似nCmdShow
的内容,因为图形应用会调用ShowWindow()
,我想他们希望能够将参数传递给新发起的进程。是否真的需要可能是另一个问题。
当然,有些API会做很多不同的事情。在Windows中,很多人都强调传递消息,并在每个线程的基础上处理消息。 CreateFile()
有许多Unix世界没有的标志,包括共享模式,用于确定在打开文件时另一个进程可以执行的操作。
答案 5 :(得分:0)
Windows API编程是事件驱动的,而在此之前,大多数C编程都是线性的。因此,WinMain()是使用OS功能编写库的快捷方式 - 而main()是C语言的一部分。
虽然我们在讨论这个主题,但是C内置的类型很少,而且当时几乎没有什么方法可以表明它们。窗口“类型”(HWND,LPSTR,BOOL等)反映了Windows编程中常用的数据类型,并尝试向程序员指示数据类型是什么。
匈牙利表示法对原始版本有点误用,因为许多变量中都有不必要数量的限定词。