我是Win32 API的新手,许多新类型开始让我感到困惑.
一些函数将1-2 ints
和3 UINTS
作为参数.
然后,还有其他类型:
DWORD LPCWSTR LPBOOL
Run Code Online (Sandbox Code Playgroud)
这个是痛苦的: WCHAR*
我不得不遍历它并将每个字符push_back到std :: string,因为没有其他方法可以将它转换为一个.可怕.
WCHAR
?为什么重新发明轮子?他们本来可以用char*
,或者?Kri*_*son 48
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被认为是一个高层次的语言(是的,真的!),很多人认为这是很好的形式使用抽象类型,而不仅仅是指定的一切作为原始int
,char
或void *
.当我们没有IntelliSense和infotips以及代码浏览器和在线文档等时,这些使用提示很有帮助,并且它使得在不同编译器和不同编程语言之间移植代码变得更加容易.
是的,这是一个可怕的混乱,但这并不意味着他们做错了什么.
Win32实际上只有很少的原始类型.你所看到的是数十年的#defines和typedef以及匈牙利表示法.因为类型很少而且很少或没有智能感知开发人员给自己提供了关于特定类型实际应该做什么的"线索".
例如,没有布尔类型,但有一个整数的"别名"表示,告诉您特定变量应该被视为布尔值.看一下WinDef.h的内容,看看我的意思.
你可以看看这里:http://msdn.microsoft.com/en-us/library/aa383751 (VS.85).aspx,可以看到真正的冰山一角.例如,注意HANDLE是如何作为windows对象"句柄"的每个其他对象的基本typedef.当然,HANDLE在其他地方被定义为原始类型.