现在的位置: 首页 > 综合 > 正文

手动创建Max插件项目–未完成

2012年12月10日 ⁄ 综合 ⁄ 共 4032字 ⁄ 字号 评论关闭

写这个帖子是因为我使用MaxSDK的插件向导出现错误,无法创建项目,而且看到MaxSDK的文档里也提到,插件向导可能会被取消或者不再维护。再者,插件向导并不能创建控制器插件。基于这种种原因,我决定还是手动创建一下,这样也会对一些东西了解得透彻些。

 

第一步
创建DEF文件,DEF文件是模块定义文件,是ASCII的txt文件,DLL文件需要DEF文件创建导入导出,下面是一个范例,可以将dll的名字改为自己项目的名字。

 

=========================DEF范例=========================
LIBRARY MyPlugIn.dll
EXPORTS
    LibDescription        @1
    LibNumberClasses    @2
    LibClassDesc        @3
    LibVersion        @4
SECTIONS
.data READ WRITE
=======================================================

第二步
编写DLL文件必须的函数。

DllMain()
这个函数会在windows装载一个DLL文件时调用。

LibNumberClasses()
这个函数返回在这个DLL文件中有多少个插件类。

LibClassDesc()
这个函数有一个整数参数,将会返回第几个插件的描叙,插件的描叙使用继承自ClassDesc2的类,参阅MaxSdk中的 Class Descriptors。

LibDescription()
这个函数返回一个关于这个DLL文件的描叙的字符串。

LibVersion()
这个函数返回当前的SDK版本,是一个在MaxSDK中定义的常量,通常只需要返回 Get3DSMAXVersion().

LibInitialize()
这个函数执行对DLL的初始化操作,如果返回TRUE代表初始化成功,否则将返回FALSE,并且对这个DLL使用FreeLibrary()以及发送一条消息。

LibShutdown()
在DLL文件卸载前调用。

下面是源自MaxSDK文档的范例

=======================================================

HINSTANCE hInstance = 0;
 BOOL WINAPI DllMain(HINSTANCE hinstDLL,ULONG fdwReason,LPVOID /*lpvReserved*/)
{
    if( fdwReason == DLL_PROCESS_ATTACH )
    {    
        // Hang on to this DLL's instance handle.
        hInstance = hinstDLL;
        DisableThreadLibraryCalls(hInstance);
    } 
    return(TRUE);
}

__declspec( dllexport ) const TCHAR* LibDescription()
{
    // Retrieve astring from the resource string table
    static TCHAR buf[256];
    if (hInstance)
        return LoadString(hInstance, IDS_LIBDESCRIPTION, buf, sizeof(buf)) ? buf : NULL;
    return NULL;
}

__declspec( dllexport ) intLibNumberClasses()
{
    return 1;
}

__declspec( dllexport ) ClassDesc* LibClassDesc(int i)
{
  switch(i)
  {
      case 0:
          return GetSimpleWidgetDesc();
  }
  return 0;
}

__declspec( dllexport ) ULONGLibVersion()
{
  return Get3DSMAXVersion();
}

__declspec( dllexport ) intLibInitialize()
{
    // TODO: Perform initialization here.
    return TRUE;
}

 __declspec( dllexport ) intLibShutdown()
{
   // TODO: Perform uninitialization here.
   return TRUE;
}

=======================================================

第三步
添加资源脚本(Resource Script ,RC文件)
资源脚本定义DLL文件中用到的资源,比如字符串、对话框等。
在资源文件中需要include两个文件。veroverrrides.h 和 maxversion.r
veroverrrides.h是每一个项目要包含的文件,可以在这里重载公司名称等信息,需要在maxversion.r 之前include。
maxversion.r 定义在MaxSDK中。
资源脚本的更多资料在 http://msdn.microsoft.com/en-us/library/7zxb70x7.aspx.

添加 String Table,这个是为了方便做本地化以及修改UI界面的。

第四步
设置头文件和库文件路径,
指定输出文件,Max使用不同的扩展名来定义不同类型的插件,集体信息参阅MaxSDK文档的AllPlug-in File Extensions。

 

 下面是简单范例的代码,没有头文件,也没有资源文件,实际上,也不算一个完整的max插件,因为其中的插件类是一个空类,def文件需要自己编辑。仅作为简单范例,后续我将完善成一个简单的导出。

Max插件范例

#include "Max.h"
#include
"iparamb2.h"
#include
"impexp.h"

#pragma comment(lib,"comctl32.lib")
#pragma comment(lib,"core.lib")
#pragma comment(lib,"paramblk2.lib")
#pragma comment(lib,"maxutil.lib")

#define SimpleCLASS_ID Class_ID(0xc2a1ee34, 0x832cc295)

HINSTANCE hInstance
= 0;

class SimpleExporter;
class SimpleExporterClassDesc;
ClassDesc2
* GetSimpleExporteClassDesc();

class SimpleExporter
{
//这里本应该是继承自SceneExport的类,因为这里是介绍最基本插件项目,故用一个空类代替
};


class SimpleExporterClassDesc: public ClassDesc2
{
public:
virtual int IsPublic() { return TRUE; }
virtual void* Create(BOOL loading) { return new SimpleExporter(); }
virtual const TCHAR * ClassName() { return TEXT("Simple Exporter");}
virtual SClass_ID SuperClassID() { return SCENE_EXPORT_CLASS_ID; }
virtual Class_ID ClassID() { return SimpleCLASS_ID; }
virtual const TCHAR* Category() { return TEXT("Simple Exporter

Category
"); }
virtual const TCHAR* InternalName() { return TEXT("SimpleExporter"); }
virtual HINSTANCE HInstance() { return hInstance; }
};

static SimpleExporterClassDesc expoertDesc;
ClassDesc2
* GetSimpleExporteClassDesc() { return &expoertDesc; }


BOOL WINAPI DllMain(HINSTANCE hinstDLL,ULONG fdwReason,LPVOID lpvReserved)
{
if( fdwReason == DLL_PROCESS_ATTACH )
{
hInstance
= hinstDLL;
DisableThreadLibraryCalls(hInstance);
}
return(TRUE);
}

__declspec( dllexport )
const TCHAR* LibDescription()
{
static TCHAR buf[256];
if (hInstance)
return TEXT("Simple LibDescription");
return NULL;
}

__declspec( dllexport )
int LibNumberClasses()
{
return 1;
}

__declspec( dllexport ) ClassDesc
* LibClassDesc(int i)
{
switch(i)
{
case 0:
return GetSimpleExporteClassDesc();
}
return 0;
}

__declspec( dllexport ) ULONG LibVersion()
{
return Get3DSMAXVersion();
}

__declspec( dllexport )
int LibInitialize()
{
return TRUE;
}

__declspec( dllexport )
int LibShutdown()
{
return TRUE;
}

 

抱歉!评论已关闭.