您的位置:首页 > 编程语言 > C语言/C++

基于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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: