あまつぶ

2.19 18:00 【LaunchApplication】

 昨日の続き。作成した'odoc'イベントを使ってアプリケーションを起動してファイルを開いてもらう方法。まずは、いきなりその部分のソースリスト。

LaunchParamBlockRec	launchParams;
AEDesc				launchParamDesc={typeNull,NULL};
FSSpec				resEditSpec;

/* ResEditを探す */
err=GetApplSpec(kResEditCreator,&resEditSpec);
if (err!=noErr) return;

/* なにかのProcessSerialNumberが必要なのでとりあえず自分自身のものを使う */
GetCurrentProcess(&psn);

err=MakeOpenDocumentEvent(&psn,theIconFile,&aeEvent);
if (err==noErr)
{
	/* できたAppleイベントをtypeAppParametersタイプのデスクリプタに変換 */
	err=AECoerceDesc(&aeEvent,typeAppParameters,&launchParamDesc);
	if (err==noErr)
	{
		HLock((Handle)launchParamDesc.dataHandle);
		
		/* launchParamsにパラメータを設定 */
		launchParams.launchBlockID		= extendedBlock;
		launchParams.launchEPBLength	= extendedBlockLen;
		launchParams.launchFileFlags	= launchNoFileFlags;
		launchParams.launchControlFlags	= launchContinue;
		launchParams.launchAppSpec		= &resEditSpec;
		launchParams.launchAppParameters= 
				(AppParametersPtr)*(launchParamDesc.dataHandle);
				
		err = LaunchApplication(&launchParams);
				
		HUnlock((Handle)launchParamDesc.dataHandle);
		err=AEDisposeDesc(&launchParamDesc);
	}
}


長いが、ポイントとなる部分は「AECoerceDesc」だけだ。ま、一応最初から解説していく。最初にいきなり「GetApplSpec」というルーチンを使用しているが、これはぼくが作ったもの。デスクトップデータベースを検索してResEditを探している。kResEditCreatorは、別の部分で'RSED'と定義されている。ま、見つかればnoErrを返し、resEditSpecにResEditの位置が入ると。
 ResEditが見つかったら、昨日書いたルーチンを呼んで'odoc'イベントを作ってもらうのだが、送信先に指定するアプリケーションがまだ立ち上がっていないのでProcessSerialNumberに指定するものがない。実際に作成したイベントはAESendで送るわけではなくてLaunchApplicationに渡すパラメータとして使用するだけだから、有効なものであればどのアプリケーションのものでも構わない。よってここでは自分自身のものを使うことにする(それが一番簡単だから)。
 'odoc'イベントが問題なく作成できたら、作成したイベントをLaunchApplicationに渡すために変換してやらないといけない。これにはAECoerceDescというルーチンを使い、昨日も書いたようにtypeAppParameters(='appa')タイプに変換してやる。「coerce」というのは「強制する」とかそんな意味らしい。
 変換も問題なく行えたら、変換したデータのハンドルをロックして(これはおそらくLaunchApplicationを呼ぶ際にメモリが移動させる可能性があるからだろう)LaunchApplicationに渡すパラメータを設定して、最後にLaunchApplicationを呼ぶ。そのあとは途中で確保したメモリを解放して終わり。
 LaunchApplicationに渡すパラメータについての説明は省略するが、ほとんどの場合このソースと同じようにすればいいかと思う。詳しいことが知りたい場合にはIMを読むなり他の本を探すなりすればすぐにわかると思うし。
 ここまでを覚えれば、簡単なラウンチャならすぐ作れる。アプリケーションの位置をエイリアスマネージャを使って管理する方法、リストをリストマネージャで管理する方法くらいは知っておく必要があるかと思うけど。あとはドラッグ&ドロップくらいは基本か(^^;; ま、Malphがちゃんと動いてくれるかぎりは作ろうとは思わないけど。

 過去ログがかなりたまってきたので、内容別のインデックスを作ってみた。ソースを載せた場所や、読む価値があるかも知れない場所などをリストアップしただけなんだけど、多少は役にたつかも知れない。ちょくちょく更新するのは面倒なので思い出した時に更新という感じにすると思うけど、もし最近ここを読みはじめたって方がいらっしゃったら、過去ログを全部読むのは大変だと思うんで見てみるといいかも。

to February 18, 1999 ↑ to February index → to February 23, 1999