スクリプトガイド > JMPの拡張 > ダイナミックリンクライブラリ(DLL)
公開日: 11/25/2021

ダイナミックリンクライブラリ(DLL)

メモ: 64ビット版のJMPは32ビットDLLがロードできません。32ビットDLLは、あらかじめ64ビット版でロードできるように再コンパイルしておく必要があります。

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

ArgReturnsのtype引数には次のいずれかを指定します。

表14.2 ArgおよびReturnsの種類

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が終了してしまう可能性があります。

次の例は、DLLに含まれているnetPresentValueという関数が、4つのパラメータを取っている場合の例です。Declare Function()でこれらのパラメータと関数が戻すデータのタイプを定義することにより、JMPが関数を呼び出せるようにしています。

 
xftdll = Load Dll( "c:\ExtFunctionTests\ExtFunctionTests_x64.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 ]
);

その他のDLLメッセージ

Show Functionsメッセージは、Declare Functionで宣言された関数をすべてログに送ります。

dll_obj << Show Functions;

独自のDLLを作成するときには、DLL内にJSLの関数宣言スクリプトを用意しておくことができます。Get Declaration JSLメッセージは、DLL内の関数宣言スクリプトをログに送ります。

dll_obj << Get Declaration JSL;
より詳細な情報が必要な場合や、質問があるときは、JMPユーザーコミュニティで答えを見つけましょう (community.jmp.com).