高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A OV03
Detecting Classic and Carbon X Environments




Q: 開発中のアプリケーションの一部の機能は Classic 環境でうまく動作しません。一部の機能が使えなくなることをユーザに知らせることができるように、Classic 環境を検出するにはどうすればいいですか?

A: Classic 環境は、「リスト 1.」に示すように Gestalt を使って検出できます。

// この Q&A の執筆時点で、Universal Interfaces の最新バージョンは
// 3.3.2。以下の定義は UI 3.3.2 には含まれていないが、
// 次のリリースバージョンには含まれる予定。

enum {
    gestaltMacOSCompatibilityBoxAttr = FOUR_CHAR_CODE('bbox'),
                /* Classic の存在と機能 */
    gestaltMacOSCompatibilityBoxPresent = 0,                    
                /* Classic で実行されている場合は true */
    gestaltMacOSCompatibilityBoxHasSerial = 1,                  
                /* Classic シリアルサポートが実装されている場合は true */
    gestaltMacOSCompatibilityBoxless = 2                        
                /* ボックスレス (Carbon/Cocoa と共有されるスクリーン)
                   の場合は true */
};

static Boolean RunningOnClassic(void)
{
    UInt32 response;
    
    return (Gestalt(gestaltMacOSCompatibilityBoxAttr, 
                    (SInt32 *) &response) == noErr)
                && ((response & 
                    (1 << gestaltMacOSCompatibilityBoxPresent))
                    != 0);
}

リスト 1. アプリケーションが Classic 環境で実行されているかどうかを検出する

Q: 開発中の Carbon アプリケーションはトラディショナル Mac OS では適切に動作しますが、Mac OS X では一部の機能がうまく動作しません。プラットフォームに応じて適切な方法で動作できるように、アプリケーションが Mac OS X で実行されていることを検出するにはどうすればいいですか?

A: DTS では、プラットフォーム全体ではなく、特定の機能を対象にテストを行うことをお勧めしています。たとえば、アプリケーションがトラディショナル Mac OS 上の非 Carbon API へのアクセスを必要とする場合は、GetSharedLibrary および FindSymbol を使って、それらの API にアクセスすることをお勧めします。GetSharedLibrary を呼び出したが失敗した場合は、プラットフォームに関係なく、目的の機能にはアクセスできません。

一方、適切な機能テストが存在せず、プラットフォームのテストだけが可能なケースも知られています。このような場合、Carbon アプリケーションでは「リスト 2.」に示すように Gestalt を使用して、それが Mac OS X 上で実行されているかどうかを検出できます。

static Boolean RunningOnCarbonX(void)
{
    UInt32 response;
    
    return (Gestalt(gestaltSystemVersion, 
                    (SInt32 *) &response) == noErr)
                && (response >= 0x01000);
}

リスト 2. Carbon アプリケーションが Mac OS X で実行されているかどうかを検出する

更新日:2001 年 1 月 16 日

Choose your language: