autodesk在Max2012SDK文档中否决了卸载插件这一行为,认为他不够安全,容易导致软件崩溃,确实,如果已经存在依赖关系,然后卸载了这个库,会导致问题。不过这里只是自娱自乐的探索:)。下面的代码是写了一个MaxScript的函数来实现卸载插件以及列出当前插件的文件名。
需要说明一下的是 14000 是定义在pluginapi.h中的一个宏 MAX_RELEASE_R14 的值,也就是Max2012版本的版本号。
MaxSDK卸载DLL
def_visible_primitive(UnLoadPlugin, "UnLoadPlugin");
#if MAX_RELEASE < 14000
Value* UnLoadPlugin_cf(Value** arg_list, int count)
{
check_arg_count("UnLoadPlugin", 1, count);
TSTR inputDllName(arg_list[0]->to_string());
inputDllName.toUpper();
DllDir * theDllDir;
theDllDir = GetCOREInterface()->GetDllDirectory();
Value * result = &false_value;
for (int i = 0; i < theDllDir->Count(); ++i)
{
DllDesc * dll_desc = &(*theDllDir)[i];
if (dll_desc->loaded == true)
{
TSTR currentDllName = dll_desc->fname;
currentDllName.toUpper();
if (currentDllName == inputDllName)
{
for (int i = 0; i < dll_desc->NumberOfClasses(); ++i)
{
ClassDesc *class_desc = (*dll_desc)[i];
GetCOREInterface()->DeleteClass(class_desc);
}
dll_desc->Free();
dll_desc->loaded = false;
result = &true_value;
}
}
}
return result;
}
#else
Value* UnLoadPlugin_cf(Value** arg_list, int count)
{
check_arg_count("UnLoadPlugin", 1, count);
TSTR inputDllName(arg_list[0]->to_string());
inputDllName.toUpper();
DllDir * theDllDir;
theDllDir = GetCOREInterface()->GetDllDirectory();
Value * result = &false_value;
for (int i = 0; i < theDllDir->Count(); ++i)
{
const DllDesc * dll_desc(&(*theDllDir)[i]);
if (dll_desc->IsLoaded() == true)
{
TSTR currentDllName = dll_desc->GetFileName();
currentDllName.toUpper();
if (currentDllName == inputDllName && dll_desc->GetHandle() != 0)
{
for (int i = 0; i < dll_desc->NumberOfClasses(); ++i)
{
ClassDesc * class_desc = (*dll_desc)[i];
GetCOREInterface()->DeleteClass(class_desc);
}
result = &true_value;
FreeLibrary(dll_desc->GetHandle());
}
}
}
return result;
}
#endif
def_visible_primitive(GetPluginList, "GetPluginList");
#if MAX_RELEASE < 14000
Value* GetPluginList_cf(Value** arg_list, int count)
{
check_arg_count("GetPluginList",0, count);
one_typed_value_local(Array* rArray);
vl.rArray = new Array (0);
DllDir * theDllDir;
theDllDir = GetCOREInterface()->GetDllDirectory();
for (int i = 0; i < theDllDir->Count(); ++i)
{
DllDesc dll_desc = (*theDllDir)[i];
if (dll_desc.loaded )
{
Value * tempName = new String(dll_desc.fname);
vl.rArray->append(tempName);
}
}
return_value(vl.rArray);
}
#else
Value* GetPluginList_cf(Value** arg_list, int count)
{
check_arg_count("GetPluginList",0, count);
one_typed_value_local(Array* rArray);
vl.rArray = new Array (0);
DllDir * theDllDir;
theDllDir = GetCOREInterface()->GetDllDirectory();
for (int i = 0; i < theDllDir->Count(); ++i)
{
const DllDesc * dll_desc(&(*theDllDir)[i]);
if (dll_desc->IsLoaded() == true)
{
Value * tempName = new String(dll_desc->GetFileName());
vl.rArray->append(tempName);
}
}
return_value(vl.rArray);
}
#endif