文章目录
1、插件环境搭建可以看前面一篇博客
2、注册命令
2.1、添加函数
1、在rastertestcmd.h添加初始化函数以及功能函数的声明
/* @接口 程序初始化
* @邮箱 575814050@qq.com
* @时间 2020年10月12日
*/
bool initApplication();
/* @接口 测试命令
* @邮箱 575814050@qq.com
* @时间 2020年10月12日
*/
void rasterTestCmd();
2、在rastertestcmd.cpp中添加实现
void rasterTestCmd()
{
dox::Object<dox::IDoxCmdLine> iDoxCmdLine(NIL);
iDoxCmdLine->print("Hello World");
}
bool initApplication()
{
dox::Object<dox::IDoxCommand> iDoxCommand(NIL);
iDoxCommand->registerCommand("rastertest", "rastertestcmd", rasterTestCmd);
return true;
}
rasterTestCmd函数中,我们用了iDoxCmdLine中的print接口打印输出的信息在软件的命令行中。
initApplication函数中,调用了IDoxCommand中的registerCommand接口来进行命令注册。其中第一个参数是表示命令组的命令,第二参数是命令名称,第三个参数就是注册功能函数
2.2、调用程序初始化函数
在seed_rastertest.cpp文件的attachDoxygen函数中调用初始化函数
OUTCAPI bool attachDoxygen(void *)
{
return initApplication();
}
3、到这里注册命令结束。编译完成之后,将seed_rastertest.dll放到plugins文件夹下然后运行软件,在命令行中执行刚才注册的命令名称(rastertestcmd),结果如下图所示:
3、注册类
3.1、添加接口类文件
1、接口类文件中定义的都是纯虚函数,注册类的好处是可以在其他模块中调用注册类的接口。比如我在A模块中声明了一个接口类interface_a,然后我再B模块中想调用的话,如果不用注册类的方法,那么我只能将接口类的实现在B模块中重写一遍,但是使用注册类的机制,那么我就可以在B模块中直接调用A模块注册的接口类。
2、接口类都是继承dox::IObject,并且都要添加REGISTER_INTERFACE(IRasterTestClass, dox::IObject),IRasterTestClass是抽象类,也是实现类的基类,dox::IObject是注册类的基类。
#ifndef IRASTERTESTCLASS_H
#define IRASTERTESTCLASS_H
#include "core/iobject.h"
class IRasterTestClass
: public dox::IObject
{
REGISTER_INTERFACE(IRasterTestClass, dox::IObject)
public:
/* @接口 测试接口
* @类名 [IRasterTestClass]
* @邮箱 575814050@qq.com
* @时间 2020年10月12日
*/
virtual void testInterface() = 0;
};
#endif /*IRASTERTESTCLASS_H*/
3.2、添加类实现文件
实现类必须继承刚才定义的抽象类,并且把抽象类的纯虚接口都实现。并且在实现类的中必须要添加REGISTER_ACTUALIZE(RasterTestClass, IRasterTestClass) 这一句,RasterTestClass是实现类类名,IRasterTestClass是抽象类,也就是基类。
3.2.1、实现类头文件
#ifndef RASTERTESTCLASS_H
#define RASTERTESTCLASS_H
#include "irastertestclass.h"
class RasterTestClass
: public IRasterTestClass
{
REGISTER_ACTUALIZE(RasterTestClass, IRasterTestClass)
public:
/* @接口 默认构造函数
* @类名 [RasterTestClass]
* @邮箱 575814050@qq.com
* @时间 2020年3月14号
*/
RasterTestClass();
/* @接口 默认构造函数
* @类名 [RasterTestClass]
* @邮箱 575814050@qq.com
* @时间 2020年3月14号
*/
~RasterTestClass();
/* @接口
* @类名 [IRasterTestClass]
* @邮箱 575814050@qq.com
* @时间 2020年10月12日
*/
virtual void testInterface();
};
#endif /*RASTERTESTCLASS_H*/
3.2.2、实现类源文件
#include "rastertestclass.h"
#include "core/idoxcommand.h"
#include "seed_widget/idoxcmdline.h"
RasterTestClass::RasterTestClass()
: IRasterTestClass()
{
}
RasterTestClass::~RasterTestClass()
{
}
void RasterTestClass::testInterface()
{
dox::Object<dox::IDoxCmdLine> iDoxCmdLine(NIL);
iDoxCmdLine->print("Hello World");
}
3.3、注册类
添加完实现类之后,直接编译,如果通过,那么说明前面的步骤都没有问题,如果出现如下错误:
error C2039: “InterList”: 不是“dox::NormalObject”的成员
note: 参见“dox::NormalObject”的声明
error C3861: “InterList”: 找不到标识符
说明在实现类的头文件中没有添加REGISTER_ACTUALIZE(RasterTestClass, IRasterTestClass)
添加完之后,就可以编译通过,接下来再回到seed_rastertest. cpp文件中进行对类的注册。
#include "core/modulemacro.h"
#include "rastertestclass.h"
BEGIN_DOX_NAMESPACE
BEGIN_DEFINE_DOX_MODULE("rastertest")
XDEFINE_CLASSMAP_ENTRY_NORMAL(RasterTestClass)
FINISH_DEFINE_DOX_MODULE()
END_DOX_NAMESPACE
3.3.1、普通类注册
#include "core/modulemacro.h"
#include "rastertestcmd.h"
#include "rastertestclass.h"
BEGIN_DOX_NAMESPACE
BEGIN_DEFINE_DOX_MODULE("rastertest")
XDEFINE_CLASSMAP_ENTRY_NORMAL(RasterTestClass)
FINISH_DEFINE_DOX_MODULE()
END_DOX_NAMESPACE
3.3.2、单例类注册
BEGIN_DOX_NAMESPACE
BEGIN_DEFINE_DOX_MODULE("rastertest")
XDEFINE_CLASSMAP_ENTRY_SINGLE(注册类1)
XDEFINE_CLASSMAP_ENTRY_SINGLE(注册类2)
XDEFINE_CLASSMAP_ENTRY_SINGLE(注册类3)
。。。
XDEFINE_CLASSMAP_ENTRY_SINGLE(注册类n)
FINISH_DEFINE_DOX_MODULE()
END_DOX_NAMESPACE
3.3.2、多个类注册
BEGIN_DOX_NAMESPACE
BEGIN_DEFINE_DOX_MODULE("rastertest")
XDEFINE_CLASSMAP_ENTRY_NORMAL(普通类1)
XDEFINE_CLASSMAP_ENTRY_NORMAL(普通类2)
XDEFINE_CLASSMAP_ENTRY_NORMAL(普通类3)
...
XDEFINE_CLASSMAP_ENTRY_NORMAL(普通类n)
XDEFINE_CLASSMAP_ENTRY_SINGLE(单例类1)
XDEFINE_CLASSMAP_ENTRY_SINGLE(单例类2)
XDEFINE_CLASSMAP_ENTRY_SINGLE(单例类3)
...
XDEFINE_CLASSMAP_ENTRY_SINGLE(单例类n)
FINISH_DEFINE_DOX_MODULE()
END_DOX_NAMESPACE
4、将命令添加到工具箱
4.1、打开自定义工具箱
4.2、选择要添加的命令
4.3、点击自定义命令
4.4、工具箱中查看
5、测试插件
将生成的插件复制到plugins文件夹中,然后启动软件,在命令行中执行rasterTestClass命令,就会出现如下图所示的结果,到此表示注册成功。