versiones software edition descargar community borland delphi delphi-xe4

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.