MaxSDK中卸载插件的方法

autodesk在Max2012SDK文档中否决了卸载插件这一行为,认为他不够安全,容易导致软件崩溃,确实,如果已经存在依赖关系,然后卸载了这个库,会导致问题。不过这里只是自娱自乐的探索:)。下面的代码是写了一个MaxScript的函数来实现卸载插件以及列出当前插件的文件名。

需要说明一下的是 14000 是定义在pluginapi.h中的一个宏 MAX_RELEASE_R14 的值,也就是Max2012版本的版本号。

ContractedBlock.gif ExpandedBlockStart.gif 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

  

转载于:https://www.cnblogs.com/sitt/archive/2011/08/24/2152305.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值