« EyeTV 200用番組登録ユーティリティ「iBukkomi Alfa 0.0.3」 | Main | Mac OS X用PSP/PocketPC向け動画エンコード補助ツールffmpegFrontEndを作ろうかな »

2005.08.12

[REALbasic]REALbasicでシェルコマンドのフロントエンドを作る

REALbasicで、シェルコマンドのフロントエンドを作りたい。なおかつ、システムにデフォルトでは存在しないコマンドなので、そのシェルコマンドもバイナリの中にバンドルしたいと思って以前2ちゃんねるで聞いてみたところ、「できない」というのがその場での結論だった。

しかし、その後方法を見つけた(みんな知っているの?)ので書いておこう。そういうニッチなことを簡単に解説しているサイトも日本には無いようだし。

REALbasicは、Mac OS Xにおいて、ビルドするバイナリの形式をいろいろ選べる。
Mac OS Xのみ互換のMach-O形式を指定すると、例の拡張子が.appのパッケージの形態を取ることになる。

.appの実態はフォルダなので、中に簡単にバンドルするファイルを入れておくことができる。
ここまで分かれば、後はやることが決まったも同然だ。


dim f as folderItem
dim a as new application
dim s as new shell

//実行ファイルの参照を取得
//(MyApplication.app:Contents:MacOS:MyApplication)
f = a.executableFile

//実行ファイルがあるフォルダの参照を取得
//(MyApplication.app:Contents:MacOS)
f = getfolderItem(f.absolutePath).parent

//実行ファイルがあるフォルダのPOSIXパスを取得。
//さらにバンドルしたシェルコマンドまでのパスを末尾に結合し、
//(MyApplication.app/Contents/MacOS/unison)
//実行する。
s.execute(f.shellPath + "/unison")

//コマンドからの標準出力を取得
editField1.text = s.result

こんなコードを書いてビルド。できたアプリケーションをControl + Clickして「パッケージの内容を表示」。
Contents、MacOSとフォルダをたどって、そこに(MacOSフォルダの中に)シェルコマンドを入れておく(例ではunison)。
このShellPathというFolderItemのプロパティはマニュアルに無いんだけど、何なんだろう? AppleScriptの「POSIX path of 」みたいなのを探して、外人が使っているのを見て初めて知った。
このほか、マニュアルに記載の無いFolderItemのプロパティにPathTypeShellというのがあるけど、これは/shallow/deep/destfileという形式で与えられた引数をFolderItemとして扱うためのもののようだ。コンソールアプリを作るときに役に立つ。ちょっと話がそれた。

http://rbgazette.com/?p=238

後はこれの応用だけど、困るのはデバッグ。
ただ単にシェルコマンドをプロジェクトウインドウに放り込んでおくだけでは、Resourcesフォルダにリソースとして保存されてしまう。リソースをシェルコマンドとして実行するメソッドは無いようだ。

こうなると、ビルドの度にMyApplication.debug/Contents/MacOSフォルダの中にシェルコマンドをコピーしてやらないといけない。そのこと自体はシェルスクリプトを組むなり何なりで自動化は可能だけど、ほかに方法があるのではと思う次第。

|

« EyeTV 200用番組登録ユーティリティ「iBukkomi Alfa 0.0.3」 | Main | Mac OS X用PSP/PocketPC向け動画エンコード補助ツールffmpegFrontEndを作ろうかな »