为什么 PDWord 不是 ^DWORD?

2024-02-24

这个节目

{$APPTYPE CONSOLE}
{$TYPEDADDRESS ON}

uses
  Winapi.Windows;

procedure Foo(P: PDWORD);
begin
end;

procedure Bar;
var
  dw: DWORD;
begin
  Foo(@dw);
end;

begin
end.

在 XE3 中编译,但在 XE4、XE5、XE6 和 XE7 中不编译。错误位于

Foo(@dw);


[dcc32 Error] E2010 Incompatible types: 'PDWORD' and 'Pointer'
  

这感觉很奇怪。因此,经过一番挖掘后,问题似乎归结为PDWORD。人们可能很自然地认为它会是:

PDWORD = ^DWORD;

XE3 中确实就是这种情况。在后来的版本中我们发现:

// Note: Not ^DWORD yet
PDWORD = ^CppULongInt;

奇怪的。那么,什么是CppULongInt?

CppULongInt = type LongWord; 
{$EXTERNALSYM CppULongInt 'unsigned long'} 
{$OBJTYPENAME CppULongInt 'Bul' 'Gm'}

然后查看声明DWORD我们发现:

//NOTE: DWORD should really be CppULongInt
DWORD = LongWord;

So, CppULongInt and DWORD是不同的类型。因此出现编译错误。

这里发生了什么?目的是什么CppULongInt?为什么 RTL 设计者似乎想要别名DWORD to CppULongInt。此更改与基于 LLVM 的 x64 Windows C++ 编译器有关吗?我是世界上唯一使用的人吗{$TYPEDADDRESS ON}?

请注意,最后一个问题是反问句。


(参考Why PDWORD不是指向的指针DWORD https://sergworks.wordpress.com/2014/09/13/why-pdword-is-not-a-pointer-to-dword/.) 看来内河码头有人没读过相关的 Windows 文档 https://learn.microsoft.com/en-us/windows/win32/winprog/windows-data-types#DWORD_PTR:

  • DWORD被明确定义为32 bit unsigned integer,因此在 Delphi 中它应该是UInt32.
  • PDWORD被定义为一个指向DWORD,因此在 Delphi 中应该是PDWORD = ^DWORD.
  • It's DWORD_PTR(这不是一个PDWORD!) 被定义为ULONG_PTR,后者的大小变化取决于platform(32 或 64 位),不是编译器定义unsigned long.

原因之一可能是他们正在尝试使用DWORD以及非 Windows 平台上的其他 Windows 数据类型,并试图保持它们的兼容性。如果是这样,在这种情况下他们会失败并引入错误,因为使用的定义在 Windows 中无法正常工作。

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

为什么 PDWord 不是 ^DWORD? 的相关文章

  • 面向 Delphi 开发人员的 Qt

    有人知道为 Delphi C Builder VCL 开发人员解释 Qt 的书籍或教程吗 对于具有该背景的开发人员来说 学习 Qt 的最佳方法是什么 我对如何使用 Qt 完成我知道如何在 Delphi 中完成的事情特别感兴趣 例如 Qt 相
  • Firebird 或 NexusDB

    我知道有很多与 Delphi 数据库相关的问题 但我只考虑这两个数据库 我需要查询大约 100 000 条记录 根据您的经验 哪个更快 作为嵌入式 as C S Thanks 我还没用过 Nexus tbh 但我经常使用 Firebird
  • “已发布集 '%s' 的大小大于 4 字节”。如何修复这个编译器错误?

    我有一组包含 138 个值的枚举值 就像是 type TSomething sOne sTwo sThree sOnehundredAndThirtyeight TSomethings set of TSomething TSomethin
  • 构建机器是否需要单独的 Delphi XE4 许可证?

    用于通过以下方式构建应用程序dcc32在构建服务器上我可以使用 Delphi Trial 这种方法的许可证没有任何问题 现在 我将通过以下方式在 TeamCity 上构建 Delphi XE4 应用程序msbuild 我是否需要拥有构建机器
  • 使用 IdTCPClient 和 IdTCPServer 发送和接收 TMemoryStream

    我在 XE2 中找到了 Remy Lebeau 的 IdTCP 组件聊天演示 我想玩一下 可以发现 我想使用这些组件发送图片 最好的方法似乎是使用 TMemoryStream 如果我发送字符串 连接工作正常 字符串传输成功 但是当我将其更改
  • Delphi:如何检查是否按下了任何鼠标按钮 - 在鼠标事件之外?

    我有一个 TDrawGrid 想要处理单击单元格并使用鼠标滚轮滚动单元格的方式略有不同 使用鼠标滚轮滚动时 视图应以选定的单元格为中心 而仅单击单元格时 视图不应居中移动 因为这会令人困惑 用鼠标滚轮滚动会触发OnSelectCell事件
  • 为什么使用过程来创建对象比使用函数更受欢迎?

    这类似于这个问题 https stackoverflow com questions 1894217 is it memory safe to provide an object as a function result 我问 为什么 到最
  • 如何处理第三方库中的警告/提示?

    我们使用 FastReport 来生成报告 事实上 我们为访问源代码付费 我们目前使用的是FastReport的最新稳定版本 虽然它对于我们的生产来说足够稳定 但每当我编译时 我都会看到以下内容 dcc32 Hint fs iinirtti
  • 为什么变量被声明为 TStrings 并被创建为 TStringList?

    为什么变量声明为TStrings并创建为TStringList 例如 varsl被声明为TStrings但创建为TStringList var sl TStrings begin sl TStringList Create add stri
  • Delphi 2010 控制闪烁

    我一直在从 XP 操作系统升级或迁移我们的软件 以便能够在 Windows 7 下编译和运行 我们的软件开始出现我们在 Windows XP 下没有注意到的问题 目前 我正在处理 TForm 上闪烁的用户定义控件 它似乎时不时地闪烁 但并非
  • 以高效的方式将字符串转换为十六进制

    我开发了以下函数将字符串转换为十六进制值 function StrToHex const S String String const HexDigits array 0 15 of Char 0123456789ABCDEF var I I
  • delphi检查ini文件是否存在

    如何检查 INI 文件是否存在 在特定路径和特定名称下 比如这样 if FileExists c yourinifile ini then ShowMessage c yourinifile ini exists
  • 如何安装DBMonitor

    这可能是一个非常简单的问题 但就是这样 我刚刚更新了 Firebird 的 DevArt DBExpress 驱动程序的许可证 帮助文件说我可以使用他们的免费软件 DBMonitor 应用程序 但由于我使用的是 D2006 所以我必须使用以
  • Delphi RTTI,已发布的属性出现两次

    我想对属性使用属性 但这些属性偶尔会在继承的类中发生更改 这是一个示例代码 非常简化 TBaseClass class TObject private FFoo string published BaseAttirib hello prop
  • 如果鼠标不在 VirtualTreeView (TVirtualStringTree) 上,如何禁用 MouseWheel

    如果 TVirtualStringTree 获得焦点 则默认情况下它会在鼠标滚轮上滚动 即使鼠标未超出控制范围 除非它位于另一个 TVirtualStringTree 上方 有没有一种快速而优雅的方法来禁用这种行为 我已经这样做了OnMou
  • XE2 中的 COM 是否损坏?我该如何解决它?

    Update XE2 Update 2 修复了下述错误 下面的程序是从实际程序中截取的 在 XE2 中失败并出现异常 这是 2010 年的回归 我没有 XE 来测试 但我希望该程序在 XE 上运行良好 感谢 Primo 确认代码在 XE 上
  • 如何更改 Delphi 2010 IDE 中编辑器选项卡的字体大小?

    有谁知道如何更改 Delphi 2010 IDE 中编辑器选项卡的字体大小 我的 1080p 22 显示器的字体太小 无法阅读 而且会导致眼睛疼痛 一些笔记 它不尊重系统的 DPI 设置 因此更改系统设置没有帮助 而且 我现在已经使用 14
  • delphi定时器比定时器服务中断例程更快

    大家好 我被要求为某人维护一个基于 Delphi 5 的程序 该程序使用一个计时器对象每 50 毫秒计时一次 并且在每次计时结束时运行单线程代码块 我只是想知道 如果执行这段代码所花费的时间比计时器滴答间隔长 会发生什么 这会很糟糕吗 例如
  • 如何更改 Chromium 组件的默认背景颜色?

    I use TChromium http code google com p delphichromiumembedded 我分配AWebPageAsString这是一个带有灰色背景颜色的静态 HTML 页面 FBrowser TChrom
  • ADODB 组件导致 Win7/Server 2008 上的访问冲突

    我有一段用 Delphi 2005 编写的代码 用于在 LDAP 中搜索用户的特定属性 当在 Windows 7 或 Server 2008 上运行时 我遇到访问冲突 但在 XP 或 2003 上则没有 Function IsSSOUser

随机推荐

  • 为什么单元格渲染器经常扩展 JLabel?

    我注意到这很常见 例如 DefaultListCellRenderer DefaultTableCellRenderer 和 DefaultTreeCellRenderer 都使用它 我在网上看到的许多自定义单元格渲染器也使用它 我想在代码
  • 使用 Php 5 和 MySQL 进行 GPS 半径搜索

    我有一个PlaceID PlaceName Lat Lon作为我的数据库结构 假设我当前的纬度和经度为 lat 37 331862 lon 122 029937 我想找到半径 100 英尺内的地方 可能允许用户选择 您可能有兴趣查看以下演示
  • switch 语句的 Jacoco 覆盖范围

    我正在努力为我正在开发的库获得 100 的代码覆盖率 但我似乎在 switch 语句和覆盖率方面遇到了一些问题 我根本不理解 我目前正在使用 Jacoco 0 7 2 因为每个新版本似乎都与 Robolectrics 发生冲突 我测试了一个
  • 猫鼬预保存挂钩中的异步功能不起作用

    在预保存挂钩中调用异步函数正在返回我undefined密码 我是否从根本上误解了async这里 我已经在我的应用程序的其他区域成功使用它 它似乎工作正常 userSchema pre save function next let user
  • localStorage()、window.localStorage() 或 document.localStorage() 哪个选项更好?

    这个问题说明了一切 我意识到所有的选择do在最新的浏览器中工作 但是语义上最好的选择是什么 为什么 根据W3C标准 正确的是window localStorage因为localStorage属性是 window 对象的一部分 它不是一个函数
  • (任何语言)使用交换查找向量中元素的所有排列

    今天在实验室会议上有人问我这个问题 我们可以想象一个包含元素 1 N 1 长度为 N 的向量 是否存在生成向量中元素的所有排列或顺序的算法 系统 方法 一种建议的方法是交换随机元素 显然 如果存储所有先前生成的排列以供将来参考 那么这将起作
  • 在 Visual Studio 2019 中配置 CMake 版本

    有没有办法配置Visual Studio 2019集成CMake版本 我想使用最新 CMake 版本中的一些功能 但在这种情况下我被迫从命令行构建 如果我从 VS IDE 构建 则使用的 CMake 版本是 Visual Studio 集成
  • Chrome 41 ERR_SSL_VERSION_OR_CIPHER_MISMATCH Tomcat 7

    由于我已将 Chrome 从版本 40 更新到 41 我无法再访问在本地 tomcat 7 实例中运行的 ssl 站点 我有一个自签名证书 Chrome 只打印This webpage is not available和 一起ERR SSL
  • http 上没有侦听端点 // 可以接受 WCF 中的消息

    我正在尝试开发一个webservice 在我的应用程序中 我需要连接到我的webservice没有任何引用 所以我使用这段代码 static void Main string args BasicHttpBinding binding ne
  • 通过 PHP 使用 HTTP POST 发送 XML 数据

    我需要发送此 XML
  • 在 Android studio 中使用 Jcenter 和 gradle

    编辑 弄清楚了 我实现了 JBaruch 对项目范围 build gradle 文件的 allprojects gt repositories 部分的建议 我正在编写一个依赖 IOIO 的项目 在我的项目上编译 IOIO 的库给我带来了麻烦
  • 如何将图像从服务器(api)存储到房间数据库

    我想将来自 api 的图像存储到房间数据库中 我从 api 接收数据和图像 当我处于在线模式时 图像是使用 api 提供的 url 加载的 但当离线时 图像应该以离线模式从数据库中存储和检索 我像这样加载图像 它加载图像 if data d
  • Vaadin - 布局调整重叠大小

    当尝试调整浏览器大小时 我面临与我的项目重叠的问题 我尝试了很多不同的变体来使其发挥作用 但结果仍然不可接受 Before resizing A B and C包含在垂直布局 https vaadin com api com vaadin
  • 如何配置 sbt test / ScalaTest 仅显示失败?

    有没有办法截断测试结果 仅在单元测试失败时才显示单元测试的结果文本 我正在开发一个具有 850 个单元测试的 Scala 项目 成功的单元测试的绿色文本使得很难只关注失败的情况 我正在谈论的示例 info should have color
  • 编辑预先存在的 cab 文件/安装程序文件

    我目前正在尝试制作 CD 的下载 安装文件 但我以前从未这样做过或编写过任何类型的编码 所以我有点不知所措 当我们上次创建安装程序包时 我尚未受雇 我们使用了 InstalShield 但那是几十年前的事了 我们无法承受 500 美元以上的
  • 从computeDigest(algorithm, value) byte[] 获取字符串表示形式

    Google App Script 函数computeDigest 返回签名的字节数组 如何获取摘要的字符串表示形式 我已经尝试过 bin2String 函数 function sign var signature Utilities co
  • 在 Android 上阻止传入/传出短信

    有谁知道通过代码阻止传入 传出短信的可靠方法 如果收到实际的短信也没关系 但我想阻止收到该短信的任何通知 此外 不应允许用户发送 或者最好是键入 SMS 消息 那可能吗 Thanks 您无法阻止外发短信 这是我用来阻止传入文本的方法 短信接
  • 如何响应 AngularJS 指令中复选框的点击?

    我有一个 AngularJS指示 http docs angularjs org guide directive在以下模板中呈现实体集合 table class table thead tr th th tr thead table
  • 如何更改 CPack 中的包目标文件夹?

    我有一个多模块CMake具有根的项目CMakeLists txt与多个添加子目录 macros 据我了解 CPack CMake 的默认设置是在项目根文件夹中创建包 其中 rootCMakeLists txt居住 我想创建一个单独的inst
  • 为什么 PDWord 不是 ^DWORD?

    这个节目 APPTYPE CONSOLE TYPEDADDRESS ON uses Winapi Windows procedure Foo P PDWORD begin end procedure Bar var dw DWORD beg