タイトル【小池邦人のプログラミング日記】2000/7/11<Mac OS Xへの道 Carbon対応の実際(1)>カテゴリーCarbon/CF, 小池邦人のプログラミング日記
作成日2000/7/12 11:43:11作成者新居雅行
既存のソースコードをCarbon APIに対応させ、Mac OS X環境でも起動できるアプリケーションを完成させるのには、いくつもの工程が存在します。

(1)必要のないAPIの削除
(2)MacOS 8/9で導入された新APIの利用
(3)WinodwPtrとGrafPortを明確に区別
(4)アクセッサーファンクションの利用
(5)Print Manager関連のAPIを変更
(6)Scrap Manager関連のAPIを変更
(7)Mac OS Xメニューモデルへの変更
(8)新しいイベントモデルへの変更
(9)Mac OS Xに対する最適化

これらの工程は、今後Apple社から発表される技術内容(Mac OS Xβ版とか...)によっても変化する可能性があります。また、Carbon化するアプリケーションのタイプによっては省略できる工程もあります。例えば、プリントアウトの必要ないアプリケーションの場合には、(5)の工程を行う必要はありません。加えて、Mac OS 8/9環境のみで動作するCarbonアプリケーション(意味があるかどうかは別にして...)の開発には、(7)から(9)の工程は必要ありません。

ただし、どのアプリケーションに関しても最低限(1)から(4)までの工程は必要です。また、それらの工程はそれぞれが相互に関係していますので、4つの工程を同時進行で進めても良いと思います。ひとつのソースファイルをコンパイルし、表示されたシンタックス以外のエラー(APIや定数が定義されていないとか...)を調査して順次対処していきます。この時の参考となるが、Apple社が提供している各Managerに対するドキュメント(PDF)ですが、それ以上に、エラー箇所に関係するManagerのヘッダーファイルが手助けとなります。例えば、Window Manager関連のAPIについてコンパイルエラーが表示された場合には、MacWindows.hを参照してみます。そのソースコードの中で、

#if CALL_NOT_IN_CARBON



#endif /* CALL_NOT_IN_CARBON */

ではさまれた箇所に記載されているAPI、定数、構造体は、Carbon環境では一切使用できませんので注意してください。また、コメントとして...

/* Routines available in Mac OS 8.5 and later*/

とか

/* Routines available in Carbon and later*/

などと記載されている箇所は、Mac OS 8.5以降の環境やCarbon環境のみで利用できるAPI、定数、構造体であることを示しています。

では、各工程を一つ一つ検証していくことにします。

(1)必要のないAPIの削除

今まで特定の箇所に実装してきたAPIのうち、Carbon環境では実装する必要がない物があります。例ば、一番最初(多分、main()ルーチン)に実行していたInitGraf()やInItFonts()、InitWindows()、InitMenus()、TEInit()、InitDialogs()といった各Manager初期化ルーチンは、すべて実装する必要はありません。メニュー関連ですと、アップルメニューに項目を加えるAppendResMenu()とか、そのメニュー項目を起動させるOpenDeskAcc()なども必要ありません。Carbon環境では、これらはすべてOS側が自動的に行います。

同様にイベント関連のSystemtask()や、Text Servic ManagerのTSMEvent() やTSMMenuSelect()といったAPIも実装する必要はありません。それから、Carbon環境ではQuickDraw 3DのAPIは一切サポートされていませんので、もしアプリケーションがそれらを利用していると、OpenGLルーチンか独自のルーチンに切り換える必要があります。QuickDraw 3Dファンへの朗報として、「Quesa」というOpenGL上のQuickDraw 3Dコンパチブル・ライブラリが開発されつつあるようです。興味ある方は以下のサイトを覗いてみてください。
http://www.quesa.org/

(2)MacOS 8/9で導入された新APIの利用

例えば、未だにソースファイルにMac OS 7用コードが多数含まれている場合には、最低限Mac OS 8で導入されたAPIへ、最善作としてはMac OS 9で導入されたAPIへ切り換えておく必要があります。Mac OS 7からMac OS 8へ切り替わった時、ヘッダーファイルに定義されているAPIや定数の名称も大きく変更されました。例えば、Mac OS 7ではGetDItem()という名称がでしたが、Mac OS 8ではGetDialogItem()とう名称に変わっています。こうした名称変更は、Control Manager、Menu Manager、Dialog Mnager、Resource Mangerなどに多数存在します。ソースコードがMac OS 8対応になったら、続いてMac OS 8.5、Mac OS 8.6、Mac OS 9.0で新規に追加されたAPIを勉強してみてください。Apple社のデベロッパーサイトからドキュメントをダウンロードして読むと、最近のOSバージョンの変遷で、いかに多くのAPIが追加されてたのかに驚かされるかもしれません。

ちなみに、古いAPIでもCarbon環境で利用できるものは、そのまま利用していても構いません。例えばウィンドウ作成するAPIとしては古くからNewCWindow()がありますが、これを最新のCreateNewWindow()に置き換えることが可能です。かといって、Carbon環境でNewCWindow()が使えないわけではありません。ただし、将来的にMac OS X対応アプリケーションとするならば、CreateNewWindow()に切り換えられることをお薦めします。また例外的に、旧APIの使用がまったくダメな物もあります。それはStandard File Packgeです。CarbonLibではStandardPutFile()やStandardGetFile()といったお馴染みのAPIは利用できません。これらは、Navigation ServiceのNavGetFile()やNavPutFile()に必ず切り換える必要があります。

(3)以降の工程については、次回に詳しくお話しする予定です。
関連リンクオッティモ