Différences entre Windows et macOS

De RAD Studio
Aller à : navigation, rechercher

Remonter à Considérations pour les applications multi-périphériques


Quand vous commencez le développement multi-périphérique pour macOS, vous devez comprendre et être capable de gérer de nombreux problèmes, notamment ceux décrits ci-dessous.

Gestion des exceptions différente

Les systèmes Mac et Linux utilisent des exceptions mappées - PC (Program Counter), alors que Windows (Win32) utilise des enregistrements de registre liés sur la pile.

Vous devez adapter votre gestion d'exceptions au type utilisé sur votre plate-forme cible. En particulier, il y a des différences dans la façon de coder les routines assembleur, dans le cas où une exception pourrait être déclenchée derrière elles. Pour de plus amples informations, voir Exceptions mappées - PC (Program Counter)#Déroulement des routines assembleur.

Sur la plate-forme macOS, la gestion des exceptions structurée (__try/__except) n'est pas disponible. Pour de plus amples informations, voir Développement d'applications macOS#Gestion des exceptions.

Pour obtenir des informations générales sur la gestion des exceptions, voir :

Différences d'alignement entre Mac et Windows

  • Les problèmes d'alignement se rapportent seulement au développement utilisant du code assembleur.
  • Un binaire d'application Mac utilise des intervalles de 16 octets.
  • La pile SO (objet partagé) doit contenir des unités de 16 octets.
  • L'environnement Mac détruit tout processus qui ne correspond pas à l'alignement sur 16 octets.
  • Voir le blog de Eli sur la pile sur le Mac : http://blogs.embarcadero.com/eboling/2009/10/13/5620
  • WideChar contre wchar_t (wchar_t est de 2 octets sur Windows contre 4 octets sur macOS)
  • tchar.h ne fonctionne pas sur un Mac (ou sur Linux)

Deux directives du compilateur Delphi contrôlent l'alignement :

Accès aux variables globales dans ASM sur Windows et macOS

Sur macOS, les variables globales sont adressées en utilisant du code indépendant de la position (PIC). Cela affecte votre capacité à accéder aux variables globales dans ASM.

Si vous avez déclaré une variable globale, comme suit :

var
  GlobalVar: UInt32 = $12345678;

Puis prévoyez d'obtenir la VALEUR de cette variable dans le code ASM comme suit :

function GetGlobalVar: UInt32;
asm
  mov eax,[GlobalVar]
end;

Toutefois, ce code fonctionne correctement (comme prévu) sur Windows et macOS seulement si la variable globale est déclarée dans la MEME unité que la routine ASM. Si GlobalVar réside dans une autre unité, GetGlobalVar se comporte alors différemment sur Windows et macOS :

  • Sur Windows, GetGlobalVar renvoie la VALEUR de GlobalVar (comme prévu).
  • Sur macOS, GetGlobalVar renvoie l'ADRESSE de GlobalVar (cela peut avoir des conséquences problématiques).

Pour accéder à une variable globale, nous vous conseillons ceci :

function GetGlobalVar: UInt32;
begin
  asm
    MOV EAX, [EBX].OFFSET GlobalVar
    MOV EAX, [EAX]
  end;
end;

La clause 'begin' initiale est nécessaire pour configurer le code de prologue PIC requis qui configure EBX pour cette opération.

Les bibliothèques Windows sont seulement disponibles pour les applications Windows

Souvenez-vous de ces différences :

  • Une application macOS peut appeler les API FireMonkey ou les API POSIX.
  • Une application macOS ne peut pas appeler les API Windows (32 bits ou 64 bits).
  • Une application Windows peut être activée pour appeler les API Windows 32 bits ou les API Windows 64 bits.

Extensions de fichier équivalentes sur le Mac et Windows

Extension de fichier Mac Extension de fichier Windows
.o (fichier objet)
.obj (fichier objet)
.dylib (bibliothèque dynamique)
.dll (bibliothèque de liaison dynamique)

Eléments de ligne de commande équivalents sur le Mac et Windows

Elément Sur le Mac Sur Windows

Interface de ligne de commande

Fenêtre Terminal Apple (basée sur UNIX)

Fenêtre cmd (Démarrer | cmd)

Invite de commande

>

Pour référencer le répertoire en cours, démarrez votre commande par ./.

>

Commande liste de répertoires

ls
dir 

Commande changement de répertoire

  • cd ..
    (remonter d'un niveau)
  • cd répertoire
    (se déplacer sur le répertoire spécifié)
  • cd ..
    (remonter d'un niveau)
  • cd répertoire
    (se déplacer sur le répertoire spécifié)

Séparateur de nom de fichier

/
\

Voir aussi