Scripting Guide > Extending JMP > Dynamic Link Libraries (DLLs)
Publication date: 08/13/2020

Dynamic Link Libraries (DLLs)

Note: 64-bit JMP cannot load 32-bit DLLs. You must recompile a 32-bit DLL for JMP to be able to load it.

You can extend JMP functionality by using JMP Scripting Language (JSL) to load a DLL and call functions exported by that DLL. There is one JSL command and six messages that implement this functionality.

dll_obj = Load DLL("path" <, AutoDeclare(Boolean | Quiet | Verbose) |Quiet | Verbose > )

Load DLL() loads the DLL in the specified path. Use the AutoDeclare(Quiet) argument to suppress log window messaging.

Use the Declare Function message to declare a function that is defined in the DLL.After you declare the function, you can call it.

dll_obj <<Declare Function("name", Convention(named_argument), Alias("string"), Arg(type, "string"), Returns(type), other_named_arguments)

The Alias defines an alternate name that you can use in JSL. For example, if you declared Alias("MsgBox") for a function that is named "Message Box" in the DLL, then you would call it as follows:

result = dll_obj <<MsgBox(...)

The named arguments for Convention are as follows:

STDCALL or PASCAL

CDECL

The type argument for both Arg and Returns can be one of the following:

Table 14.2 Types for Arg and Returns

Int8

UInt8

Int16

UInt16

Int32

UInt32

Int64

UInt64

Float

Double

AnsiString

UnicodeString

Struct

IntPtr

UIntPtr

ObjPtr

See Dynamic Link Libraries (DLLs) in the JSL Syntax Reference for the Declare Function message arguments.

Finally, use the UnLoadDLL message to unload the DLL:

dll_obj << UnLoadDLL

Note: Refer to the documentation for that function provided by the DLL author when you declare a function. If the argument types and calling convention declared do not match the actual function in the DLL, calling the function could cause JMP to terminate.

Examples

Suppose that you want the script to load a Windows 32-bit DLL or a 64-bit DLL based on the user’s computer. This example tests for the Windows operating system and then the computer processor’s bit level.

If( Host is( "Windows" ),
			// load DLL
			dll_obj = Load DLL( "c:\Windows\System32\user32.dll" ),
			// if DLL is found, stop execution
			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,
		"Here is a message from JMP.",
		"Call DLL",
		321
	);
	Show( result );
dll_obj << UnLoadDLL

In the following example, the DLL contains a function named netPresentValue, which takes four parameters. Declare Function() defines these parameters and the data type that the function returns so that JMP can successfully call the function.

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" ), // use this name to call the function in JMP
	Arg( Double, "discount rate" ),
	Arg( Double, "cash flows per period" ),
	Arg( Int32, "number of cash flows" ),
	Arg( Double, Array, "array of cash flow values" ),
	Returns( Double )
);
 
result = xftdll << npv( 0.10, 1, 10, [ 100, 100, 100, 100, 100,
	100, 100, 100, 100, 100 ]
);
 
Show( result );

result = 675.902381627515;

Other DLL Messages

The Show Functions message sends any functions that have been declared using Declare Function to the log:

dll_obj << Show Functions;

If you are writing your own DLL, you can create functions in it using JSL. The Get Declaration JSL message sends any JSL functions in your DLL to the log:

dll_obj << Get Declaration JSL;
Want more information? Have questions? Get answers in the JMP User Community (community.jmp.com).
.