最近在看STAF的付服务开发知识,开到如何来自定义为STAF的外部服务,把自己的东西定义为STAF的服务的好处就是你可以利用STAF自己的特点,例如它的日志服务和它良好的可扩张性,(想象有100台电脑可以执行你的服务,你不用找100个人来干这件事)。
下面就参考官方文档上说的如何开发STAF的外部服务。
1. STAF服务必须以DevirceServiceFata来定义一个结构体。
struct DeviceServiceData
{
unsigned int fDebugMode; // Debug Mode flag
STAFString fShortName; // Short service name
STAFString fName; // Registered service name
STAFHandlePtr fHandlePtr; // Device service's STAF handle
STAFString fLocalMachineName; // Local machine name
STAFCommandParserPtr fAddParser; // DEVICE ADD command parser
STAFCommandParserPtr fDeleteParser; // DEVICE DELETE command parser
STAFCommandParserPtr fQueryParser; // DEVICE QUERY command parser
STAFCommandParserPtr fListParser; // DEVICE LIST command parser
STAFCommandParserPtr fHelpParser; // DEVICE HELP command parser
STAFCommandParserPtr fVersionParser; // DEVICE VERSION command parser
STAFCommandParserPtr fParmsParser; // DEVIC PARMS command parser
// Map Class Definitions for marshalled results
STAFMapClassDefinitionPtr fListDeviceMapClass;
STAFMapClassDefinitionPtr fQueryDeviceMapClass;
STAFMutexSemPtr fPrinterMapSem; // Semaphore to control
// access to the PrinterMap
STAFMutexSemPtr fModemMapSem; // Semaphore to control
// access to the ModemMap
DeviceMap fPrinterMap; // Map of all printers
DeviceMap fModemMap; // Map of all modems
};
服务结构体里面每一个STAFCommandParserPtr是为了处理发给它的请求而定义的指针。
2.所有的C++的STAF服务都必须实现下面的接口
STAFServiceGetLevelBounds 调用这个函数来说明服务支持的数据结构等级
STAFServiceConstruct 这个函数用来构造一个服务
STAFServiceInit 用来初始化服务
STAFServiceAcceptRequest 这个函数用来让服务句柄处理一个请求
STAFServiceTerm 这个函数用来结束一个服务
STAFServiceDestruct 这个函数用来析构一个服务
2.1 实现构造函数
STAFRC_t STAFServiceConstruct(STAFServiceHandle_t *pServiceHandle,
void *pServiceInfo, unsigned int infoLevel,
STAFString_t *pErrorBuffer)
STAFServiceInfoLevel30 数据结构是一个STAF内置的服务的详细信息的结构体
numOptions unsigned int 说明在STAF.cfg里面配置服务时可以选择的选项的个数
2.2 实现初始化函数
STAFRC_t STAFServiceInit(STAFServiceHandle_t serviceHandle,
void *pInitInfo, unsigned int initLevel,
STAFString_t *pErrorBuffer)
首先处理服务的参数
注册服务的错误代码
创造一个可以存储暂时数据的位置
创造请求的命令解析
一个C++的服务必须为它的每一个请求创造一个命令解释器
给命令解释器添加选项
确定在命令解释器上的选项的约束
确定命令解释器上的选项的依赖关系
给结果定义Map类
解决在本地机器上定义的变量
创建帮助信息
2.3 接收请求
STAFRC_t STAFServiceAcceptRequest(STAFServiceHandle_t serviceHandle,
void *pRequestInfo, unsigned int reqLevel,
STAFString_t *pResultBuffer)
2.4 结束服务
STAFRC_t STAFServiceTerm(STAFServiceHandle_t serviceHandle,
void *pTermInfo, unsigned int termLevel,
STAFString_t *pErrorBuffer)
2.5 对服务的析构
STAFRC_t STAFServiceDestruct(STAFServiceHandle_t *serviceHandle,
void *pDestructInfo, unsigned int destructLevel,
STAFString_t *pErrorBuffer)
STAF的官方文档上给出了一个STAF开发的例子,例子点击打开链接