• MaxSDK中卸载插件的方法


    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

      

  • 相关阅读:
    css 计数器
    页面自动刷新的几种方式
    jq的“钉”插件--jquery.pin.js
    CSS3之Transform(变形)一
    css3之Transition(转换)
    常用css+css3集锦
    JQuery需要手动回收xmlHttpRequest对象
    javascript 闭包暴露句柄和命名冲突的解决方案
    firefox浏览器删除插件
    jQuery中的.bind()、.live()和.delegate()之间区别分析
  • 原文地址:https://www.cnblogs.com/sitt/p/2152305.html
Copyright © 2020-2023  润新知