第一章 Adobe After Effects AE插件开发 SDK入门-SPBasicSuite对象

1.SPBasicSuite对象

  插件的本质就是一个后缀名称为aex的动态库,把编译好的动态库放到AE指定的文件夹下(一般是AE安装文件夹下的Plug-ins或者用快捷方式链接到指定文件夹),AE启动时就会找到插件并加载它。
  首先是进入点函数:代码如下所示:

A_Err EntryPointFunc(
    struct SPBasicSuite     *pica_basicP,           /* >> */
    A_long                  major_versionL,         /* >> */        
    A_long                  minor_versionL,         /* >> */        
    AEGP_PluginID           aegp_plugin_id,         /* >> */
    AEGP_GlobalRefcon       *global_refconP)        /* << */
{
    PT_XTE_START{
        *global_refconP = (AEGP_GlobalRefcon) new Panelator(pica_basicP, aegp_plugin_id);
    } PT_XTE_CATCH_RETURN_ERR;
}

  SPBasicSuite是什么?代码如下:

/*******************************************************************************
 **
 ** Constants
 **
 **/
/** PICA basic suite name */
#define kSPBasicSuite               "SP Basic Suite"
/** PICA basic suite version */
#define kSPBasicSuiteVersion        4


/*******************************************************************************
 **
 ** Suite
 **
 **/

/** @ingroup Suites
    This suite provides basic memory management for PICA (the Adobe plug-in manager)
    and defines the basic functions for acquiring and releasing other suites.

    A suite consists of a list of function pointers. The application, or a
    plug-in that loads a suite, provides valid pointers when the suite is
    acquired. When a suite is not available, the pointers are set to the
    address of the \c #Undefined() function.

    Do not attempt to acquire a suite (other than the \c #SPBlocksSuite)
    in response to a PICA access (\c #kSPAccessCaller) or property
    (\c #kSPPropertiesCaller) message. Most suites are unavailable
    during these load and unload operations.

    You can acquire all the suites you will need when your plug-in is first
    loaded, as long as you release them before your plug-in is unloaded.
    At shutdown, however, it is most efficient to acquire only those
    suites explicitly needed to shut down; for example, to free memory
    and save preferences.

    The \c SPBasicSuite itself is a part of the message data passed
    to your plug-in with any call. To access it from the message data structure:
    @code
    SPBasicSuite sBasic = message->d.basic;
    sBasic->function( )
    @endcode
    */
typedef struct SPBasicSuite {
    /** Acquires a function suite. Loads the suite if necessary,
        and increments its reference count. For example:
    @code
SPErr error;
SPBasicSuite *sBasic = message->d.basic;
AIRandomSuite *sRandom;
sBasic->AcquireSuite( kAIRandomSuite, kAIRandomVersion, &sRandom );
    @endcode
            @param name The suite name.
            @param version The suite version number.
            @param suite [out] A buffer in which to return the suite pointer.
            @see \c #SPSuitesSuite::AcquireSuite()
        */
    SPAPI SPErr (*AcquireSuite)( const char *name, int version, const void **suite );
    /** Decrements the reference count of a suite and unloads it when the
        reference count reaches 0.
            @param name The suite name.
            @param version The suite version number.
        */
    SPAPI SPErr (*ReleaseSuite)( const char *name, int version );
    /** Compares two strings for equality.
            @param token1 The first null-terminated string.
            @param token2 The second null-terminated string.
            @return True if the strings are the same, false otherwise.
        */
    SPAPI SPBoolean (*IsEqual)( const char *token1, const char *token2 );
    /** Allocates a block of memory.
            @param size The number of bytes.
            @param block [out] A buffer in which to return the block pointer.
            @see \c #SPBlocksSuite::AllocateBlock()
        */
    SPAPI SPErr (*AllocateBlock)( size_t size, void **block );
    /** Frees a block of memory allocated with \c #AllocateBlock().
            @param block The block pointer.
            @see \c #SPBlocksSuite::FreeBlock()
        */
    SPAPI SPErr (*FreeBlock)( void *block );
    /** Reallocates a block previously allocated with \c #AllocateBlock().
        Increases the size without changing the location, if possible.
            @param block The block pointer.
            @param newSize The new number of bytes.
            @param newblock [out] A buffer in which to return the new block pointer.
            @see \c #SPBlocksSuite::ReallocateBlock()
        */
    SPAPI SPErr (*ReallocateBlock)( void *block, size_t newSize, void **newblock );
    /** A function pointer for unloaded suites. This is a protective measure
        against other plug-ins that may mistakenly use the suite after they have
        released it.

        A plug-in that exports a suite should unload the suite's procedure pointers
        when it is unloaded, and restore them when the plug-in is reloaded.
        \li On unload, replace the suite's procedure pointers
            with the address of this function.
        \li On reload, restore the suite's procedure
            pointers with the updated addresses of their functions.

        For example:
    @code
        SPErr UnloadSuite( MySuite *mySuite, SPAccessMessage *message ) {
            mySuite->functionA = (void *) message->d.basic->Undefined;
            mySuite->functionB = (void *) message->d.basic->Undefined;
        }

        SPErr ReloadSuite( MySuite *mySuite, SPAccessMessage *message ) {
            mySuite->functionA = functionA;
            mySuite->functionB = functionB;
        }
    @endcode
        */
    SPAPI SPErr (*Undefined)( void );

} SPBasicSuite;


/** Internal */
SPAPI SPErr SPBasicAcquireSuite( const char *name, int version, const void **suite );
/** Internal */
SPAPI SPErr SPBasicReleaseSuite( const char *name, int version );
/** Internal */
SPAPI SPBoolean SPBasicIsEqual( const char *token1, const char *token2 );
/** Internal */
SPAPI SPErr SPBasicAllocateBlock( size_t size, void **block );
/** Internal */
SPAPI SPErr SPBasicFreeBlock( void *block );
/** Internal */
SPAPI SPErr SPBasicReallocateBlock( void *block, size_t newSize, void **newblock );
/** Internal */
SPAPI SPErr SPBasicUndefined( void );

#if INSIDE_PHOTOSHOP
SPAPI SPErr SPBasicAcquireSuiteCFM( const char *name, int version, const void **suite );
SPAPI SPErr SPBasicReleaseSuiteCFM( const char *name, int version );
#endif

/*******************************************************************************
 **
 ** Errors
 **
 **/

2.作者答疑


  如有疑问,请留言。

提示: 作者知了-联系方式1
提示: 作者知了-联系方式2

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容