Contextual Menu PlugIn for Mac OS X (2002/12/31)
MacTech の記事に触発され、Mac OS X 用の Contextual Menu PlugIn を作ってみることを思い立ちました。ぶっちゃけた話、かつて作った MacOS 7.6〜9.x 上で動作する FSSpecCMMPlugIn の移植をしてみよう、と思ったわけです。
まぁ当初から Mac OS X 上では FSSpecCMPlugIn は殆ど役に立たないとは思ってはいましたが、やっぱり役に立ちませんでしたね。まず Carbon では FSSpec ではなくて FSRef を使うこと、Full Path や Touch の機能は Terminal があれば事足りますし。
Full Path を取得する方法も、従来の方式では /Volumes を含む正確な Full Path は取得出来ないみたいです。Carbon では FSRefMakePath() を使えば取得できるのですが、これは全 Path 名の長さに制限があるみたいですし。旧来の MacOS 用では完全無制限に動作したのですが、今回は1つのパスの長さは 1024 文字までに制限することにしました。無念。
成果物は近いうちにここで公開する予定です。
Contextual Menu PlugIn の作り方自体はおおよそ理解できたので、その時の作業内容を私自身の備忘録として、そしてこれから Contexutual Menu PlugIn を作ろうという人の参考になればと思い、作成方法を書いてみました。大抵の場合コード自体は見れば何をすれば良いかわかるのに対し Project の設定はわかりづらいと思うのでその辺を中心に書いてみました。
みなさんのご参考になれば。。。
■プロジェクトの作成■
■Info.plist の情報の修正■
(中略) ▼ CFPlugInFactories 辞書 X 1 キー/値ペア(グレー表示) XXXXXXXX-XXXX-XXXX-XXXX.... 文字列 X MyFactoryFunction ▼ CFPlugInFactories 辞書 X 1 キー/値ペア(グレー表示) ▼ 2F6522E9-3E66-11D5-80A7.... 配列 X 1 個の順序付きオブジェクト(グレー表示) 0 文字列 X XXXXXXXX-XXXX-XXXX-XXXX.... CFPlugInUnloadFuntion 文字列 X
■ビルドの設定の修正■
■Framework の追加■
■ソースの修正■
// 12345678-9ABC-DEF0-1234-56789ABCDEF0 #define kMyFactoryFunctionID (CFUUIDGetConstantUUIDWithBytes( NULL, 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0, 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0 ) )
typedef struct myCMPlugInType myCMPlugInType;
struct myCMPlugInType
{
ContextualMenuInterfaceStruct *myCMInterfaceTable;
CFUUIDRef factoryID;
UInt32 refCount;
PrivateDataType *privateDataBuf;
UInt32 privateObjCount;
};
ただ、Contextual Menu から Dialog を出すと OK ボタンをクリックした後に Finder が異常終了することがあるみたいです。何が悪いのかなぁ?詳しくはわかりません。
以上