software - delphi versiones
¿Por qué PDWord no es DWORD? (1)
Este programa
{$APPTYPE CONSOLE}
{$TYPEDADDRESS ON}
uses
Winapi.Windows;
procedure Foo(P: PDWORD);
begin
end;
procedure Bar;
var
dw: DWORD;
begin
Foo(@dw);
end;
begin
end.
compila en XE3, pero no en XE4, XE5, XE6 y XE7. El error está en
Foo(@dw);
[dcc32 Error] E2010 Incompatible types: ''PDWORD'' and ''Pointer''
Esto se siente extraño. Entonces, después de excavar un poco, parece que el problema se debe a la definición de PDWORD
. Uno podría pensar naturalmente que sería:
PDWORD = ^DWORD;
y de hecho ese es el caso en XE3. En versiones posteriores, encontramos esto:
// Note: Not ^DWORD yet
PDWORD = ^CppULongInt;
Impar. Entonces, ¿qué es CppULongInt
?
CppULongInt = type LongWord;
{$EXTERNALSYM CppULongInt ''unsigned long''}
{$OBJTYPENAME CppULongInt ''Bul'' ''Gm''}
Luego, mirando la declaración de DWORD
encontramos:
//NOTE: DWORD should really be CppULongInt
DWORD = LongWord;
Entonces, CppULongInt
y DWORD
son tipos diferentes. De ahí el error de compilación.
¿Que está pasando aqui? ¿Cuál es el propósito de CppULongInt
? ¿Por qué los diseñadores de RTL parecen querer alias DWORD
a CppULongInt
? ¿Este cambio está relacionado con el compilador x64 de Windows C ++ basado en LLVM? ¿Soy la única persona en el mundo que usa {$TYPEDADDRESS ON}
?
Tenga en cuenta que la última pregunta es retórica.
Parece que alguien en Embarcadero no leyó la documentación relevante de Windows:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx
DWORD se define explícitamente como un entero sin signo de 32 bits, por lo que en Delphi debe ser un UInt32. PDWORD se define como un puntero a un DWORD, por lo tanto, en Delphi debe ser PDWORD = ^ DWORD.
Es DWORD_PTR (que no es un PDWORD!) Que se define como ULONG_PTR, y el último cambia de tamaño según la plataforma - Win32 o Win64 - no la definición del compilador de un unsigned de largo.
Una razón puede ser que están intentando usar DWORD y otros tipos de datos de Windows en plataformas que no sean de Windows, y están tratando de mantenerlos compatibles. Si es así, en este caso fallaron e introdujeron un error, porque las definiciones utilizadas no funcionarán correctamente en Windows.