zoukankan      html  css  js  c++  java
  • 手动创建Max插件项目未完成

    写这个帖子是因为我使用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;
    }

  • 相关阅读:
    linux file命令小记
    利用actionscript访问wfs服务
    在C/C++中static有什么用途?(请至少说明两种)
    单元测试、集成测试、系统测试的侧重点是什么?
    测试计划工作的目的是什么?测试计划文档的内容应该包括什么?其中哪些是最重要的?
    简述什么是静态测试、动态测试、黑盒测试、白盒测试、α测试 β测试
    一台客户端有三百个客户与三百个客户端有三百个客户对服务器施压,有什么区别?
    BUG管理工具的跟踪过程(用BugZilla为例子)
    软件测试分为几个阶段 各阶段的测试策略和要求是什么?
    软件质量保证体系是什么 国家标准中与质量保证管理相关的几个标准是什么?他们的编号和全称是什么?
  • 原文地址:https://www.cnblogs.com/sitt/p/1813261.html
Copyright © 2011-2022 走看看