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

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

注: 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

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

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;

その他の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).