Unterschiede zwischen Windows und Mac OS X

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 Mac OS X 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 der Mac OS X-Plattform steht die strukturierte Exception-Behandlung (__try/__except) nicht zur Verfügung. Weitere Informationen finden Sie unter Mac OS X-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 OS X 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 OS X

Unter OS X werden globale Variablen mithilfe von PIC (Position-Independent Code, positionsunabhängigem 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 und OS X 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 OS X unterschiedlich:

  • Unter Windows gibt GetGlobalVar den WERT von GlobalVar zurück (wie erwartet).
  • Unter OS X 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 Mac OS X-Anwendung kann entweder FireMonkey-APIs oder POSIX-APIs aufrufen.
  • Ein Mac OS X-Anwendung kann keine Windows-APIs (weder 32 Bit 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))

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)
  • cd ..
    (eine Ebene nach oben)
  • cd Verzeichnis
    (zum angegebenen Verzeichnis)

Trennzeichen für Dateinamen

/
\

Siehe auch