注: 64ビット版のJMPは32ビットDLLがロードできません。32ビットDLLをロードするためには、あらかじめ再コンパイルしておく必要があります。
JMPスクリプト言語(JSL)によって、DLLをロードし、そのDLLに含まれている関数を呼び出すことができます。DLLの呼び出しを行うJSL関数が1つと、メッセージが6つあります。
dll_obj = Load DLL("path" <, AutoDeclare(Boolean | Quiet | Verbose) |Quiet | Verbose > )
Load DLL()は、パス(path)で指定されたDLLをロードします。ログウィンドウにメッセージが表示されないようにするには、AutoDeclare(Quiet)引数を使用します。
DLLで定義される関数の引数や戻り値のタイプを宣言するには、Declare Functionメッセージを使用します。関数を宣言すると、呼び出せるようになります。
dll_obj <<Declare Function("name", Convention(named_argument), Alias("string"), Arg(type, "string"), Returns(type), other_named_arguments)
Aliasは、JSLで使用できる代替の名前を定義します。たとえば、DLL内の"Message Box"という関数に対して、Alias("MsgBox")を宣言した場合、その関数を次のようにも呼び出せるようになります。
result = dll_obj <<MsgBox(...)
Conventionの引数には、次のいずれかを指定します。
• STDCALLまたはPASCAL
• CDECL
ArgとReturnsのtype引数には次のいずれかを指定します。
Int8 |
UInt8 |
Int16 |
UInt16 |
Int32 |
UInt32 |
Int64 |
UInt64 |
Float |
実数(double) |
AnsiString |
UnicodeString |
Struct |
IntPtr |
UIntPtr |
ObjPtr |
Declare Functionメッセージの引数については、『スクリプト構文リファレンス』のダイナミックリンクライブラリ(DLL)を参照してください。
最後に、UnLoadDLLメッセージでDLLをアンロードします。
dll_obj << UnLoadDLL
注: 関数を宣言するときは、DLLの作成者によって提供された関数のマニュアルを参照してください。引数の種類や呼び出し方法がDLL内の実際の関数に合わない場合、JMPが終了してしまう可能性があります。
Windowsの32ビットDLLと64ビットDLLのうち、ユーザのコンピュータに応じて適切な方をロードするようなスクリプトを書きたいとします。この例は、Windowsオペレーティングシステムを確認し、次にコンピュータのプロセッサのビットレベルを確認します。
If( Host is( "Windows" ),
// DLLをロードする
dll_obj = Load DLL( "c:\Windows\System32\user32.dll" ),
// DLLが見つかった場合は実行を停止する
Throw
);
dll_obj <<Declare Function(
"MessageBoxW",
Convention( STDCALL ),
Alias( "MsgBox" ),
Arg( IntPtr, "hWnd" ),
Arg( UnicodeString, "message" ),
Arg( UnicodeString, "caption" ),
Arg( UInt32, "uType" ),
Returns( Int32 )
);
result = dll_obj << MsgBox(
0,
"JMPからのメッセージです。",
"DLLの呼び出し",
321
);
Show( result );
dll_obj << UnLoadDLL
次の例では、DLLに含まれているnetPresentValueという関数が4つのパラメータを取ります。Declare Function()が、これらのパラメータと関数が戻すデータのタイプを定義することで、JMPが関数を呼び出せるようにします。
If( HostIs( Bits64 ),
xftdll = Load Dll( "c:\ExtFunctionTests\ExtFunctionTests_x64.dll" ),
xftdll = Load Dll( "c:\ExtFunctionTests\ExtFunctionTests.dll" )
);
Show( xftdll );
xftdll << Declare Function(
"netPresentValue",
Convention( CDECL ),
Alias( "npv" ), // JMPでこの名前を使って関数を呼び出す
Arg( Double, "割引率" ),
Arg( Double, "期間あたりのキャッシュフロー" ),
Arg( Int32, "キャッシュフローの数" ),
Arg( Double, Array, "キャッシュフロー値の配列" ),
Returns( Double )
);
result = xftdll << npv( 0.10, 1, 10, [ 100, 100, 100, 100, 100,
100, 100, 100, 100, 100 ]
);
Show( result );
result = 675.902381627515;
Show Functionsメッセージは、Declare Functionで宣言された関数をすべてログに送ります。
dll_obj << Show Functions;
独自のDLLを作成するときには、DLL内にJSLの関数宣言スクリプトを用意しておくことができます。Get Declaration JSLメッセージは、DLL内の関数宣言スクリプトをログに送ります。
dll_obj << Get Declaration JSL;