为什么Win32-API有这么多自定义类型?

我是Win32 API的新手,许多新类型开始让我感到困惑。

有些函数需要1-2个ints和3个UINTS作为参数。

  • 为什么他们不能只使用整数? 什么是UINTS?

然后,还有其他类型:

 DWORD LPCWSTR LPBOOL 
  • 同样,我认为“原始”C类型就足够了 – 为什么要引入100种新类型?

这个是痛苦的: WCHAR*

我不得不迭代它并将每个字符push_back到std :: string,因为没有其他方法可以将它转换为一个。 可怕。

  • 为何选择WCHAR ? 为什么重新发明轮子? 他们本来可以用char*代替,或者?

Windows API最早是在20世纪80年代创建的,多年来不得不支持几种不同的CPU架构和编译器。 他们已经从单用户单进程独立系统转变为网络化多用户多核安全意识系统。 他们不得不解决16位与32位处理器以及现在64位处理器的问题。 他们必须解决ANSI C编译器之前的问题。 他们必须在早期非标准化时代支持C ++编译器。 他们不得不处理分段记忆。 在Unicode存在之前,他们必须支持国际化。 他们必须支持与MS-DOS,OS / 2和Mac OS的源级兼容性。 他们不得不运行几代英特尔芯片,PowerPC,MIPS,Alpha和ARM。 桌面,服务器,移动和嵌入式系统使用相同的基本API。

早在20世纪80年代,C被认为是一种高级语言(是的,真的!),很多人认为使用抽象类型而不仅仅是将所有内容都指定为原始intcharvoid *是一种很好的forms。 当我们没有IntelliSense和infotips以及代码浏览器和在线文档等时,这样的使用提示很有帮助,并且它使得在不同编译器和不同编程语言之间移植代码变得更加容易。

是的,这是一个可怕的混乱,但这并不意味着他们做错了什么。

Win32实际上只有很少的原始类型。 你所看到的是数十年的#defines和typedef以及匈牙利符号。 因为类型很少而且很少或没有智能感知开发人员给自己提供了关于特定类型实际应该做什么的“线索”。

例如,没有布尔类型,但是有一个整数的“别名”表示,它告诉您特定变量应该被视为布尔值。 看一下WinDef.h的内容,看看我的意思。

你可以看看这里: http : //msdn.microsoft.com/en-us/library/aa383751 (VS.85) .aspx ,可以看到真正的冰山一角。 例如,请注意HANDLE是如何作为windows对象“句柄”的每个其他对象的基本typedef。 当然,HANDLE在其他地方被定义为原始类型。

UINT是无符号整数。 如果参数值不是/不能为负,则指定unsigned是有意义的。 LPCWSTR是指向const宽字符数组的指针,而WCHAR *是非常量字符串。

在处理宽字符时,您应该为UNICODE编译应用程序,或者使用转换例程从窄到宽转换。
http://msdn.microsoft.com/en-us/library/dd319072%28VS.85%29.aspx

http://msdn.microsoft.com/en-us/library/dd374083%28v=VS.85%29.aspx

我的一位同事会说“没有任何问题无法解决(混淆?)一个间接的程度。” 在WIN32中,你将处理WCHAR,UINT等,你会习惯它。 当您部署WCHAR或UNIT编译的基本类型的DLL时,您不必担心 – 它将“正常工作”。

最好通读一些文档来熟悉它。 特别是在Wide char支持(WCHAR等)上。 在WDNAR的MSDN上有一个很好的定义 。