本文描述了在3dsMax插件开发中必需的函数,同时也介绍了在每一个插件中必需的对象Descriptor。3ds Max的插件采用的是动态链接库(DynamicLinkLibraries)的方式实现的,动态链接库可以让多个程序共享它的代码、数据和资源。

  • 初始化函数

DllMain()这个函数是Windows系统用来出事化DLL的钩子(hook),当DLL加载的时候,Windows会首先调用这个函数。DLLMain函数并没有做什么特别的事情,它只是用来保持这样一个DLL实例对象。如果在DLL_THREAD_ATTACH和DLL_THREAD_DETACH的时候没有特别的操作,可以调用DisableThreadLibraryCalls()。

如果需要在DLL初始化的时候进行特殊的操作,可以实现LibInitialize()函数,同样如果需要在清除DLL的时候进行某些操作,可以在LibShutdown()函数中实现。

DllMain函数的原型如下:

BOOL WINAPI DllMain(HINSTANCE hinstDLL,ULONG fdwReason,LPVOID lpvReserved)

这个函数在DLL加载的时候或者某些特殊的时候(如渲染场景)被系统调用,下面是一个简单的DllMain函数的实现:

HINSTANCE hInstance;/** public functions **/
BOOL WINAPI DllMain(HINSTANCE hinstDLL,ULONG fdwReason,LPVOID lpvReserved) {switch(fdwReason) {case DLL_PROCESS_ATTACH:hInstance = hinstDLL;DisableThreadLibraryCalls(hInstance);break;}<pre name="code" class="cpp">const TCHAR* LibDescription()

return(TRUE);} 注意:在DllMain中不可以抛出异常

LibInitialize函数的原型如下:

int LibInitialize(void);

这个函数允许你在进程中开始使用DLL之前做一些特殊的初始化操作

LibShutdown函数的原型如下:

int LibShutdown(void);

这个函数在3ds Max结束使用DLL之后被调用

  • 3ds Max用来将插件分类的函数

以下一些函数用来描述插件中的属性信息

  1. LibDescription()           返回字符串标识该插件不可用(如:3dMax中根本就没有该插件)
  2. LibNumberClasses() 返回DLL中类的个数
  3. LibClassDesc()           返回指向Descriptor类的指针
  4. LibVersion()                  允许系统处理老版本的DLL插件

下面详细阐述上述的几个函数

const TCHAR* LibDescription()

设想这样一种情况:3dMax文件在A的计算机上生成,A的计算机里面有一个他自己写的3ds插件,在生成3dsMax文件的时候他用到了他写的插件,于是他的max文件中就包含着一个他自己写的实体,但是这个实体B的电脑上却没有,因为B的电脑中的Max软件中并没有A写的插件,于是就出现这样一个问题:当A把自己的Max文件共享给B的时候,B用他自己的3dMax软件打开,但是这种情况下他应该加载不了这个Max文件的全部实体(因为A并没有把他的插件给B),于是这种情况下系统会报错,提示B缺少xx插件。以上场景就是我们这个函数的应用场合,我们使用LibDescription写下字符串,让B在加载的时候看到这样一个提示信息,这样他就会去找A要回A使用的插件。

缺少插件支持的实体被称为orphaned entities(孤实体)

int LibNumberClasses()

当3dMax启动的收,它会寻找DLL进行加载,当寻找到一个的时候,它需要知道这个DLL中有多少个插件类,程序员需要提供这样一个信息给3dMax。

ClassDesc* LibClassDesc(int i)

该函数用来获取DLL中第i个插件类的信息(在一个DLL中不止有一个Plugin-class),示例代码如下:

__declspec(dllexport) ClassDesc *LibClassDesc(int i) { switch(i) { case 0: return &MeltCD; case 1: return &CrumpleCD; default: return 0; } }

注意参数i的取值是从0开始的,0代表第一个,以此类推

ULONG LibVersion()

返回3dsMax插件的版本信息,以帮助3dMax实现插件是否加载

3dsMax 2009插件开发---插件中必需的DLL函数相关推荐

  1. 在C#中调用一个dll函数,其中有个参数为 hdc,如何在C#中得到这个值并传给这个参数呢?

    用IntPtr类型,Hdc一般是指绘图设备句柄,用Graphics的成员方法GetHdc获得,Graphics可以用静态方法FromHwnd创建某个窗体的绘图器,把某个窗体的Handle传给他就可以了 ...

  2. Zed-Unity插件中代码注释——ZEDManager.cs

    文章目录 Zed Unity 插件中的代码注释 引言 ZEDManager.cs Zed Unity 插件中的代码注释 引言 Zed真是一个精品商品,提供的api的解释真的很齐全. 代码的可读性很高. ...

  3. 编写OD插件将IDA中分析出来的函数名导入到OD中

    逆向程序的时候,喜欢用IDA静态分析,用OD动态调试,如果把IDA分析出来的函数名称都导入到OD中,调试的时候就知道哪些函数不需要再看了.以前我一直用GODUP的map loader,但是有些时候感觉 ...

  4. 使用Dependency Walkers来检查exe文件中缺少的dll

    在Windows世界中,有无数块活动的大陆,它们都有一个共同的名字--动态链接库.现在就让我们走进这些神奇的活动大陆,找出它们隐藏已久的秘密吧! 初窥门径:Windows的基石 随便打开一个系统目录, ...

  5. ESFramewor使用技巧(2)-- 在插件中使用NHibernate

        我们来讨论一下这种情景,你采用基于ESFramework的4层架构进行应用开发,你分析用户的需求,并将其分类整理为几大块,考虑每一块使用一个功能插件来完成.在这几个插件中,有个插件需要访问某个 ...

  6. 【转载】ESFramewor使用技巧(2)-- 在插件中使用NHibernate

    ESFramewor使用技巧(2)-- 在插件中使用NHibernate     我们来讨论一下这种情景,你采用基于ESFramework的4层架构进行应用开发,你分析用户的需求,并将其分类整理为几大 ...

  7. confluence添加用户_玩转Confluence插件开发插件模块配置文件介绍(04)

    上一章节我们介绍了测试模块的配置文件,这一章节我们介绍插件本身的配置文件,这个是我们部署插件真正用到的. 文件的位置位于项目主目录中的/src/main/resources目录中. 插件配置文件介绍 ...

  8. Snipaste在Window运行后遇到提示计算机中丢失 api-ms-win-crt-runtime-l1-1-0.dll 错误

    故障排除 以下为运行 Snipaste 可能遇到的错误及其解决方案. Windows 运行后遇到提示计算机中丢失 api-ms-win-crt-runtime-l1-1-0.dll 错误 请根据你操作 ...

  9. devenv.exe - 系统错误无法启动此程序,因为计算机中丢失 MSVCR100.dll。尝试重新安装该程序以解决此问题。【解决办法】...

    今天不知道安装了什么软件(我怀疑是安装了工商银行网上银行的那个安全插件导致的,因为这已经是第二次了,第一次我没解决了,重做的系统),破坏了系统文件,打开VS2010的时候,弹出如下错误: C:\Win ...

最新文章

  1. 68位高考状元真实身份曝光:最好的教育,是拼爹!
  2. springmvc学习及源码地址
  3. MATLAB之界面介绍
  4. gnome3.2 安装体验
  5. Python高级特性: 12步轻松搞定Python装饰器
  6. 华为屏下前置摄像头专利曝光:消灭刘海
  7. 搜索引擎技术在仿冒网站检测中的应用
  8. 用u盘装linux系统的操作全程图解,笔者教你用u盘装系统的操作全程图解
  9. 联想K31笔记本完全拆解,装不回去了。想做个电视机或者显示器
  10. JavaScript操作DOM对象 Day05
  11. 1.1 电阻 RES Resistance
  12. 回车、换行、空格的ASCII码值
  13. LinkedList的常用方法
  14. Unix C语言编写基于IO多路复用的小型并发服务器
  15. 开发中,常用到的Eclipse的快捷键
  16. vue-cli 组件传值:父传子props
  17. Allwinner A33/A31 FrameWare基本配置
  18. 基于图像处理的水果品质检测方法的研究任务书
  19. WEBDisk网络硬盘
  20. 传统网络游戏(偏重MMORPG)的模块划分

热门文章

  1. 最小生成树、最大流、最小费用最大流问题精简
  2. 2019阿里云大数据最新技术发布
  3. 读养生四要有感《却疾篇》
  4. 缅怀那些正渐行渐远的编程语言
  5. Python-字典练习(随机生成银行卡卡号)
  6. getattr() 函数用法
  7. 路由器的基本工作原理概述
  8. 顺序表和单链表基本操作的实现
  9. Python对图像进行分块及复原
  10. css六边形插入图片蜂巢幻灯代码,纯css绘制蜂巢六边形效果