DLL Setup (SDK)

3DS Max Plug-In SDK

DLL Setup (SDK)

MAXScript plug-in extensions are packaged as Win32 DLL's in almost exactly the same way as standard MAX plug-ins. They are named with a specific suffix to fit in with the MAX plug-in naming scheme (.DLX) and should be installed in one of the MAX plug-in directories. MAXScript looks for and loads all the *.DLX files it finds in the MAX plug-in directories.

You should be familiar with the section on MAX plug-in construction in the MAX SDK documentation because the following notes primarily describe what is different about setting up MAXScript plug-ins.

The plug-in's external interface is defined with a .DEF file, as are MAX plug-ins, but in this case there are only three entry points:

LIBRARY <plugin_name>

EXPORTS

LibDescription @1 

LibInit @2 

LibVersion @3 

SECTIONS

.data READ WRITE 

The LibDescription and LibVersion entry points are the same as for MAX plug-ins. The LibInit entry is called by MAX after MAXScript has loaded itself and all its .DLX plug-ins so that each can perform any runtime initialization. MAXScript is fully functional at the time these init functions are called.

The following code shows a typical DLX entry point implementation (this is from sample.cpp in the SDK). All of the required headers are included by the master header file, MAXscrpt.h, including Max.h for MAX SDK-related code.

#include "MAXScrpt.h"

 

HMODULE hInstance;

 

BOOL APIENTRY

DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)

{

static BOOL controlsInit = FALSE; 

switch (ul_reason_for_call) 

case DLL_PROCESS_ATTACH: 

// Hang on to this DLL's instance handle. 

hInstance = hModule; 

if (!controlsInit) 

controlsInit = TRUE; 

// Initialize Win95 controls 

InitCommonControls(); 

break; 

return(TRUE); 

}

 

__declspec( dllexport ) void

LibInit()

{

// do any setup here. MAXScript is fully up at this point. 

}

 

__declspec( dllexport ) const TCHAR *

LibDescription()

{

return _T("Sample MAXscript DLX");

}

 

__declspec( dllexport ) ULONG

LibVersion()

{

return VERSION_3DSMAX;

}

 

If any Win32 common controls or MAX custom controls are to be used in the DLL, you should initialize them during process attach, in the same way you would in a MAX DLL. For the LibVersion entry point, you should return the current 3DSMAX version as shown.