Skip to content
rhcad edited this page Feb 15, 2012 · 11 revisions

如何使用插件接口

使用接口比较简单,在C++代码中包含相应的接口H文件(一般不需要更多的内核头文件,需要有 iobject.hobjptr.h 文件),然后使用智能指针模板类 x3::Object<Interface> 来创建对象或者从一个对象得到其他接口的对象。

下面的例子说明了如何创建对象、从一个对象得到其他接口的对象、使用接口函数:

#include <plsimple/isimple.h>               // 包含接口文件
#include <plsimple/isimple2.h>              // 包含其他接口文件

int test()
{
    x3::Object<ISimple> p(clsidSimple);     // 给定类ID创建对象

    if (p)                  // 检查是否创建成功,或 if (p->valid())
    {
        p->add(1, 2);       // 调用接口函数,就像普通指针一样
    }

    x3::Object<ISimple2> other(p);  // 从已有对象得到其他接口的实例
    
    // other = p;            除了拷贝构造,也可以使用赋值形式

    if (other->valid())      // or if(other) 
    {
        std::vector<int> nums;
        other->add(nums);   // 调用新接口的函数
    }

    // 会自动释放对象
}

对于函数返回值是接口对象或函数形参是接口对象的情况,为了避免在头文件中包含所用接口的头文件,可以使用 x3::AnyObject ,需要具体某个接口的对象时再转换。

例如下面的接口文件中 createSimple() 返回的是 x3::AnyObject,这样在此接口文件中就可以不包含ISimple1等接口定义文件:

#ifndef X3_EXAMPLE_ISIMPLE3_H
#define X3_EXAMPLE_ISIMPLE3_H

#include <objptr.h>

const char* const clsidSimple3 = "94071767-ba6b-4769-9eb4-2ebf469218f3";

class ISimple3 : public x3::IObject
{
    X3DEFINE_IID(ISimple3);

    // 形参用AnyObject可避免包含其他接口定义文件,可在注释中说明实际接口名
    virtual void useSimple(const x3::AnyObject& obj) = 0;

    // 返回值用AnyObject可避免包含其他接口定义文件,可在注释中说明实际接口名
    virtual x3::AnyObject createSimple() = 0;

    // 而不是 virtual x3::Object<ISimple1> createSimple() = 0;
};

#endif

此函数的实现示例如下,其中包含了如何使用AnyObject得到特定接口对象的例子:

void CSimple::useSimple(const x3::AnyObject& obj)
{
    x3::Object<ISimple> myobj(obj);
    ASSERT(myobj);

    x3::Object<ISimple> sample(createSimple());
    ASSERT(sample);
}

x3::AnyObject CSimple::createSimple()
{
    return x3::Object<ISimple>(clsidSimple);
    // x3::Object<ISimple> simp(clsidSimple);
    // do something with simp
    // return simp;
}
Clone this wiki locally