基于POCO框架的C++库 源码分析
2018-03-28 16:08
1006 查看
POCO C++库 // 特点: 1.侧重于互联网时代的网络应用程序 2.使用高效的,现代的标准ANSI/ISO C++,并基于STL 3.高可移值性,并可在多个平台下可用 4.开源,并使用Boost Software License发布 5.不管是否商用,都完全免费 6.Poco是一个强大的类库,并易于构建自己的应用程序 7.Poco帮助你创建跨平台的应用程序(一次编写,多平台编译和运行) 8.模块化和可扩展,可应用于嵌入式到企业级程序 9.提供全面,易懂的编程接口 10.使用C++语言,快速且高效 11.Poco崇尚简易 12.在设计,代码风格和文档上保持一致 13.Poco强调代码质量,包括可读性,综合性,一致性,编码风格和可测试性 14.Poco使得C++编程更加容易 // 特性: 1.FTP客户端 2.日期,时间类库 3.Cache框架 4.基于OpenSSL的密码系统 5.跨平台的文件系统类库 6.HTML表单类库 7.HTTP客户端和服务端(支持SSL),C++ 服务器页面编译器 8.日志框架 9.多线程框架(线程池,活动对象,工作队列等) 10.POP3客户端类库 11.跨平台,一次编写,多平台编译和运行 12.进程管理和进程间通信类库 13.反射框架 14.基于PCRE的正则表达式 15.SMTP客户端类库 16.数据库访问类库(SQLite,MySQL, ODBC) 17.支持SSL/TLS,基于OpenSSL 18.动态类库加载 19.先进的内存和指针管理(Buffer, Pool) 20.Socket类库 21.网络数据流类库,支持Base64,HexBinary编解码,压缩等等 22.字符串格式化和其它字符串工具类库 23.TCP服务器框架(多线程) 24.文本编码和转换 25.Tuples 26.URI支持 27.支持UTF8和Unicode编码 28.UUID生成 4000 器 29.XML生成和解析器 30.Zip文件操作类库 //Poco应用场景 1.创建自动化的中间件和设备 2.工业自动化和工业设备 3.流量控制系统 4.健康系统 5.测量,数据收集和测试系统 6.消费电子产品和家庭自动化产品 7.测量 8.航空交通管理系统 9.VoIP 10.票务和入口控制系统 11.包装应用程序 //Poco的优势 1.全面的,完整的C++框架,可减少开发工作,快速让产品走向市场 2.易学易使用,以及相当多的示例代码和良好的文档 3.原生的C++代码,性能优秀,低内存占用 4.平台无关,一处编写,跨平台编译和运行 5.大多数情况下,可以开发机上完成开发和调试工作 6.可以非常容易的迁移到新平台 //下面为主要模块的库结构 【1】Foundation模块分析 Foundation库是POCO库集中的一个,提供了编程时的一些常用抽象。 具体里面包含有18个模块;目前为止Core、Events、Notifications、Processes、Tasks、Threading这几个模块应用时, 对于创建整体程序架构的影响非常大,基本上可以决定了一个应用程序的复杂度,合理的应用这些模块可以使应用程序松耦合。 其余的一些模块对应用整体结构影响不大,带来的都是一些局部的影响。在看POCO库的时候经常觉得它的类写得好,内聚性非常强, 耦合性很低。这个和它整体结构的合理性确实也是有一定关系的。 【2】SharedLibrary模块分析 // 【A】库提供方: // AbstractPlugin.h // // This is used both by the class library and by the application. #ifndef AbstractPlugin_INCLUDED #define AbstractPlugin_INCLUDED class AbstractPlugin { public: AbstractPlugin(); virtual ~AbstractPlugin(); virtual std::string name() const = 0; }; #endif // AbstractPlugin.h // .cpp 文件 // AbstractPlugin.cpp // // This is used both by the class library and by the application. #include "AbstractPlugin.h" AbstractPlugin::AbstractPlugin() {} AbstractPlugin::~AbstractPlugin() {} // PluginLibrary.cpp #include "AbstractPlugin.h" #include "Poco/ClassLibrary.h" #include <iostream> class PluginA: public AbstractPlugin { public: std::string name() const { return "PluginA"; } }; class PluginB: public AbstractPlugin { public: std::string name() const { return "PluginB"; } }; POCO_BEGIN_MANIFEST(AbstractPlugin) POCO_EXPORT_CLASS(PluginA) POCO_EXPORT_CLASS(PluginB) POCO_END_MANIFEST // optional set up and clean up functions void pocoInitializeLibrary() { std::cout << "PluginLibrary initializing" << std::endl; } void pocoUninitializeLibrary() { std::cout << "PluginLibrary uninitializing" << std::endl; } // 使用方调用: // main.cpp #include "Poco/ClassLoader.h" #include "Poco/Manifest.h" #include "AbstractPlugin.h" #include <iostream> typedef Poco::ClassLoader<AbstractPlugin> PluginLoader; typedef Poco::Manifest<AbstractPlugin> PluginManifest; int main(int argc, char** argv) { PluginLoader loader; std::string libName("PluginLibrary"); libName += Poco::SharedLibrary::suffix(); // append .dll or .so loader.loadLibrary(libName); PluginLoader::Iterator it(loader.begin()); PluginLoader::Iterator end(loader.end()); for (; it != end; ++it) { std::cout << "lib path: " << it->first << std::endl; PluginManifest::Iterator itMan(it->second->begin()); PluginManifest::Iterator endMan(it->second->end()); for (; itMan != endMan; ++itMan) std::cout << itMan->name() << std::endl; } AbstractPlugin* pPluginA = loader.create("PluginA"); AbstractPlugin* pPluginB = loader.create("PluginB"); std::cout << pPluginA->name() << std::endl; std::cout << pPluginB->name() << std::endl; loader.classFor("PluginA").autoDelete(pPluginA); delete pPluginB; loader.unloadLibrary(libName); return 0; }
相关文章推荐
- (版本定制)第5课:基于案例分析Spark Streaming流计算框架的运行源码
- 基于Hadoo的日志收集框架---Chukwa的源码分析(数据处理)
- 基于Android7.0的Launcher3源码分析(1)——框架设计分析
- 基于Hadoop的日志收集框架---Chukwa的源码分析(适配器、代理)
- 基于Hadoop的日志收集框架---Chukwa的源码分析(连接器)
- 基于Hadoop的日志收集框架---Chukwa的源码分析(数据处理)
- 基于Hadoop的日志收集框架---Chukwa的源码分析(收集器)
- 基于Hadoop的日志收集框架---Chukwa的源码分析(数据处理)
- Android 源码分析之基于Stagefright的MediaPlayer播放框架[4]
- Android 源码分析之基于Stagefright的MediaPlayer播放框架[3]
- Java集合框架成员之HashTable类的源码分析(基于JDK1.8版本)
- (4.2.40)阿里开源路由框架ARouter的源码分析
- CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
- Android插件式换肤框架搭建 - 资源加载源码分析
- SSH框架总结(框架分析+环境搭建+实例源码下载)
- Storm【Storm0.9.3】- 源码分析:ACK 框架之 Acker Bolt的实现分析
- 基于对话框配置工具框架简单分析(一)
- mahout基于项目的协同过滤源码分析
- (4.2.45)美团页面切分框架Shield源码分析
- JCF框架源码分析系列-ArrayList(二)