Windows と macOS との相違点
マルチデバイス アプリケーションについての考慮事項 への移動
macOS 向けのマルチデバイス開発を始めるときは、ここで説明する内容を含む、さまざまな問題を理解して処理できるようにする必要があります。
目次
例外処理の違い
Mac および Linux のシステムではプログラム カウンタ(PC)でマップされた例外を使用しますが、Windows(Win32)ではスタック上でリンクされた登録レコードを使用します。
例外処理をターゲット プラットフォームで使われるタイプに合わせる必要があります。特に、例外がアセンブリ ルーチンを通して送出される可能性がある場合は、そのアセンブリ ルーチンのコーディング方法が違ってきます。詳細は、「アセンブリ ルーチンの巻き戻し」を参照してください。
macOS プラットフォームでは、構造化例外処理(__try/__except)は利用できません。 詳細については、「macOS のアプリケーション開発#例外処理」を参照してください。
例外処理に関する一般的な情報については以下を参照してください。
- 例外処理(Delphi)
- C++Builder の例外処理
- Mac OS の例外処理に関する Eli のブログ: http://blogs.embarcadero.com/eboling/2009/11/10/5628
Mac と Windows のアラインメントの違い
- アラインメントの問題は、アセンブラ コードを使用する開発者にのみ関係します。
- Mac のアプリケーション バイナリは 16 バイト間隔を使用します。
- SO(共有オブジェクト)スタックは 16 バイト単位に分割できなければなりません。
- Mac 環境では、16 バイトのアラインメントに適合しないプロセスはすべて強制終了されます。
- Mac のスタックについては Eli のブログ http://blogs.embarcadero.com/eboling/2009/10/13/5620 を参照してください。
WideChar
とwchar_t
の違い(wchar_t
は Windows では 2 バイト、macOS では 4 バイトです)。tchar.h
は Mac(または Linux)では機能しません。
次の 2 つの Delphi コンパイラ指令はアラインメントを制御します。
- コードのアライメント(Delphi) {$CODEALIGN}
- フィールドのアライメント(Delphi) {$A}
Windows および macOS 上の ASM でのグローバル変数に対するアクセス
macOS では位置独立コード(PIC)を使ってグローバル変数のアドレスが指定されるため、ASM 内でグローバル変数にアクセスする際に影響が生じます。
次のようにグローバル変数を宣言しているとします。
var GlobalVar: UInt32 = $12345678;
この変数の値は、ASM コードで次のようにして取得できると予想されます。
function GetGlobalVar: UInt32; asm mov eax,[GlobalVar] end;
しかし、このコードが Windows と macOS の両方で正しく(予想どおりに)動作するのは、グローバル変数が ASM ルーチンと同じユニット内で宣言されている場合だけです。GlobalVar が異なるユニット内にある場合には、GetGlobalVar の動作は Windows と macOS で次のように異なります。
- Windows の場合、GetGlobalVar は GlobalVar の値を返します(予想どおり)。
- macOS の場合、GetGlobalVar は GlobalVar のアドレスを返します(これにより問題が生じる可能性があります)。
グローバル変数にアクセスする場合には、次の方法で行うことをお勧めします。
function GetGlobalVar: UInt32; begin asm MOV EAX, [EBX].OFFSET GlobalVar MOV EAX, [EAX] end; end;
最初の 'begin' 句は、この操作用に EBX をセットアップするための必須の PIC プロローグ コードのセットアップに必要なものです。
Windows アプリケーションでのみ利用可能な Windows ライブラリ
以下の相違点に留意してください。
- macOS アプリケーションは、FireMonkey API または POSIX API のいずれかを呼び出すことができます。
- macOS アプリケーションは、Windows API(32 ビットおよび 64 ビット)を呼び出すことはできません。
- Windows アプリケーションは、32 ビット Windows API または 64 ビット Windows API のいずれかを呼び出すことができます。
Mac と Windows で同等なファイル拡張子
Mac のファイル拡張子 | Windows のファイル拡張子 |
---|---|
.o(オブジェクト ファイル) |
.obj(オブジェクト ファイル) |
.dylib(ダイナミック ライブラリ) |
.dll(ダイナミック リンク ライブラリ) |
Mac と Windows で同等なコマンドライン要素
要素 | Mac の場合 | Windows の場合 |
---|---|---|
コマンド ライン インターフェイス |
Apple ターミナル ウィンドウ(Unix ベース) |
cmd ウィンドウ([スタート|cmd]) |
コマンド プロンプト |
> 現在のディレクトリを参照するには、コマンドの先頭に |
> |
ディレクトリ リスト コマンド |
ls |
dir |
ディレクトリの変更コマンド |
|
|
ファイル名の区切り文字 |
/ |
\ |