Unterschiede zwischen Windows und macOS

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Gesichtspunkte für geräteübergreifende Anwendungen


Bei der geräteübergreifenden Entwicklung für macOS 64 Bit (Intel) oder macOS 64 Bit (ARM) gibt es viele Fragen und Bereiche, die Sie verstehen müssen, um angemessen damit umgehen zu können, u.a. die in diesem Thema behandelten Fragen.

Abweichende Exception-Behandlung

Mac- und Linux-Systeme verwenden Programmzählern (Program Counter, PC) zugeordnete Exceptions. Windows (Win32) verwendet auf dem Stack gelinkte Registrierungs-Records.

Sie müssen Ihre Exception-Behandlung an die der jeweiligen Zielplattform anpassen. Insbesondere gibt es Unterschiede in der Art und Weise, wie Assembly-Routinen programmiert werden müssen, wenn eine Exception nach diesen Routinen ausgelöst werden könnte. Weitere Informationen finden Sie unter PC-zugeordnete Erweiterungen#Abwicklung von Assembly-Routinen.

Auf den Plattformen macOS 64 Bit (Intel) und macOS 64 Bit (ARM) ist eine strukturierte Exception-Behandlung (__try/__except) nicht verfügbar. Weitere Informationen finden Sie unter MacOS-Anwendungsentwicklung#Exception-Behandlung.

Allgemeine Informationen zur Exception-Behandlung finden Sie unter:

Abweichende Ausrichtung auf dem Mac und unter Windows

  • Ausrichtungsprobleme betreffen nur die Entwicklung mit Assembler-Code.
  • Die Binärdatei einer Mac-Anwendung verwendet 16-Byte-Intervalle.
  • Der SO-Stack (Shared Object) muss 16 Byte große Einheiten enthalten.
  • In der Mac-Umgebung wird jeder Prozess abgebrochen, der nicht der 16-Byte-Ausrichtung entspricht.
  • Siehe Elis Blog über den Stack auf dem Mac: http://blogs.embarcadero.com/eboling/2009/10/13/5620
  • WideChar und wchar_t (wchar_t ist unter Windows 2 Byte und unter macOS 4 Byte groß)
  • tchar.h funktioniert auf einem Mac nicht

Zwei Delphi-Compiler-Direktiven steuern die Ausrichtung:

Zugreifen auf globale Variablen in ASM auf Windows und macOS

Unter macOS 64 Bit (Intel) und macOS 64 Bit (ARM) werden globale Variablen mithilfe von PIC (Position-Independent Code, positionsunabhängiger Code) adressiert, und dies wirkt sich auf die Möglichkeit aus, auf globale Variablen in ASM zuzugreifen.

Wenn Sie eine globale Variable folgendermaßen deklariert haben:

var
  GlobalVar: UInt32 = $12345678;

Dann erwarten Sie, dass der WERT dieser Variable im ASM-Code wie folgt ermittelt wird:

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

Dieser Code arbeitet unter Windows, macOS 64 Bit (Intel) und macOS 64 Bit (ARM) jedoch nur korrekt (wie erwartet), wenn die globale Variable in DERSELBEN Unit wie die ASM-Routine deklariert ist. Wenn sich GlobalVar in einer anderen Unit befindet, verhält sich GetGlobalVar unter Windows und macOS unterschiedlich:

  • Unter Windows gibt GetGlobalVar den WERT von GlobalVar zurück (wie erwartet).
  • Unter OSX gibt GetGlobalVar die ADRESSE von GlobalVar zurück (dies kann problematische Konsequenzen haben).

Um auf eine globale Variable zuzugreifen, wird folgendes Vorgehen empfohlen:

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

Die "begin"-Klausel am Anfang wird zum Festlegen des erforderlichen PIC-Prologcodes benötigt, der das EBX für diese Operation einrichtet.

Windows-Bibliotheken sind nur für Windows-Anwendungen verfügbar

Beachten Sie diese Unterschiede:

  • Eine Anwendung für macOS 64 Bit (Intel) und macOS 64 Bit (ARM) kann entweder FireMonkey-APIs oder POSIX-APIs aufrufen.
  • Eine Anwendung für macOS 64 Bit (Intel) und macOS 64 Bit (ARM) kann keine Windows-APIs (weder 32 noch 64 Bit) aufrufen.
  • Eine Windows-Anwendung kann entweder 32-Bit-Windows- oder 64-Bit-Windows-APIs aufrufen (nach entsprechender Konfiguration).

Entsprechungen für Dateierweiterungen auf dem Mac und unter Windows

Mac-Dateierweiterung Windows-Dateierweiterung
.o (Objektdatei)
.obj (Objektdatei)
.dylib (dynamische Bibliothek)
.dll (dynamisch gelinkte Bibliothek)

Entsprechungen für Befehlszeilenelemente auf dem Mac und unter Windows

Element Auf dem Mac Unter Windows

Befehlszeilenoberfläche

Apple-Terminalfenster (UNIX-basiert)

Befehlsfenster (Start | cmd)

Eingabeaufforderung

>

Beginnen Sie den Befehl mit ./, um auf das aktuelle Verzeichnis zu verweisen.

>

Befehl zum Auflisten von Verzeichnissen

ls
dir 

Befehl zum Wechseln des Verzeichnisses

  • cd ..
    (eine Ebene nach oben)
  • cd Verzeichnis
    (zum angegebenen Verzeichnis wechseln)
  • cd ..
    (eine Ebene nach oben)
  • cd Verzeichnis
    (zum angegebenen Verzeichnis wechseln)

Trennzeichen für Dateinamen

/
\

Siehe auch