トップ 一覧 検索 ヘルプ RSS ログイン

Palm OS Programmer's Companion Volume I/14-3の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
[[← 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]]