zoukankan      html  css  js  c++  java
  • 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

      

  • 相关阅读:
    Django Model数据访问Making queries
    Tomcat 7源码学习笔记 -5 web app自动reload
    tomcat启动提示server.xml的context节点中不支持source属性警告的解决方法
    javaweb学习总结(三十九)——数据库连接池
    共享文件系统
    高可用+负载均衡 方案
    Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
    Java对象序列化给分布式计算带来的方便
    JAVABEAN必须继承序列化借口的作用
    keep-alive pipeline区别
  • 原文地址:https://www.cnblogs.com/sitt/p/2152305.html
Copyright © 2011-2022 走看看