Visual C++下ACE动态服务配置入门
摘要:
服务动态配置在编写服务端应用在有很明显的优点,本文简要介绍用visual C++ (7.1)
编写ACE动态服务的步骤。
本文适用于ACE初学者。
1. 主进程
1.1 创建主程序
用Viusal Studio创建一空Win32 Console项目,这里命名为GLIVR86ServiceD.注,这里
D表示Daemon,不是Debug。表示我们以后会把这个项目改造为了NT_Service(以后介绍步骤.
1.2 修改项目属性 (Configuation Properties)
1.2.1 为项目新增主文件 GLIVR86ServiceD.cpp,目的是为项目属性中,增加C/C++选项
1.2.1 General 修改程序输出路径$(OutDir)
1.2.2.Debugging Command Arguments: -d, 以调试模式启动
1.2.3 C/C++设置
1.2.3.1 Additional Include Directories /I[path]: $(ACE_ROOT);
1.2.3.2 Code Generation: /MTd ;/MT 调试版选MTd,发行版选 MT
1.2.3.3 Preprocessor:Preprocesor Definitions/D: WIN32;_DEBUG;_CONSOLE;
这是调试版,发行版将_DEBUG改为NDEBUG
1.2.4 链接设置
1.2.4.1 Input: Additinal Dependencise: ACE(d).lib,调试版选aced.lib,
发行版选ace.lib
1.2.4.2 System: SubSystem /subsystem: Console ; (/SUBSYSTEM:CONSOLE)
主程序代码
// @file:GLIVR86ServiceD.cpp
// @description:IVR86业务服务主程序入口
// @author:jiangtao
// @version:2.0.0
#include " stdafx.h "
#include < memory > // 使用auto_ptr
#include " ACE/OS_NS_unistd.h "
#include " ACE/TP_Reactor.h "
#include " ACE/Reactor.h "
#include " ACE/Service_Config.h "
#include " ACE/Thread_Manager.h "
// 线程池
static ACE_THR_FUNC_RETURNevent_loop( void * arg)
{
ACE_DEBUG((LM_INFO, " (%P|%t),event_loop()\n " ));
ACE_Reactor * reactor = static_cast < ACE_Reactor *> (arg);
reactor -> owner(ACE_OS::thr_self());
reactor -> run_reactor_event_loop();
return 0 ;
}
int
ACE_TMAIN( int argc,ACE_TCHAR * argv[])
{
const size_tN_THREADS = 4 ;
ACE_TP_Reactortp_reactor;
ACE_Reactorreactor( & tp_reactor);
auto_ptr < ACE_Reactor > delete_instance(ACE_Reactor::instance( & reactor));
if (ACE_Service_Config::open(argc,argv) == - 1 )
ACE_ERROR_RETURN((LM_ERROR,
ACE_TEXT( " %p\n " ),
ACE_TEXT( " open " )),
1 );
ACE_Thread_Manager::instance() -> spawn_n
(N_THREADS,event_loop,ACE_Reactor::instance());
ACE_Thread_Manager::instance() -> wait();
return 0 ;
}
2. 创建被加载的服务的动态链接库
2.1 用Visual Studio创建一个新的项目GLIVR86Service,我们依然从空白的Win32 Console开
始
1.2.1 为项目新增主文件 GLIVR86Service.cpp,目的是为项目属性中,增加C/C++选项
1.2.1 General : Configration Type:改为 动态链接库 Dynamic Library(DLL)
1.2.3.1 Additional Include Directories /I[path]: $(ACE_ROOT);
1.2.3.2 Code Generation: /MTd ;/MT 调试版选MTd,发行版选 MT
1.2.3.3 Preprocessor:Preprocesor Definitions/D:
WIN32;_DEBUG;_WINDOWS;ACE_BUILD_SVC_DLL
这是调试版,发行版将_DEBUG改为NDEBUG
这里,特别注意,要增加 ACE_BUILD_SVC_DLL宏。如果用generate_export_file.pl
生成自定义的export头文件,这个宏也可以自定义
2.2.2 链接器设置
2.2.2.1 Input: Additinal Dependencise: ACE(d).lib,调试版选aced.lib,
发行版选ace.lib
2.2.2.2 System: SubSystem /subsystem: Console ; (/SUBSYSTEM:CONSOLE)
2.2.2.3 General ,Output file:
../GLIVR86ServiceD/GLIVR86ServiceD/GLIVR86ServiceD.dll
这里填写上GLIVR86ServiceD的路径或环境变量Path中指
示的路径,这样可以方便调试
2.2.2.4 Adanced, Import Libaray: $(OutDir)\GLIVR86ServiceD.lib
上面是调试版,发行版可以去掉后缀D,即
$(OutDir)\GLIVR86Service.lib
3.服务的动态链接库实现
3.1 为项目增加两个文件,分别声明和实现服务类工厂
//@file: ServiceFactory.h
//@file: ServiceFactory.cpp
代码分别如下
// @file:ServiceFactory.h
// @description:IVR86业务服务
// @author:jiangtao
// @data:2006-7-3
// @version:1.0.0
#ifndefSERVICEFACTORY_H
#define SERVICEFACTORY_H
#include " ACE/svc_export.h "
#include " ACE/Service_Config.h "
#include " ACE/Service_Object.h "
// 声明服务工厂
ACE_SVC_FACTORY_DECLARE(ServiceFactory_T)
class ACE_Svc_ExportServiceFactory_T: public ACE_Service_Object
{
public :
/// Initializesobjectwhendynamiclinkingoccurs.
virtual int init( int argc,ACE_TCHAR * argv[]);
/// Terminatesobjectwhendynamicunlinkingoccurs.
virtual int fini( void );
/// Returnsinformationonaserviceobject.
virtual int info(ACE_TCHAR ** info_string,size_tlength = 0 ) const ;
};
#endif /*SERVICEFACTORY_H*/
/*******************************************************************/
// @file:ServiceFactory.cpp
#include " ServiceFactory.h "
#include " ACE/Log_Msg.h "
// 实现服务工厂
ACE_SVC_FACTORY_DEFINE(ServiceFactory_T)
int ServiceFactory_T::init( int argc,ACE_TCHAR * argv[])
{
ACE_DEBUG((LM_INFO, " (%P|%t)服务初始化完成\n " ));
return 0 ;
}
int ServiceFactory_T::info(ACE_TCHAR ** strp,size_tlength) const
{
ACE_DEBUG((LM_INFO, " ServiceFactory_T::info()\n " ));
return 0 ;
}
int ServiceFactory_T::fini( void )
{
return 0 ;
}
5.服务配置文件svc.conf
dynamic IVR86Service Service_Object * GLIVR86Service: _make_ServiceFactory_T() active
6. 运行结果
分享到:
相关推荐
本篇文档主要讲述了ACE的入门知识,包括其编译和配置过程,并以中文版的形式提供给读者。在开始使用ACE之前,需要对系统进行配置,设置环境变量,尤其是ACE_ROOT,该环境变量指明ACE库文件所在的目录。 在编译之前...
总的来说,这个资料系列为初学者提供了全面的ACE入门指导,从环境配置到实际编程,再到深入技术理解,有助于快速掌握ACE的使用并开发出高效、可靠的网络应用程序。对于希望在分布式系统领域工作的开发者来说,ACE是...
本文将详细介绍如何在Windows 8环境下利用Visual Studio 2012以及Linux AS5U2系统上安装和使用Ace6。 1. 概要: Ace6 的全称是 Adaptable Communication Environment,它是一个C++编写的中间件,支持多种操作系统和...
通过这份文档,你可以深入理解ACE的核心概念和技术,并学会如何在Visual C++环境下进行实际的网络编程。 一、ACE简介 ACE是一个C++库,提供了多种网络通信的抽象接口,包括TCP/IP、UDP/IP、套接字、命名管道、多路...
### ACE入门教程知识点详解 #### 一、设置环境变量 在使用ACE库之前,需要进行必要的环境配置。这里包括设置操作系统级别的环境变量以及IDE(如Visual Studio 2005)内部的配置。 1. **操作系统环境变量设置**: ...
`[c++]ACE库入门(中文).rar`是面向C++开发者的ACE入门教程,以中文呈现,适合初学者,通过实例教学,让读者掌握ACE的基本用法。 `ACE.rar`可能是一个包含更多资源或更新版本的ACE库文件,可以用于实际开发环境。 `...
ACE(Adaptive Communication Environment)是一个跨平台的C++框架,专为分布式系统和网络应用程序设计。这个框架提供了许多服务和工具,使得开发人员能够轻松地处理网络通信、并发性、实时性和错误恢复等问题。ACE ...
在Windows环境下编译ACE通常需要使用Visual Studio或其他支持C++的IDE。首先需要配置编译环境,然后按照官方文档提供的步骤进行编译。 ###### 2.4.3 在Linux上编译 在Linux环境下编译ACE则更为简单,通常只需要安装...
#### 第二章 C++ 开发环境 (Win平台下除了 Visual C++ 和 Borland C++ 以外的) **2.1 Cygwin (Windows 下的 Unix 仿真环境)** - **简介**:Cygwin 是一个在 Windows 上运行的 Unix-like 环境。 - **特点**: - ...
本文档是一份简明易懂的ICE(Internet Communication Engine)入门教程,旨在帮助初学者快速掌握ICE的使用方法,包括如何设置开发环境、配置编译参数以及创建并运行基本的分布式应用程序。ICE是ZeroC公司开发的一种...
- `ACE`是一个跨平台的C++应用框架,提供了网络通信、并发处理、定时任务等功能,适用于分布式系统开发。 - `boost`库是C++的一个重要扩展,包含了大量高质量的工具库,如智能指针、多线程、算法库等,极大地丰富...
本实例参照清华大学出版社的《Visual C++范例开发大全》,ISBN: 978-7-302-22624-6,作者: 陈国建. 等编著,版次: 2010年7月第1版。 本实例参照如下的章节改编出来的: 11.1 数据库操作访问技术实例 402 实例253 ...
TAO提供了详细的构建指南,适用于多种编译环境,包括Microsoft Visual C++、GNU make、C++Builder、MinGW等,确保了TAO可以在各种平台上顺利构建和运行。 总之,TAO作为ACE框架中的一个重要组成部分,为开发者提供...
- **使用 Microsoft Visual C++ 构建**:介绍如何使用 Visual C++ 构建工具。 - **使用 GNU make 构建**:指导用户如何使用 GNU make 构建工具。 - **使用 C++ Builder 构建**:说明如何使用 C++ Builder 构建工具。...
- **使用Microsoft Visual C++**:指导如何在Windows环境下使用Visual C++进行构建。 - **使用GNU make**:介绍如何在Unix/Linux环境下使用make工具进行构建。 - **其他构建环境**:还包括了C++ Builder、MinGW等...
本实例参照清华大学出版社的《Visual C++范例开发大全》,ISBN: 978-7-302-22624-6,作者: 陈国建. 等编著,版次: 2010年7月第1版。 本实例参照如下的章节改编出来的: 11.1 数据库操作访问技术实例 402 实例253 ...
本实例参照清华大学出版社的《Visual C++范例开发大全》,ISBN: 978-7-302-22624-6,作者: 陈国建. 等编著,版次: 2010年7月第1版。 本实例参照如下的章节改编出来的: 11.1 数据库操作访问技术实例 402 实例253 ...
CCB:Visual Basic动态按钮配置文件 CCH:Corel图表文件 CCO:CyberChat数据文件 CCT:Macromedia Director Shockwave投影 CDA:CD音频轨道 CDF:Microsoft频道定义格式文件 CDI:Philip的高密盘交互格式 CDM...
在Visual C++(VC++)环境下,开发者可以利用各种库和API来与Access进行交互,实现数据的存取和管理。本文将详细探讨如何在VS2010环境下,使用VC++操作Access数据库。 首先,VC++与Access交互主要依赖于两种方法:...