我是Win32 API的新手,许多新类型开始让我感到困惑。
某些函数将1-2 ints
和3 UINTS
作为参数。
然后,还有其他类型:
DWORD LPCWSTR LPBOOL
这是痛苦的:WCHAR*
我不得不遍历它并将每个字符push_back转换为std :: string,因为没有其他方法可以将其转换为一个字符串。可怕。
WCHAR
?为什么重新发明轮子?他们本可以使用char*
代替,或者?答案 0 :(得分:47)
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
,{ {1}}或char
。当我们没有IntelliSense和infotips以及代码浏览器和在线文档等时,这些使用提示很有帮助,并且它使得在不同编译器和不同编程语言之间移植代码变得更加容易。
是的,这是一个可怕的混乱,但这并不意味着他们做错了什么。
答案 1 :(得分:5)
Win32实际上只有很少的原始类型。您所看到的是数十年的#defines和typedef以及匈牙利表示法。因为类型很少,很少或没有智能感知开发人员给自己提供了关于特定类型实际上应该做什么的“线索”。
例如,没有布尔类型,但是有一个整数的“别名”表示,它告诉您特定变量应该被视为布尔值。看一下WinDef.h的内容,看看我的意思。
您可以在此处查看:http://msdn.microsoft.com/en-us/library/aa383751(VS.85).aspx 亲眼看看冰山一角。例如,请注意HANDLE是如何作为windows对象“句柄”的每个其他对象的基本typedef。当然,HANDLE在其他地方被定义为原始类型。
答案 2 :(得分:2)
我的一位同事会说“没有任何问题无法解决(混淆?)一个间接的程度。”在WIN32中,你将处理WCHAR,UINT等,你会习惯它。当您部署WCHAR或UNIT编译的基本类型的DLL时,您不必担心 - 它将“正常工作”。
最好通读一些文档来习惯它。特别是在Wide char支持(WCHAR等)上。有一个很好的definition on MSDN for WCHAR。
答案 3 :(得分:2)
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