原文网址:http://blog.youkuaiyun.com/modena/archive/2005/06/16/395547.aspx
刚开始学PWLib,只能以混乱形容,翻译并拼凑出这篇短小的文章,希望后来者少走一些弯路
Portable Windows Library
PWLib 1.9.0
概述
为了可以同时构建在Microsoft 和Unix X -Window 操作系统上应用程序,从很多年前开始,PWLib 从创建到逐步完善,已经成为相当完整而庞大的C ++类库。 PWLib 在设计之初还提供了Macintosh 接口,但至今未被实现。
从此,大量出现的多平台GUI 工具包,例如KDE 、wxWindows 以及OpenH323 等的开发成为PWLib 的主要应用者。他们开始更注重于解决网络、I/O 移植性能、多线程以及可移植性能。通常PWLib 被用来构建高性能和高移植性能的网络中心应用程序。
除了这些高级别的应用,早期PWLib 还扩充了一些基本的容器类,比如数组、线性队列、排序队列(RB Tree )及散列集合(hash 表)。在STL 作为一种标准出现前,就已经在这里被构建。很可惜的是,这些结构同算子及通用的算法规则不能兼容。当然,这个领域的开发一直在进行之中,目前已经能够同STL 兼容,并将在未来会逐步增加对STL 的引入。
PWLib 被广泛应用于多家公司,包括商业性质还是开源的产品中。PWLib 创立本意主要是为了支持OpenH323 项目,但作为一个单独的基本库,她非常完善。
PWLib 中的类分为两种类型:基本类 和控制组件 。基本类 包含了所有对诸如容器、线程、SOCKET 等平台特性相关的结构的基本支持。所有的PWLib 程序都需要有基本类 。
控制组件 实现一些通常是平台无关或者不是所有程序都需要的的功能。在一些特殊的平台(比如Windows ),基本类 和控制组件 甚至被分为单独的压缩库。而在其他平台(比如Unix 平台)中,所有代码被组合成一个单独的类库,并在不需要的地方直接告诉链接器忽略相关代码。
早期PWLib 还支持GUI 类和GUI 组件,但在新的版本中,将不再支持。
如何使用PWLib
一个关于PWLib 最简便的教程,请参考http://toncar.cz/openh323/tut , 这里我们说明一下如何创建一个最简单的程序。
下面的代码演示如果基于PWLib 架构编写标准的”Hello world!” 程序。
// hello.cxx
#include <ptlib.h>
class Hello : public PProcess
{
PCLASSINFO(Hello, PProcess)
public:
void Main();
};
PCREATE_PROCESS(Hello)
void Hello::Main()
{
cout << "Hello world!/n";
}
// End of hello.cxx
PCREATE_PROCESS 宏定义定义了main()# 函数并创建了Hello 实例。使用C++ 初始化全局静态变量比较容易出问题(销毁更容易出问题),因此建议尽力在你的PProcess 中方式所有内容,而不是在全局中定义。
基本类
基本对象类
- PObject – PWLib 所有其他类的基本类
- PContainer – PWLib 中所有带引用计数类的基本类
- PAbstractArray – 数组抽象基类,等同于STL 中的vector 模板类
- PAbstractList – 链表抽象基类,等同于STL 中的list 模板类
- PAbstractDictionary – 集合抽象基类,等同于STL 中的map 模板类
- PString – 字符串抽象基类,等同于STL 中的string 类
I/O 信道类
基于PChannel 抽象类的实现基本I/O 的类集合
- PChannel – 所有I/O 信道的基本类
- PIndirectChannel – 包容另一个信道的信道
- PConsoleChannel – 访问系统控制台的信道
- PPipeChannel – 执行一个程序并通过PChannel 控制输入输出(管道)
- PSerialChannel – 通过PChannel 访问串行通信端口
- PFile – 在主机操作系统上访问文件
- PTextFile – 在主机操作系统上访问文本文件
- PStructuredFile - 在主机操作系统上通过结构记录的数组访问文件
- PFilePath – 在主机操作系统中访问目录
- PVideoChannel – 以PChannel 读写视频设备。请参看PVideoDevice 和 PColourConverter
- PSoundChannel – 以PChannel 读写音频设备
网络类
实现网络Sockets 抽象 ( 基本上基于Berkeley sockets)
- PSocket – 所有网络Socket 基类
- PIPSocket – 所有基于IP 的Socket 基类
- PUDPSocket – 使用UDP 协议的IP socket
- PTCPSocket – 使用TCP/IP 协议的IP socket
- PICMPSocket – 使用ICMP 协议的IP socket
- PIPXSocket – 使用IPX 协议的sockets 基类
- PEthSocket – 原始以太网络接口访问socket 接口
进程和线程类
处理进程、多线程及同步的相关类
- PProcess – 为一个正在运行的程序实现一个主控制线程
- PServiceProcess – 实现后台或者系统进程
- PThread – 抽象一个控制线程或者执行上下文
- PSemaphore – 信号量,仅仅基于一个计数器的同步
- PMutex – 互拆量,仅仅基于一个相互的排斥的同步
- PCriticalSection – 临界量,实现对一个临界区域的独占访问的同步
- PSyncPoint – 允许多线程同步访问一个特殊的代码点,请参看PSyncPointAck
- PAtomicInteger – 原子,实现对一个带有原子增减操作的整型计数器
其他类
- PArgList – 为一个控制台程序分解命令行
- PConfig – 通过一种平台允许的机制,为程序配置提供一种安全的存储方式
- PTime – 抽象一个完整的时间和日期使用类
- PTimeInterval – 为两个PTime 值之间的间隔抽象一个使用类
- PDynaLink – 实现动态加载代码模型
- PRemoteConnection – 控制远程拨号连接
- PMail – 通过平台允许的机制发送邮件
- PPluginManager – 管理插件代码模型
- PAbstractFactory – 通过模版实现一个“抽象工厂”的范例
- PSmartPointer – 一个包含引用计数指针
- PNotifier – 一个允许任何类回调其他类成员函数的通知函数
- PSmartNotifierFunction – 通过对象ID 而不是指针的智能通知函数
控制组件
HTTP 类
用来实现HTTP 协议
- PHTTP – HTTP 协议基类,请参考PHTTPClient 和PHTTPServer
- PURL – 解析和控制URL
- PHTML – 处理HTML 信息格式的字符流
- PHTTPForm – 允许创建HTTP 表单
- PHTTPServiceProcess – 一个包含HTTP 服务器的PServiceProcess 子类
协议类
实现不同的Internet 相关协议。大部分在PWLib 中已经实现,有些需要额外的库的支持。
- PInternetProtocol – 所有基于文本的Internet 协议的基类
- PPOP3 – POP3 协议类的基类,请参考PPOP3Client 和PPOP3Server
- PSMTMP – SMTP 协议类的基类,请参考PSMTPClient 和PSMTPServer
- PFTP – FTP 协议类的基类,请参考PFTPClient 和FTPServer
- PMIMEInfo – 以MIME 格式实现一个键- 值配对的列表。
- PTelnetSocket – 实现TELNET 协议
- PSocksProtocol – SOCKS 协议实现的基类,请参考PSocks4Socket , PSocks5Socket , PSocksSocket , PSocksUDPSocket
- PSTUNClient – 实现一个STUN 客户端
- PSNMP – SNMP 协议实现的基类,请参考PSNMPClient 和PSNMPServer
- PSSLChannel – 通过OpenSSL 实现SSL 协议的PIndirectChannel
- PSASL – 通过Cyrus SASL library 实现SASL 协议
- PXMLRPC – 通过Expat XML library 和HTTP 类实现XMLRPC 协议
- PSOAPClient – 实现一个SOAP 客户端
- PLDAPSession – 通过OpenLDAP library 实现一个LDAP 客户端
- PILSSession - 通过OpenLDAP library 实现一个ILS 客户端
- XMPP::Stream – 以PChannel 方式实现XMPP (Jabber) 流
其他类
- PModem – 为遵循AT 命令集的Modem 定制一个从PSerialChannel 继承的子类
- PIpAccessControlList – 定义一系列一定范围的IP 地址或网络的准入规则
- PRandom – 一个随机数生成器
- PCypher – 实现一些代码加密方式,比如PMessageDigest5 , PTEACypher , 以及PMessageDigestSHA1
- PWAVFile – 实现AIFF 格式的WAV 文件
- PDTMFDecoder – 从PCM 数据流解码DTMF 数据采样
- PMemoryFile – 从PFile 继承一个在内存中存储数据的子类
- PSDLVideoDevice – 实现使用SDL 库的视频设备
- PXML – 实现一个对使用Expat 库的XML 的解析器
- PVXMLChannel – 为VXML 语言实现一个解析器
- PTextToSpeech – 实现一个文本至语音的转换器
ASN.1 原语支持类
- PASN_Array
- PASN_BitString
- PASN_BMPString
- PASN_Boolean
- PASN_Choice
- PASN_ConstrainedObject
- PASN_ConstrainedString
- PASN_Enumeration
- PASN_GeneralisedTime
- PASN_Integer
- PASN_Null
- PASN_Object
- PASN_ObjectId
- PASN_OctetString
- PASN_Real
- PASN_Sequence
- PASN_Set
- PASN_Stream
- PASN_UniversalTime