为什么 Windows API 中的所有内容都是类型定义的?

2024-01-27

更具体地说,为什么是同一件事typedef在很多情况下都有多个不同的名称,为什么typedef指针类型(有时会模糊逻辑)?

例如:

typedef const WCHAR *LPCWSTR, *PCWSTR;

这有什么意义呢?


实际上这里发生了一些不同的事情:

  • 首先是近/远指针:回到Win16时代,你有近指针和远指针;近指针基本上只有 16 位偏移量,因此只能引用应用程序默认数据指针(DS 或数据段寄存器)64k 范围内的对象,但它们又小又快;而较大的“远指针”或长指针由段和偏移量组成,因此可以引用 1M 地址空间内的任何内容。当 386 出现时,所有这些段:偏移业务终于消失了,所有指针都只是进入平面 32 位地址空间的 32 位地址。这就是为什么有 P... 和 LP... 版本。

  • 为什么首先要费心使用 typedef 呢?这只是一种方便或简写:输入“LPSTR”比“const char far *”更方便。但它也成为一种可识别的惯用语:您看到 LPSTR 并立即知道 Windows 是如何处理其 API 中的字符串的。

  • 这里还有一个抽象:Windows 通常定义自己的类型版本并使用它们而不是 C 版本。因此 Windows API 使用 DWORD 而不是 int,或者使用 VOID 而不是 void。这是为了填补当时 C 中的一些漏洞——没有 bool,因此引入 BOOL 避免了不同的 API 使用不同的类型来表示布尔值(例如 char 与 int)。它还在某种程度上使 Windows API 独立于底层 C 实现:C 不要求 int 具有特定大小:它可以是 16 位或 32 位,具体取决于编译器。但对于操作系统 API 来说,准确指定这些内容很重要。因此,Windows 不使用 int 或 long,而是使用 INT 和 LONG,然后根据需要进行定义,并将 typedef 指定为执行实际工作的任何底层 C 类型。

  • 最后,其中一些 typedef 实际上暗示了超出类型信息的特定用法。 BOOL 和 INT 都被定义为 int,但很明显,指定为 BOOL 的 API 参数将用于 TRUE/FALSE 含义,而不是作为整数值。 (请记住,这早于“bool”类型。)同样,BYTE(无符号字符)表明参数实际上将用作 8 位数字值,而不是用作字母数字或符号字符。 LPSTR 表示该值应该是一个以 NUL 结尾的字符串,而不是仅仅指向任意 char 值。 BSTR 和 LPWSTR 具有相同的底层 typedef - 它们都是 WCHAR * - 但 BSTR 有长度前缀,因此必须使用 SysAllocString API 进行分配,这里有一个单独的 typedef 有助于在代码和文档 API 要求中保持两者独立:如果您看到一个采用 BSTR 作为参数的 API,那么您就知道不能只传递宽字符串,即使底层类型相同,该参数还有其他要求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Windows API 中的所有内容都是类型定义的? 的相关文章

  • clang 格式换行符在错误的位置

    给出以下代码行 get abc manager get platform status abc platform status sw update status fill update status actions allowed stat
  • 在 VS2017 下使用 Conan 和 CMake 项目进行依赖管理

    我正在尝试使用 CMake 与 VS2017 集成为 C 设置一个开发环境 以便在 Linux x64 下进行编译 为了更好地管理依赖关系 我选择使用 Conan 但我对这个软件还很陌生 我想知道让 VS2017 识别项目依赖关系的最佳方法
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 为什么Apache MPM prefork.c 使用互斥体来保护accept()?

    我坐下来读书Apache 的 MPM prefork c http code metager de source xref apache httpd server mpm prefork prefork c这段代码使用了一个名为accept
  • 为什么大多数平台上没有“aligned_realloc”?

    MSVC有自己的非标准函数 aligned malloc aligned realloc and aligned free C 17和C11引入了 std aligned alloc 其结果可以是de分配有free or realloc B
  • C++中delete和delete[]的区别[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的删除与删除 运算符 https stackoverflow com questions 2425728 delete vs delete operators in c 我写了一个包含两个指针的
  • SFINAE 如何使用省略号?

    过去 当使用 SFINAE 选择构造函数重载时 我通常使用以下内容 template
  • 获取尚未实例化的类的函数句柄

    我对 C 相当陌生 我想做的事情可能看起来很复杂 首先 我想获取一些函数的句柄以便稍后执行它们 我知道我可以通过以下方式实现这一目标 List
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 将带有 glut 的点击坐标添加到向量链接列表中

    我想创建一个向量链接列表 并在 GLUT 库的帮助下获取点击的位置并将它们附加到链接列表中 这些是我写的结构 typedef struct vector int x int y Vector typedef struct VectorLis
  • 从成员函数指针类型生成函子

    我正在尝试简化 通过make fn 预处理参数的函子的生成 通过wrap 对于 arity 的成员函数n 生成函子基本上可以工作 但到目前为止只能通过显式指定成员函数的参数类型来实现 现在我想从它处理的成员函数类型生成正确的函子 struc
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • 使用 mingw32 在 Windows 上构建 glew 时“DllMainCRTStartup@12”的多个定义

    我关注了这个主题 使用 mingw 使建筑物在 Windows 上闪闪发光 https stackoverflow com questions 6005076 building glew on windows with mingw 6005
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • Visual Studio 2017 完全支持 C99 吗?

    Visual Studio 的最新版本改进了对 C99 的支持 最新版本VS2017现在支持所有C99吗 如果没有 C99 还缺少哪些功能 No https learn microsoft com en us cpp visual cpp
  • 在 C++17 中使用 成员的链接错误

    我在 Ubuntu 16 04 上使用 gcc 7 2 并且需要使用 C 17 中的新文件系统库 尽管确实有一个名为experimental filesystem的库 但我无法使用它的任何成员 例如 当我尝试编译此文件时 include
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • 为什么文件更新时“如果较新则复制”不复制文件?

    我在 Visual Studio Express 中有一个解决方案 如下所示 The LogicSchemaC 中的类 将在运行时解析指定的 XML 文件 以下是在main的方法Program cs LogicSchema ls new L

随机推荐

  • 这里使用指针向量是不必要的还是更糟,会导致内存泄漏?

    我对 C 编程相对较新 但我是一名有 10 年经验的 C 程序员 因此我对对象的指针比对对象的引用更熟悉 我正在编写一款纸牌游戏 这种设计不安全吗 有没有更好的办法 无论如何 我还有课SolitaireGame class Solitair
  • 如何动态获取程序集名称[重复]

    这个问题在这里已经有答案了 我在图书馆里有一堂课是这样的 namespace Foo public abstract class EventBase public string EventSource gt Assembly GetExec
  • IE9 中的 iframe 中未发送 Cookie

    首先 我在发布这个问题之前做了一些研究 所以我知道P3P政策 https stackoverflow com questions 389456 cookie blocked not saved in iframe in internet e
  • php 多个 if 语句?

    抱歉 这看起来像是一个菜鸟问题 今天早上我的大脑无法运转 我正在尝试执行多个if声明 但他们的行为不正确 在找到它正在寻找的模板后 它似乎总是加载最少的模板 做这样的事情的最好方法是什么 post wp query gt post if i
  • 如何用Python中的其他字符替换字符串中的unicode字符?

    我有一个从阅读带有项目符号的 HTML 网页中获得的字符串 由于项目符号列表 这些项目符号具有类似 的符号 请注意 文本是来自使用 Python 2 7 的网页的 HTML 源代码urllib2 read webaddress 我知道项目符
  • 将物理网卡绑定到docker容器

    我的主机 PC 上安装了 4 个 NIC 我想启动不同的 docker 容器 并将不同的物理网卡绑定到每个容器 我能为docker做些什么 对于 VirtualBox 这可以通过为物理网卡的每个虚拟机创建桥接适配器来完成 当您使用 Dock
  • 版权元标记在 HTML5 中有效吗?

    W3C 验证器输出 第 5 行 第 41 列 元素元上的属性名称版权值错误 未注册关键字版权 我需要设置版权 任何想法 都柏林核心提出rightsHolder https www dublincore org specifications
  • 了解接口内部接口(嵌入式接口)

    我试图用以下代码来理解接口嵌入 我有以下内容 type MyprojectV1alpha1Interface interface RESTClient rest Interface SamplesGetter SamplesGetter h
  • 仅 CSS 3D 旋转文本

    我有一个带有一些文本旋转的 div 如何获得文本深度以提供更好的 3D 效果 为了澄清 在90deg文本变成1px厚 因为我们只能从侧面看到它 我该如何制作它 例如 10px厚的 此外 应显示适当的深度 即在0deg我们看不到深度 在45d
  • 在用户可见活动后执行方法

    我的活动包含太多 UI 控件 我想在使活动可见后执行一个方法 我尝试过的一个例子 public class Main extends Activity Override public void onCreate Bundle savedIn
  • Android 画布保存总是 java.io.IOException: 打开失败: ENOENT (没有这样的文件或目录)

    我有一个画布应用程序 我正在尝试创建一个签名应用程序Canvas onTouchListener 这是我的保存方法 我尝试将签名保存到图像中 private void save hideMenuBar View content this c
  • Travis 尝试将应用提交到 Google Play 商店时出错

    我首先研究了在 Github 上找到的几个要点 https gist github com lpetre 87a5196d14cf4484f1f2 https gist github com lpetre 87a5196d14cf4484f
  • sphinx4 中的语音识别响应很差

    目前我们正在研究使用 sphinx4 进行语音识别 我们正在努力为听写类型应用程序取得良好的响应 输入是一个 wav 文件 我们希望转录它 我研究了 Sphinx4 提供的 LatticeDemo 和 Transscriber 演示 当我使
  • SBT:依赖其他SBT项目而不发布

    我有一组松散相关的组件 其中一些组件依赖于其他组件 为了具体起见 我们假设我们有组件 common a 和 b common 没有任何依赖项 但所有其他项目都使用 common 此外 a 依赖于 b 所有组件都是用 Scala 编写的 我想
  • 为什么 MVC 在 GET 上使用 Modelstate 而不是提供的模型

    当 MVC 运行时ActionMethod它将填充ModelState字典并使用ModelBinder建立ActionMethod参数 如果有 它对两者都这样做GET and POST 这是有道理的 之后ActionMethod已成功运行
  • JPA 与 HIBERNATE 插入非常慢

    我正在尝试使用 JAP 和 HIBERNATE 将一些数据插入 SQL Server 2008 R2 除了速度非常慢之外 一切都 有效 要插入 20000 行 大约需要 45 秒 而 C 脚本大约需要不到 1 秒 有这个领域的资深人士可以提
  • 针对可怕的 While (True) 循环的最佳重构

    如果您像我一样在 While True 循环处颤抖 那么您一定也已经认真思考了重构它的最佳方法 我见过几种不同的实现 没有一个真正比其他实现更好 例如计时器和委托组合 那么 您想出或看到的重构可怕的 While True 循环的最佳方法是什
  • 使用 LINQ 时“输入字符串的格式不正确”

    我正在尝试做一个FirstOrDefault 查询对象集并抛出一个奇怪的异常 My Code private RecordObject GetRecordByID int recID return objectSet FirstOrDefa
  • 如果特定列中的值不是 pandas 数据框中的整数,则删除行

    如果我有一个数据框并且想要删除其中一列中的值不是整数的任何行 我该怎么做 另一种方法是 如果值不在 0 2 范围内 则删除行 但由于我不确定如何执行其中任何一个操作 我希望有人可以这样做 这是我尝试过的 但没有成功 不知道为什么 df df
  • 为什么 Windows API 中的所有内容都是类型定义的?

    更具体地说 为什么是同一件事typedef在很多情况下都有多个不同的名称 为什么typedef指针类型 有时会模糊逻辑 例如 typedef const WCHAR LPCWSTR PCWSTR 这有什么意义呢 实际上这里发生了一些不同的事