sesión 64bits

Anuncio
02/10/2011
Demo 64-bit y Estilos VCL
Delphi 64-bit
Danysoft | www.danysoft.com | 902 123146 | [email protected]
1
02/10/2011
¿Qué permanece igual?
• Integer, Longint, Cardinal – todavía
32bits
• Int64, UInt64 – todavía 64bits
• UnicodeString, AnsiString,
WideString
• Exceptions
• Runtime Library (RTL)
• SysUtils, Classes, etc…
Tamaños de tipos en Delphi 32 y 64-bit
Tipos con signo
ShortInt
SmallInt
LongInt
Integer
Int64
Delphi/32
1 byte
2 bytes
4 bytes
4 bytes
8 bytes
Delphi/64





Tipos sin signo
Byte
Word
LongWord
Cardinal
UInt64
Delphi/32
1 byte
2 bytes
4 bytes
4 bytes
8 bytes
Delphi/64





Danysoft | www.danysoft.com | 902 123146 | [email protected]
2
02/10/2011
¿Cuáles son las diferencias?
•
•
•
•
NativeInt, NativeUint – 64bits
Pointer (todos los punteros) – 64bits
Arrays dinámicos – Indexado 64bit
Matecática de coma flotante - Double
Tamaños de tipos en Delphi 32 y 64-bit
Tipos con signo
NativeInt
Delphi/32
4 bytes
Delphi/64
8 bytes
Tipos sin signo
NativeUInt
Delphi/32
4 bytes
Delphi/64
8 bytes
Danysoft | www.danysoft.com | 902 123146 | [email protected]
3
02/10/2011
Tipos puntero Delphi 32 u 64-bit
Tipos puntero
Delphi/32 Delphi/64
Pointer
String
Class instance
Class reference
Interface
AnsiString
WideString
UnicodeString
Procedure pointer
Dynamic array
PAnsiChar
PWideChar
PChar
4 bytes
8 bytes
La CPU – Modelo de programación
Danysoft | www.danysoft.com | 902 123146 | [email protected]
4
02/10/2011
Instrucciones y direcciones
• Espacio de direccionamiento de 64 bit
• Limitado por el hardware disponible
• Mismo conjunto de instrucciones del núcleo
de Intel
• Nuevo prefijo REX para las instrucciones 64bit
• Direccionamiento relativo al RIP
• Saltos – Relativos +/- 2GB
• Alineamiento de pila de 16 byte
• Online resources
• http://msdn.microsoft.com/en-us/magazine/cc300794.aspx
• http://msdn.microsoft.com/en-us/library/7kcdt6fy.aspx
¿Y esto que significa para Delphi?
Danysoft | www.danysoft.com | 902 123146 | [email protected]
5
02/10/2011
¡No te asustes!
Delphi 64-bit en Windows
• La misma API de Windows
– CreateWindowEx, PeekMessage, etc..
• La misma RTL de Delphi
– SysUtils, Classes,
Generics.Collections, etc…
• La misma VCL
– Forms, Graphics, Controls, Menus, etc..
Danysoft | www.danysoft.com | 902 123146 | [email protected]
6
02/10/2011
Condicionales predefinidos
• Categoría
Identificador
• Compiler
DCC
definido
VER230
definido
• Platform
MSWINDOWS
WIN32
WIN64
• CPU
CPU386
CPUX86
CPUX64
• Availability ASSEMBLER
UNICODE
dcc32
definido
dcc64
definido
definido
definido
no definido
definido
definido
no definido
definido
definido
definido
no definido
definido
no definido
no definido
definido
definido
definido
Delphi 64-bit en Windows – puntos de interés
• SizeOf(Pointer) <> SizeOf(Integer)
– Conversión Integer<->Pointer fallará en 64bit
– SizeOf(THandle) = SizeOf(Pointer)
– Todos los manejadores = SizeOf(Pointer) (HWND, HDC, etc..).
• Todo el código debe ser 64bit
– Se debe tener las versiones de 64bit de la librerías externas
• Una y solo una convección de llamada
– register, pascal, cdecl, stdcall se ignoran.
• safecall todavía “especial”
• El antiguo “puntero matemático” puede fallar
– Trabaja en 32 y 64bit: MyPtr := PByte(P) + 10;
• Tlist es ahora un TPointerList. Solía ser una PPointerList. Quitar
el ^ debería ser suficiente para pasar de 32-bit a 64-bit.
• La propiedad Tag es una propiedad de tipo NativeInt (32-bit vs
64-bit)
Danysoft | www.danysoft.com | 902 123146 | [email protected]
7
02/10/2011
Delphi 64-bit en Windows – puntos de interés
•
•
•
•
Ensamblado en línea
– No se puede mezclar bloques asm blocks con Pascal
– Solo a nivel procedural los bloques asm se soportan
– La pila debe ser de 16-byte, alineada a cada instrucción de
llamada
– Define variables locales para el almacenamiento temporal
– No modificar el puntero de pila RSP
– Nueva convención de llamada unificada. Los cuatro primeros
parámetros en registros, RCX, RDX, R8, R9 (o XMM0-XMM3)
Escalado de pila de las excepciones
– Sin cambios en el código Delphi Puro. Las excepciones
funcionan idénticamente.
– Ensamblador en línea puede hacer que las excepciones no se
escalen si no está escrito correctamente.
Los valores SHL/SHR – 32-bit (Integer y otros) solo se cambian
en espacios 32-bit. Los valores 64-bit en espacios de 64-bit.
No existe el tipo Extended en 64-bit. Usar el TExtendedRec80 si
es necesario
Puntos de Interés - Windows API
• SetWindowLong / GetWindowLong deben ser
reemplazadas por SetWindowLongPtr /
GetWindowLongPtr para GWLP_HINSTANCE,
GWLP_WNDPROC, etc… ya que devuelven
punteros y manejadores.
– Los punteros pasados por SetWindowLongPtr
deben ser convertiros a LONG_PTR y no a Integer
/ Longint.
• SetWindowLong mapeado a
SetWindowLongPtr en Windows.pas.
– Las llamadas a la declaración de
SetWindowLong son seguras, siempre que la
conversión sea correcta
Danysoft | www.danysoft.com | 902 123146 | [email protected]
8
02/10/2011
Puntos de Interés - Windows API
• Usa conversión explicita para WPARAM y
LPARAM donde sea explícito.
– Ejemplo: Pasar punteros a través de
SendMessage SendMessage(hWnd,
WM_SETTEXT, 0,
LPARAM(@MyCharArray));
• Usa LRESULT para convertir los
resultados del mensaje
– Ejemplo: Message.Result :=
LRESULT(Self);
• Los registros de rotura de los
mensajes (TWMxxx) han cambiado
– Alineamiento cambia y tamaño de
los campos
¿Qué podemos hacer hoy?
• Localizar todas la conversiones Integer<->Pointer,
incluyendo Integer<->instance.
– Comprobar las asunciones de tamaño de puntero
• Asegurarnos de que las dependencias externas
son 64bit
– Librerías de imagenes/bitmap
– Librerías de interfaces de Hardware
– Controles ActiveX
• Considerar la reescritura del ASM en Pascal puro
– Mejor portabilidad futura (ej.: ARM CPUs…)
– Se apoya en rendimiento algorítmico mas que en
rendimiento de ensamblador.
• Asegurarnos de que tamaño de usamos (32 vs 64)
cuando usemos SHL/SHR.
Danysoft | www.danysoft.com | 902 123146 | [email protected]
9
02/10/2011
VCL
¿Que hay de nuevo en la VCL?
• 64-bit
• Estilos VCL
Danysoft | www.danysoft.com | 902 123146 | [email protected]
10
02/10/2011
Estilos VCL
Los temas hasta Delphi/C++Builder XE
• Solo 1 "theme" soportado (Windows nativo)
• Eran necesarios productos externos para
cambiar el aspecto de las apps VCL
• Actualmente crear “skins” para los controles
de Windows
– Requería enlazar con WndProc
– Interceptar los mensajes de los controles
• Separar los controles necesarios como
controles personalizados
– Descendientes de TCustomControl /
TGraphicControl
Danysoft | www.danysoft.com | 902 123146 | [email protected]
11
02/10/2011
VCL Styles
•
•
•
•
•
Multiple styles provided/supported
Custom style file creation
Custom style classes
Pluggable style engine
Works with TWinControl and
TGraphicControl descendants
Estilos VCL
•
•
•
•
TThemeServices reemplazados por TCustomStyleServices
– Extiende TThemeServices con más partes, estados y métodos
TStyleEngine
– Procesa los mensajes a los controles
– Llamadas a StyleServices para renderizar partes
TStyleManager
– Nos provee de
• LoadFromFile
• LoadFromResource
• RegisterStyle
• RegisterStyleClass – Asocia un extensión con una clase de estilo
• SetStyle
• Selección de estilos
• Selección de motor de estilos
Permite estilos personalizados
– Crear un fichero de estilo (utilizando la herramienta de creación suministrada)
– Implementa un descendiente de TCustomStyleServices para mostrar partes directamente
Danysoft | www.danysoft.com | 902 123146 | [email protected]
12
02/10/2011
¿A qué se puede aplicar estilos?
• TMainMenu/TPopupMenu (a la barra de
menú aunque no a las partes que aparecen)
• Controles Ribbon
• Diálogos OS
Project Options | Appearance
Danysoft | www.danysoft.com | 902 123146 | [email protected]
13
02/10/2011
De esto…
¡A esto!
Danysoft | www.danysoft.com | 902 123146 | [email protected]
14
02/10/2011
Diseñador de estilos VCL
Uso típico
• Uses Vcl.Styles, Vcl.Themes;
• TStyleManager.SetStyle(‘Ruby Red
Graphite’);
RTL
Danysoft | www.danysoft.com | 902 123146 | [email protected]
15
02/10/2011
RTL
¿Qué hay nuevo en la RTL?
•
•
•
¡¡64-bit para Windows!!!
Macos – Sin COM, sin ActiveX. :)
– Las características específicas de Windows se han mapeado a equivalente en
función de la disponibilidad
TOS Versión
–
•
•
•
•
•
•
Architecture (32/64-bit), Platform (Win/Mac), Major, minor OS version, Service Pack info
TFormatSettings
– Reemplaza los valores globales de formato (que no existen en MacOSX)
TZipFile – soporte multi plataforma de Zip
Rutinas de manejo de ficheros SymLinks en IOUtils y SysUtils
– class function TFile.CreateSymLink(const Link, Target: string): Boolean;
TLoginCredentialService
– Framework extensible y agnostico para servicios de credenciales con soporte
para callbacks (éxito, fracaso, etc)
TPoint, TRect, TSize – nuevos métodos y propiedades
TPointF, TRectF, TSizeF – Versiones en coma flotante
Danysoft | www.danysoft.com | 902 123146 | [email protected]
16
02/10/2011
TFormatSettings (SysUtils)
type
TFormatSettings = record // System.SysUtils
…
CurrencyString: string;
CurrencyFormat: Byte;
CurrencyDecimals: Byte;
DateSeparator: Char;
TimeSeparator: Char;
ListSeparator: Char;
ShortDateFormat: string;
LongDateFormat: string;
TimeAMString: string;
TimePMString: string;
ShortTimeFormat: string;
LongTimeFormat: string;
ShortMonthNames: array[1..12] of string;
LongMonthNames: array[1..12] of string;
ShortDayNames: array[1..7] of string;
LongDayNames: array[1..7] of string;
ThousandSeparator: Char;
DecimalSeparator: Char;
TwoDigitYearCenturyWindow: Word;
…
end;
TZipFile (System.Zip)
type
TZipFile = class
..
public
…
procedure Open(ZipFileName: string; OpenMode: TZipMode); overload;
procedure Open(ZipFileStream: TStream; OpenMode: TZipMode); overload;
procedure Close;
procedure Extract(FileName: string; Path: string = ''; CreateSubdirs: Boolean=True); overload;
procedure Extract(Index: Integer; Path: string = ''; CreateSubdirs: Boolean=True); overload;
procedure ExtractAll(Path: string = '');
procedure Read(Index: Integer; out Bytes: TBytes); overload;
procedure Read(FileName: string; out Stream: TStream); overload;
procedure Read(Index: Integer; out Stream: TStream); overload;
procedure Add(FileName: string; ArchiveFileName: string = '';
Compression: TZipCompression = zcDeflate); overload;
…
property FileCount: Integer read GetFileCount;
property FileNames: TArray<string> read GetFileNames;
…
end;
Danysoft | www.danysoft.com | 902 123146 | [email protected]
17
02/10/2011
TLoginCredentialService
type
TLoginCredentialService = class sealed
public const
Default = '';
DefaultUsrPw = 'DefaultUsrPw'; // do not localize
DefaultUsrPwDm = 'DefaultUsrPwDm'; //do not localize
…
strict private class var
FLoginHandlers: TStringList;
strict private
class constructor Create;
class destructor Destroy;
class function IndexOfHandler(const Context: TLoginCredentialEvent): Integer;
public
class procedure RegisterLoginHandler(const Context: string; const HandlerEvent: TLoginCredentialEvent); static;
class procedure UnregisterLoginHandler(const Context: string; const HandlerEvent: TLoginCredentialEvent); static;
class function GetLoginCredentialEvent(const Context: string): TLoginCredentialEvent; static;
class function GetLoginCredentials(const Context: string; Sender: TObject; const Callback: TLoginEvent): Boolean; overload; static;
class function GetLoginCredentials(const Context: string; const Callback: TLoginFunc): Boolean; overload; static;
class function GetLoginCredentials(const Context: string; var Username, Password: string): Boolean; overload; static;
class function GetLoginCredentials(const Context: string; var Username, Password, Domain: string): Boolean; overload; static;
end;
TPointF (System.Types)
type
TPointF = record
X: Single;
Y: Single;
public
constructor Create(const P: TPointF); overload;
constructor Create(const X, Y: Single); overload;
constructor Create(P: TPoint); overload;
class operator Equal(const Lhs, Rhs: TPointF): Boolean;
class operator NotEqual(const Lhs, Rhs: TPointF): Boolean;
class operator Add(const Lhs, Rhs: TPointF): TPointF;
class operator Subtract(const Lhs, Rhs: TPointF): TPointF;
function Distance(const P2: TPointF): Double;
procedure SetLocation(const X, Y: Single); overload;
procedure SetLocation(const P: TPointF); overload;
procedure SetLocation(const P: TPoint); overload;
…
function Add(const Point: TPointF): TPointF; overload;
function Add(const Point: TPoint): TPointF; overload;
function Subtract(const Point: TPointF): TPointF; overload;
function Subtract(const Point: TPoint): TPointF; overload;
function IsZero: Boolean;
function Ceiling: TPoint;
function Truncate: TPoint;
function Round: TPoint;
end;
Danysoft | www.danysoft.com | 902 123146 | [email protected]
18
02/10/2011
C++
¿Qué hay de nuevo en C++?
•
•
•
•
•
FireMonkey
Live Bindings
DataSnap
RTTI extendido
Auditorías y métricas
Danysoft | www.danysoft.com | 902 123146 | [email protected]
19
02/10/2011
Demostraciones
Demostraciones
• 32-bit/64-bit Fish Facts con estilo
• Fish Facts con estilo en C++
• Fish Facts con estilos y Live Bindings
Danysoft | www.danysoft.com | 902 123146 | [email protected]
20
Descargar