TB45 - 冗長的な GetMenu の呼び出し
(1998 年 12 月 17 日)
Q: 『Inside Macintosh』では、特定のメニューに対して GetMenu を 1 度だけ呼び出すように警告していますが、なぜですか。実際、このようなコードを偶然書いたことはあるのですが、通常のストレスツールを使ってフィールドの内容をテストしたところ、特に問題はなかったと記憶しています。
A: GetMenu は 'MENU' リソースをロードし、メニュー定義関数リソース ('MDEF') ID を使って適切な 'MDEF' をロードして、'MDEF' へのハンドルを MenuHandle の内部に格納します。
オリジナル (64K) の ROM (これは Mac 128 および 512 にのみ搭載されていました) には、メニューがそれ以前にロードされているかどうかを GetMenu がチェックしないという問題があり、'MENU' レコードの上位バイトがロードする 'MDEF' の ID を保持していると考えられていましたが、実際には、この ID は 'MDEF' へのハンドルの上位バイトに格納されていました。
この問題は 128K ROM (Mac Plus および 512Ke) およびそれ以降のすべてのシステムでは解決されています。アプリケーションを 128K または 512K Macintosh で実行する必要がなければ (まさかそんな必要があるとも思えませんが)、GetMenu を繰り返し呼び出しても特に問題はありません。
結局、現在では GetMenu を繰り返し呼び出しても安全なのですが、長い目で見れば、おそらく賢明な方法とはいえません。Mac OS API の将来のバージョンでは、アプリケーションに変更されたリソースハンドルではなく、リソーステンプレートに基づいた新しいハンドルを返すように変更が加えられる可能性もあります。このため、現在はクラッシュの危険がない場合でも、機会があれば、冗長的な GetMenu の呼び出しを避けるようにコードを改訂しておくことをお勧めします。
-- Pete Gontier
Worldwide Developer Technical Support
|