タイトル【SnapXShot制作記】Project BuilderでビルドしてみたカテゴリーSnapXShot制作記
作成日2000/12/5 1:50:27作成者新居雅行
Mac OS Xで画面ショットを作成するツールのSnapXShotだが、2000/12/4版をリリースした(ちなみに、番号はあまり意味がないと思うので、リリース日で識別することにしている)。前のバージョンまではCodeWarriorで作っていたが、この版からProject Builderでビルドするようにしてみた。アイコンもドーンとゴージャスに写真そのままを添付した。また、矢印カーソルしかだめだけども、カーソルを画面ショットに含めるようにもしてみた。

CodeWarriorでのデバッグは何とかできるようにはなったけど、Project Builderに興味があるし、あの大きなアイコンを簡単に作成するにはProject Builderの方が良さそうだったということもある。Carbonアプリケーションは2種類のバイナリモデルがあって、CodeWarriorはCFM(Code Fragment Manager)、Project BuilderはMach-Oしか作成できない。小池さんのプログラマー日記にもあったが、Mach-Oの方が起動が早いようだということで、少しでも効率が高い方にしたいというのもある。CFMベースで作っていると、Mac OS 9でも動いてしまうのであるが、Mach-OだとMac OS X専用になるので、重大事ではないけど、好都合かもしれない。ちなみに、CFMベースだと、Mac OS Xのシステム的にはLaunchCFMAppというアプリケーションが動いてその上でCFMとして作ったソフトウエアバイナリが稼動するという仕組みだ。だから、プロセス名は一律に「LaunchCFMApp」になってしまう。一方、Mach-Oは起動したアプリケーションがそのままプロセスとして登場するから、やはりこちらの方が「正統派」という印象も受けてしまう。

Project Builderの詳細な使い方は、別の機会で紹介することにしよう。今回は、Carbon Application (nib Based)というプロジェクトのひな形を利用した。nibというのは、やはりAppleから提供されている開発ツールに含まれるアプリケーションのInterface Builderで作ったデータファイルの拡張子だ。Interface Builderは、GUIをベースにしたユーザインタフェース構築ツールとしての側面と、クラス設計をするツールという機能があるが、Carbonベースだと、おそらく前者の機能だけを使うことになるだろう。プロジェクトのひな形としてこちらを使っておけば、Interface Builderでデザインしたウインドウやダイアログボックスを利用する形式のCarbonアプリケーションを作りやすいと考えた。プロジェクトのひな形に含まれる簡単なプログラムからも、nibファイルに定義したウインドウをあたかもリソースのように取り出して表示するようなものがある。SnapXShotも今後は、きちんと設定ダイアログボックスのようなものを作りって、キーアサインなどを変更できるようにしたいと思っているのだが、ResEditで作るという旧来の方法は、ClassicアプリケーションであるResEditを使うという点でやっぱり避けたい。もっとも、nibベースの部分は未体験ゾーンでもあり、予断を許さないのであるが、とにかくまずはあたって砕けろということで、nibベースを選んでみた。まだ、現状ではダイアログボックスなどを作り込んではいない。

さて、プロジェクトを作って、既存のソースを読み込ませて、コンパイルしてOKではないことは以前にお知らせした通りだ。やっぱり甘くない。だが、良く見ると、Universal Headersで提供されているシステム機能を使うためのヘッダファイルのインクルードでエラーが出ている。Navigation.hとか、軒並みだめなのである。そこで、プロジェクトが作ったソースを見てみると、ヘッダファイルの読み込みは、

#include <Carbon/Carbon.h>

だけしかない。システム関連のヘッダの読み込みはこれだけでいいのである。とにかく楽になったようではある。ここで、インクルード文の形式としては、

#include <フレームワーク名/ヘッダファイル名>

として記述できるようになる。CodeWarriorのようなコンパイラのパスという考え形ではなく、フレームワークと、ヘッダの組み合わせでいいのである。フレームワークは、ソフトウエアのライブラリ的なものだが、ヘッダファイルのような開発時に必要なものも含めてパッケージになっている。/System/Library/Frameworksに、拡張子が.frameworkのフォルダがたくさんあるが、これらがフレームワークなのである。Finderでその中身をいろいろと覗いてみるといいだろう。プロジェクトにはCarbon.frameworkが最初から設定されているが、実はCarbonはその他のいろいろなフレームワークを参照しているため、結果的には自動的に必要なものがProject Builderでの開発時に利用されるようになるようだ。とにかく、Carbonのフレームワークをインクルードしておき、Carbonのヘッダを読み込めば済むということでそれ以上の措置はとりあえずは必要なさそうである。

ヘッダを正常化したが、いくつか重大なエラーが出ている。ちなみに、重大なエラーは赤字、警告はグレーの文字で出る。赤字がでなくなるまでがんばらないといけない。小池さんのプログラマー日記にもあったように、コンパイラの動作がCodeWarriorと違うようで、けっこうエラーを出すのである。ただ、SnapXShotは、サンプルコードのSuper SnapShotのソースを使っているものの、実は大半のソースは使っていない。そこで、エラーが出るところは関数ごとコメントしてしまうという手を使ってとりあえず逃れることにした。それでも、画面のPixMapを作る部分でどうしてもエラーが出る。もとのソースは次のようなものだ。カラーテーブルへのハンドルcTableの複製を作るというものである。

HandToHand( &(Handle)cTable );

これだと「invalid lvalue in unary ‘&’」という重大なエラーとなる。キャスト結果のポインタ取得がエラーになるのは、厳しいぞ…などと思いながら、処理を2ステートメントに分けてみた。Handle形の変数cTabHandleを定義して、以下のように、引数の中身を分割した。そうすれば、重大なエラーはなくなった。

cTabHadle = (Handle)cTable;
HandToHand( &cTabHadle );

あとは、警告エラーだけになったので、とりあえず無視してビルドすると、見事にProject Builderがアプリケーションを生成した。ちなみに、プロジェクトが作成したソースなどが入っているフォルダの中にbuildというフォルダが作られていて、そこに作成したアプリケーションが作られる。パッケージになっているので、実体はSnapXShot.appというフォルダだが、Finderでは通常は1つのアプリケーションファイルに見えるという具合である。

2000/12/4版は、あとはトピック的にはでっかいアイコンをつける話と、マウスポインタを画面ショットに含める話がある。これらは次回にお届けしよう。
関連リンクSnapXShot