前回からずいぶんと経過しており、Carbonの勉強をしている時間もないので、スピード優先で作ってゆくことにした。
Apple Scriptsの実装編
アプリケーションからアップルスクリプトを呼び出す方法は、以下の資料から。
アプリケーション内で実行されている AppleScript に、パラメータを渡す便利な方法はありますか?(http://developer.apple.com/ja/qa/qa2001/qa1111.html)
ここからサンプルをコピーして見たが、スクリプトをロードする関数(LoadMyScriptData)が記述されていない。あっちこっち探索してサンプルを発見。
EmbededAppleScripts(http://developer.apple.com/samplecode/EmbededAppleScripts/listing9.html)
これによると、ロードは単純にfreadとかを利用するようだ。が、このサンプルを追加して実行したところ、いきなりクラッシュ。どうやらサンプルのエラー判定が不足していたためらしい。
/* convert the resource URL into a file system path */
if ( ! CFURLGetFileSystemRepresentation(resourceURL, false, filepath, sizeof(filepath)) ) {
err = fnfErr;
}
ここの部分にif noErr == err 〜の判定を追加。やはりサンプルだけにあるな。
デバッグ編
再度実行すると、クラッシュはしないがスクリプトの実行もされない。
仕方ないので、デバッグ行を追加。syslogに出すようにした。syslogは、/var/log/system.log にあり、ターミナルからtail /var/log/system.logと打ち込めば直近のログが見られる。
syslog(LOG_ERR,"CFBundleCopyResourceURL error");
ログの出力結果
Sep 26 04:40:51 SHIRO /Applications/iTunes.app/Contents/MacOS/iTunes: CFBundleCopyResourceURL error
ちなみに、アップルスクリプトの構文については、以下のリンクに記述(英語)されている。
AppleScript Language Guide(http://developer.apple.com/documentation/AppleScript/Conceptual/AppleScriptLangGuide/index.html)
問題の箇所
調査すると、(予想通りだが)CFBundleGetMainBundle関数の戻り値が、プラグインではなくiTunesのディレクトリを指すためスクリプト・ファイルの検索失敗となっている模様。
CFBundleGetMainBundleの内容
file://localhost/Applications/iTunes.app/
バンドルのAPIを調べて、プラグインのディレクトリを取るようにしないと。
最近のコメント