Dav*_*nan 26 delphi delphi-xe4
这个计划
{$APPTYPE CONSOLE}
{$TYPEDADDRESS ON}
uses
Winapi.Windows;
procedure Foo(P: PDWORD);
begin
end;
procedure Bar;
var
dw: DWORD;
begin
Foo(@dw);
end;
begin
end.
Run Code Online (Sandbox Code Playgroud)
在XE3中编译,但在XE4,XE5,XE6和XE7中不编译.错误发生在
Foo(@dw);
Run Code Online (Sandbox Code Playgroud)
[dcc32 Error] E2010 Incompatible types: 'PDWORD' and 'Pointer'
这感觉很奇怪.因此,经过一番挖掘,似乎问题归结为PDWORD.人们可能自然会认为它会是:
PDWORD = ^DWORD;
Run Code Online (Sandbox Code Playgroud)
事实上,XE3就属于这种情况.在以后的版本中,我们发现:
// Note: Not ^DWORD yet
PDWORD = ^CppULongInt;
Run Code Online (Sandbox Code Playgroud)
奇.那么,是什么CppULongInt?
CppULongInt = type LongWord;
{$EXTERNALSYM CppULongInt 'unsigned long'}
{$OBJTYPENAME CppULongInt 'Bul' 'Gm'}
Run Code Online (Sandbox Code Playgroud)
然后看着DWORD我们发现的声明:
//NOTE: DWORD should really be CppULongInt
DWORD = LongWord;
Run Code Online (Sandbox Code Playgroud)
所以,CppULongInt并且DWORD是不同的类型.因此编译错误.
这里发生了什么?目的是CppULongInt什么?在RTL设计师为什么似乎想别名DWORD来CppULongInt.此更改是否与基于LLVM的x64 Windows C++编译器相关?我是世界上唯一使用过的人{$TYPEDADDRESS ON}吗?
请注意,最后一个问题是修辞.
小智 5
看起来有人在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中无法正常工作.