【问题标题】:Why is PDWord not ^DWORD?为什么 PDWord 不是 ^DWORD?
【发布时间】:2014-09-12 21:47:54
【问题描述】:

这个程序

{$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 错误] E2010 不兼容的类型:“PDWORD”和“指针”

这感觉很奇怪。因此,经过一番挖掘,似乎问题归结为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;

所以,CppULongInt 和 DWORD 是不同的类型。因此编译错误。

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

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

【问题讨论】:

  • 我注意到了。将一个类型的指针定义为一个类型的指针,而不是它自己的类型,这很奇怪。
  • @Sertac CppULongInt 这个名字让我感到恐惧。就好像他们忘记了 Delphi 的存在。我认为当事情朝另一个方向发展时,情况会发生变化。
  • 那么,“为什么 PDWord 不是 ^DWORD?” 的可能答案 - 有一个开发人员无法从别名中分辨出类型。 - 有一个开发人员对PDWORD 和DWORD 之间的关系一无所知。 - @Serge 的理论涉及更多开发人员,这相当于“有一个开发团队不给 f..”。

标签: delphi delphi-xe4


【解决方案1】:

看起来 Embarcadero 的某个人没有阅读相关的 Windows 文档:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx

DWORD 明确定义为 32 位无符号整数,因此在 Delphi 中它应该是 UInt32。 PDWORD 被定义为指向 DWORD 的指针,因此在 Delphi 中它应该是 PDWORD = ^DWORD。

它是定义为 ULONG_PTR 的 DWORD_PTR(不是 PDWORD!),后者的大小会根据 平台 - Win32 或 Win64 - 而不是 un unsigned long 的编译器定义.

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

【讨论】:

  • 您在这里指的是 Serg 的博客文章。当然 C++ long 是平台相关的。我在问为什么PDWORD 不是^DWORD,以及CppULongInt 是什么。 Emba 肯定不会尝试在 Windows 之外使用DWORD。
  • 实际上Windows头文件将DWORD定义为unsigned long的别名。 Windows 数据模型反过来说 long 是 32 位。 C++ long 是实现定义的。对于 Windows 上的任何实现,这都要求该平台上的 32 位长。
  • 为什么 Embarcardero 是这样定义的,只有 Embarcadero 知道。我的猜测是它试图让它与不同的平台/架构兼容,或者直接从头文件中进行翻译而不考虑文档。
  • 实际上,我收回我在第一条评论中所说的话。 DWORD 类型在 x-plat 的 System.Types 中声明。我无法理解DWORD 离开 Windows 后的意义。
猜你喜欢
  • 2013-03-05
  • 2013-12-11
  • 2014-03-02
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 2011-03-01
  • 2021-09-18
相关资源
最近更新 更多