[[← 2 節に戻る|Palm OS Programmer's Companion Volume I/14-2]] [[↑14 章トップへ|Palm OS Programmer's Companion Volume I/14]] [[4 節に進む →|Palm OS Programmer's Companion Volume I/14-4]] ---- !!!14-3 ARM ネイティブサブルーチンの呼び出し   68Kアプリケーションから ARM ネイティブのサブルーチンをコールするには、新しい関数 PceNativeCall を使用します。 PceNativeCall 関数は2つの引数をとります。 +ARM ネイティブ関数のポインタ。これは通常はコードリソースに保存されています。ARM ネイティブサブルーチンがリソースに保存されている場合、68Kアプリケーションは単純に DmGetResource を使用してリソースを取得し、MemHandleLock を使用してそのリソースをロックすることで ARM ネイティブサブルーチンのポインタを取得できます。 +データブロックを指すポインタ。これにより、68Kアプリケーションは ARM ネイティブサブルーチンとデータを交換することができます。 PceNativeCall をコールする前に、プロセッサタイプを確認する必要があります。 *プロセッサが ARM の場合、68Kアプリケーションから ARM 関数をコールします。 *プロセッサが x86 ファミリの(つまり、アプリケーションはWindows上の Palm OS シミュレータ上で動作している)場合、68Kアプリケーションは ARM 関数を代替する Windows DLL をコールします。 *上記以外の場合、68Kアプリケーションは関数の68Kバージョンをコールするか、あるいはその機能を68Kアプリケーションに合理的に組み込むことができなければ体良く失敗します。この例は、アプリケーションが Palm OS Garnet よりも前のバージョンでも動作するという前提です。 リスト 14.1 にこのプロセスを示します。わかりやすさのために、この例では ARM 関数にはパラメータを渡していません。 !リスト 14.1 ARM 関数のコール static UInt32 PceNativeResourceCall(DmResType resType, DmResID resID, char *DLLEntryPointP, void *userCPB) { UInt32 processorType; MemHandle armH; MemPtr armP; UInt32 result; // get the processor type FtrGet(sysFileCSystem, sysFtrNumProcessorID, &processorType); if (sysFtrNumProcessorIsARM(processorType)){ // running on ARM; call the actual ARM resource armH = DmGetResource(resType, resID); armP = MemHandleLock(armH); result = PceNativeCall(armP, userCPB); MemHandleUnlock(armH); DmReleaseResource(armH); } else if (processorType == sysFtrNumProcessorx86) { // running on Simulator; call the DLL result = PceNativeCall((NativeFuncType *)DLLEntryPointP, userCPB); } else { // some other processor; fail gracefully ErrNonFatalDisplay("Unsupported processor type"); result = -1; } return result; } 各種のプロセッサタイプのための( 全て sysFtrNumProcessor〜 で始まる名前の )#define が SystemMgr.h で定義されています。   ---- [[← 2 節に戻る|Palm OS Programmer's Companion Volume I/14-2]] [[↑14 章トップへ|Palm OS Programmer's Companion Volume I/14]] [[4 節に進む →|Palm OS Programmer's Companion Volume I/14-4]]