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