3dsMax 2009插件开发---插件中必需的DLL函数
本文描述了在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用来将插件分类的函数
以下一些函数用来描述插件中的属性信息
- LibDescription() 返回字符串标识该插件不可用(如:3dMax中根本就没有该插件)
- LibNumberClasses() 返回DLL中类的个数
- LibClassDesc() 返回指向Descriptor类的指针
- 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函数相关推荐
- 在C#中调用一个dll函数,其中有个参数为 hdc,如何在C#中得到这个值并传给这个参数呢?
用IntPtr类型,Hdc一般是指绘图设备句柄,用Graphics的成员方法GetHdc获得,Graphics可以用静态方法FromHwnd创建某个窗体的绘图器,把某个窗体的Handle传给他就可以了 ...
- Zed-Unity插件中代码注释——ZEDManager.cs
文章目录 Zed Unity 插件中的代码注释 引言 ZEDManager.cs Zed Unity 插件中的代码注释 引言 Zed真是一个精品商品,提供的api的解释真的很齐全. 代码的可读性很高. ...
- 编写OD插件将IDA中分析出来的函数名导入到OD中
逆向程序的时候,喜欢用IDA静态分析,用OD动态调试,如果把IDA分析出来的函数名称都导入到OD中,调试的时候就知道哪些函数不需要再看了.以前我一直用GODUP的map loader,但是有些时候感觉 ...
- 使用Dependency Walkers来检查exe文件中缺少的dll
在Windows世界中,有无数块活动的大陆,它们都有一个共同的名字--动态链接库.现在就让我们走进这些神奇的活动大陆,找出它们隐藏已久的秘密吧! 初窥门径:Windows的基石 随便打开一个系统目录, ...
- ESFramewor使用技巧(2)-- 在插件中使用NHibernate
我们来讨论一下这种情景,你采用基于ESFramework的4层架构进行应用开发,你分析用户的需求,并将其分类整理为几大块,考虑每一块使用一个功能插件来完成.在这几个插件中,有个插件需要访问某个 ...
- 【转载】ESFramewor使用技巧(2)-- 在插件中使用NHibernate
ESFramewor使用技巧(2)-- 在插件中使用NHibernate 我们来讨论一下这种情景,你采用基于ESFramework的4层架构进行应用开发,你分析用户的需求,并将其分类整理为几大 ...
- confluence添加用户_玩转Confluence插件开发插件模块配置文件介绍(04)
上一章节我们介绍了测试模块的配置文件,这一章节我们介绍插件本身的配置文件,这个是我们部署插件真正用到的. 文件的位置位于项目主目录中的/src/main/resources目录中. 插件配置文件介绍 ...
- Snipaste在Window运行后遇到提示计算机中丢失 api-ms-win-crt-runtime-l1-1-0.dll 错误
故障排除 以下为运行 Snipaste 可能遇到的错误及其解决方案. Windows 运行后遇到提示计算机中丢失 api-ms-win-crt-runtime-l1-1-0.dll 错误 请根据你操作 ...
- devenv.exe - 系统错误无法启动此程序,因为计算机中丢失 MSVCR100.dll。尝试重新安装该程序以解决此问题。【解决办法】...
今天不知道安装了什么软件(我怀疑是安装了工商银行网上银行的那个安全插件导致的,因为这已经是第二次了,第一次我没解决了,重做的系统),破坏了系统文件,打开VS2010的时候,弹出如下错误: C:\Win ...
最新文章
- 68位高考状元真实身份曝光:最好的教育,是拼爹!
- springmvc学习及源码地址
- MATLAB之界面介绍
- gnome3.2 安装体验
- Python高级特性: 12步轻松搞定Python装饰器
- 华为屏下前置摄像头专利曝光:消灭刘海
- 搜索引擎技术在仿冒网站检测中的应用
- 用u盘装linux系统的操作全程图解,笔者教你用u盘装系统的操作全程图解
- 联想K31笔记本完全拆解,装不回去了。想做个电视机或者显示器
- JavaScript操作DOM对象 Day05
- 1.1 电阻 RES Resistance
- 回车、换行、空格的ASCII码值
- LinkedList的常用方法
- Unix C语言编写基于IO多路复用的小型并发服务器
- 开发中,常用到的Eclipse的快捷键
- vue-cli 组件传值:父传子props
- Allwinner A33/A31 FrameWare基本配置
- 基于图像处理的水果品质检测方法的研究任务书
- WEBDisk网络硬盘
- 传统网络游戏(偏重MMORPG)的模块划分