【问题标题】:Why is WINAPI so redundant? [duplicate]为什么WINAPI如此多余? [复制]
【发布时间】:2018-02-20 17:49:30
【问题描述】:

我刚开始研究 WINAPI,我在 Windows 数据类型网页上注意到的第一件事就是冗余。例如 LONG32 在 BaseTsd.h 中声明为

typedef signed int LONG32;

和 INT32,也在 BaseTsd.h 中声明

typedef signed int INT32;

DWORD 在 IntSafe.h 中声明为

typedef unsigned long DWORD

而 ULONG 在 WinDef.h 中声明为

typedef unsigned long ULONG;

如果在实践中它们都相同,为什么会有不同的数据类型?

我们也有这个

typedef HANDLE HCONVLIST; //A handle to a DDE conversation list.
typedef HANDLE HDC; //  A handle to a device context (DC).
typedef HANDLE HDDEDATA; // A handle to DDE data.

如果它们都是 HANDLE 类型,为什么会有不同的数据类型?

【问题讨论】:

  • 另外,关于HANDLE,当STRICT 启用时,大多数句柄类型实际上根本不是同一类型。大多数句柄类型是使用DECLARE_HANDLE() 宏声明的,因此当启用STRICT 时它们映射到唯一的结构类型,而当禁用STRICT 时映射到void*。但它们不是像您展示的那样简单的 HANDLE 类型定义。

标签: winapi


【解决方案1】:

关于 40 years ago 的决定是在没有完善的 C 标准的时候做出的。该 API 至今仍在工作。 30 年前针对 Windows 3.1 编写的软件很有可能仍然在 Windows 10 下运行。没有多少 API 能够存活这么长时间,或者被这么多开发人员使用。

HDC 这样的类型定义添加了另一层间接性,但使意图更加清晰。 HDC 变量应该指向设备上下文,而不是其他东西。这类似于使用 typedef unsigned int Age; 之类的东西来明确变量应该存储年龄值而不是其他东西,例如端口号。

【讨论】:

  • 更重要的是,像HDC 这样的抽象也增加了安全级别。一旦你enable the STRICT preprocessor symbol,当传递HDC 时,期望HWND 的API 调用将无法编译。我不确定这是什么时候添加的,或者它是否是决定的一个因素,但它确实对保护软件开发中最薄弱的环节(开发人员)很有价值。
猜你喜欢
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 2016-11-22
  • 1970-01-01
  • 2011-05-28
  • 2020-02-07
  • 2021-11-24
相关资源
最近更新 更多