我是Win32应用编程接口的新手,许多新类型开始让我感到困惑。
有些函数使用1-2个ints
和3个UINTS
作为参数。
然后,还有其他类型:
DWORD LPCWSTR LPBOOL
这是一个痛苦的问题:WCHAR*
我不得不遍历它并将每个字符转换为std::push_back,因为没有其他方法可以将其转换为std::string。太可怕了。
WCHAR
?为什么要重新发明轮子呢?他们可以直接使用char*
,或者发布于 2010-04-16 02:36: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
、char
或void *
是一种很好的形式。回到我们还没有IntelliSense、信息提示、代码浏览器和在线文档等的时候,这样的用法提示很有帮助,它使得在不同的编译器和不同的编程语言之间移植代码变得更容易。
是的,这是一个可怕的混乱,但这并不意味着他们做错了什么。
发布于 2010-04-16 02:46:35
Win32实际上只有很少的原始类型。您所看到的是几十年来构建的#定义、typedefs和匈牙利符号。因为只有很少的类型,而且IntelliSense开发人员很少或根本没有给自己“线索”,告诉自己一个特定的类型实际上应该做什么。
例如,没有boolean类型,但是有一个整数的“别名”表示,它告诉您某个特定的变量应该被视为boolean。看看WinDef.h的内容,明白我的意思。
你可以在这里看一下:http://msdn.microsoft.com/en-us/library/aa383751(VS.85).aspx,看看名副其实的冰山一角。例如,请注意HANDLE是如何作为windows对象的“句柄”的每个其他对象的基类型定义函数。当然,HANDLE在其他地方被定义为原语类型。
发布于 2010-04-16 02:36:31
UINT是一个无符号整数。如果参数值不是/不能是负数,那么指定unsigned是有意义的。LPCWSTR是指向常量宽字符数组的指针,而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
https://stackoverflow.com/questions/2647982
复制相似问题