插件是一种遵循一定规范的应用程序接口编写出来的程序,主要是用来扩展软件功能。很多软件都有插件,插件有无数种。例如在IE中,安装相关的插件后,Web浏览器能够直接调用插件程序,用于处理特定类型的文件。
1 创建dll插件工程
TestPlugin.h
#pragma once
#include "Poco/Foundation.h"
class TestPlugin
{
public:
TestPlugin(void);
virtual ~TestPlugin(void);
virtual std::string name() const=0;
};
TestPlugin.cpp
#include "TestPlugin.h"
TestPlugin::TestPlugin(void)
{
}
TestPlugin::~TestPlugin(void)
{
}
TestLibrary.cpp
#include "TestPlugin.h"
#include "Poco/ClassLibrary.h"
#include <iostream>
extern "C" int POCO_LIBRARY_API gimmeFive();
class PluginA:public TestPlugin
{
public:
PluginA()
{
}
~PluginA()
{
}
std::string name()const
{
return "PluginA";
}
};
class PluginB:public TestPlugin
{
public:
PluginB(){}
~PluginB(){}
std::string name()const
{
return "PluginB";
}
};
class PluginC:public TestPlugin
{
public:
PluginC(){}
~PluginC(){}
std::string name()const
{
return "PluginC";
}
};
POCO_BEGIN_MANIFEST(TestPlugin)
POCO_EXPORT_CLASS(PluginA)
POCO_EXPORT_CLASS(PluginB)
POCO_EXPORT_SINGLETON(PluginC)
POCO_END_MANIFEST
void pocoInitializeLibrary()
{
std::cout<<"TestLibrary initializing"<<std::endl;
}
void pocoUninitializeLibrary()
{
std::cout<<"TestLibrary uninitializing"<<std::endl;
}
int gimmeFive()
{
return 5;
}
2测试插件
#include "CppUnit/TestCase.h"
#include "Poco/ClassLoader.h"
#include "TestPlugin.h"
#include <string>
#include <iostream>
using Poco::ClassLoader;
int main()
{
ClassLoader<TestPlugin> cl;
std::string path="TestLibrary.dll";
cl.loadLibrary(path);
TestPlugin* pPluginA=cl.classFor("PluginA").create();
std::cout<<pPluginA->name()<<std::endl;
delete pPluginA;
TestPlugin* pPluginB=cl.classFor("PluginB").create();
std::cout<<pPluginB->name()<<std::endl;
delete pPluginB;
TestPlugin& pluginC=cl.instance("PluginC");
std::cout<<pluginC.name()<<std::endl;
cl.unloadLibrary(path);
return 0;
}
应用效果