あまつぶ

9.23【非同期で起動する】

 Mozilla 0.9.4をしばらく使ってみている。起動した時にいつもNavigatorのウィンドウが出てきてしまうこと以外は満足していたのだが、ファイルをダウンロードした時に名前が妙な文字列に化けてしまうという問題が発生したため。エンコードされたファイルなら、デコードした時点でふつうの名前に戻ってくれるから大丈夫だが、「〜.sit」の形のファイルをダウンロードした時など、なんのファイルだったのかさっぱりわからなくなってしまうし。
 表示速度はけっこう快適だ。上に書いた問題が解決されれば(いや、これは仕様なのかも知れないが)メインでもつかえそうな感じ。あ、そうだ。なぜか、タイトルに「〜」が入っているブックマークがうまく表示されない。しかたがないので、「ー」あるいは「 」に置き換えて使っている。なんでだろ。ちなみに、ブックマーク、IE5のFavoriteと同じフォーマットだが、IE5ではユニコードで保存されているようなのでそのままでは使えない。やられた。
 次は、Netscape Communicator 6.1を試してみようと思う。

 PhutのClassic版で、パッケージ化されたアプリケーションを起動できないという問題があった。AppleWorks以外のパッケージアプリケーションというものを見たことがないが、自分でも不便なので対応することに。
 パッケージの本体がどこにあるのかというのはどうやって調べるのだろう。確か、前に読んだドキュメントには、パッケージの直下にあるエイリアスが本体の位置をあらわしているということだった。ということは、パッケージの中でファイルタイプがadrpのファイルを探せばいいということか。見つかったら、そのエイリアスを解決して、本体を見つけてやればいい。また、Process Managerで取得できるアプリケーションの位置は、この本体のものと一致するらしい(これはPopStick(ベクタア14557丁目)にて調べた)。
 そういえば、CarbonLib SDKに、Package Toolというサンプルがあった。この中に参考になるコードはないか……と探すと、PackageUtils.cというファイルに、IdentifyPackage()という、まさに望んでいた関数を発見。流れは、思ったとおり、まずパッケージかどうか(kHasBundleビットが立っているかどうか)を調べ、パッケージであれば直下のエイリアスを探す(さっきはアプリケーションに的をしぼっていたのでファイルタイプがadrpと書いたが、このソースではファイルのフラグを調べている)。見つかればエイリアスの元ファイルを探す。
 エイリアスの解決部分では、ユーザインタラクションが可能でない場合のことを考慮する必要があるかも知れない。そのあたりのことは、前に書いたとおり

 Carbon Mach-O版では、登録したアプリケーションをクリックして起動させた時に他の操作ができなくなってしまうという問題があった。これは、LaunchApplication()を使って起動させていたため、どうしようもなかったのだが、特にClassicアプリケーションを立ち上げた場合など、非常にストレスがたまる。せっかくのマルチタスクがいかされていないようで。
 Xには、Launch Servicesというものが存在する。聞いて名のとおり、アプリケーションを起動させるもので、これを使えば、アプリケーションを非同期で(つまり、Phutの動作は止まることなく)起動させることができる。Xでしか使えないのが難点だが(CarbonLib 1.xではサポートされないと書かれている)、使ってみるべし。
 アプリケーションを起動させるだけなら、LSOpenFSRef()を使う。第一パラメータには起動させたいアプリケーションのFSRefを、第二パラメータは起動したアプリケーションのFSRefが返ってくる(第一パラメータで書類を指定した場合などに使うのだろう)が、必要無ければNULLを指定する。FSRefは、FSSpecからであればFSpMakeFSRef()を使って得ることができる。
 書類をアプリケーションを指定して開く場合、また、各種オプションを使いたい場合などは、LSOpenFromRefSpec()を使う。第二パラメータは先ほどと同じだが、第一パラメータにはLSLaunchFSRefSpecという構造体を使用する。ここで、起動させるアプリケーション、開くファイルのリスト、オプションなどを指定する。ふつうに書類を開くだけなら、アプリケーションと書類の数、書類のリストを指定し、オプションはデフォルト(kLSLaunchDefaults)を使うことになるだろう。

 というところで、今日のToolbox。前回は……、00.2.29?? MacOS X 10.0以降。

pascal OSStatus  LSOpenFSRef
          (const FSRef    *inRef,
           FSRef       *outLaunchedRef);

アプリケーション、あるいは書類を開く。

返り値      エラー。
inRef       起動したいアプリケーション、あるいは開きたい書類。
outLaunchedRef  起動したアプリケーション。NULL可。

#include  <LaunchServices.h>



pascal OSStatus  LSOpenFromRefSpec
          (const LSLaunchFSRefSpec *inLaunchSpec,
           FSRef          *outLaunchedRef);


アプリケーション、あるいは書類を開く。LSOpenFSRef()よりも細かい指定が可能。

返り値      エラー。
inLaunchSpec   起動したいアプリケーション、書類の指定。
outLaunchedRef  起動したアプリケーション。NULL可。

#include  <LaunchServices.h>



struct LSLaunchFSRefSpec {
    
const FSRef *appRef;
    UInt32     numDocs;
    
const FSRef   *itemRefs;
    
const AEDesc  *passThruParams;
    LSLaunchFlags  launchFlags;
    
void      *asyncRefCon;
};

LSOpenFromRefSpec()で使用するパラメータ。

appRef      起動するアプリケーション。NULL可。
numDocs      開く/印刷する書類の数。NULL可。
itemRefs     開く書類のリスト。
passThruParams  アプリケーションに渡すパラメータ。NULL可。
launchFlags    アプリケーションを起動させる時のフラグ。(デフォルトはkLSLaunchDefaults)
asyncRefCon    非同期で開く時に使用するパラメータ。NULL可。


 次回は、未定。

September 16, 2001 ↑ September index → September 30, 2001