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

      

  • 相关阅读:
    emulate sh
    postmaster.c 中的 ListenAddresses
    PostgreSQL的postmaster的fork动作验证
    NotifyMyFrontEnd 函数背后的数据缓冲区(三)
    对${ZSH_VERSION+set}的验证
    微软正准备一个简易的Rootkit清除方案 助用户打补丁 狼人:
    创新与安全:云计算的两只跷跷板 狼人:
    苹果禁止iPhone黑客访问App Store应用商店 狼人:
    春节不回家 单身留守族“拼饭”“拼玩” 狼人:
    僵尸侵入全球 袭击者或为东欧黑帮 狼人:
  • 原文地址:https://www.cnblogs.com/sitt/p/2152305.html
Copyright © 2011-2022 走看看