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. 运行结果
分享到:
相关推荐
Visual C++ 2013入门经典 第7版 .pdf
Visual C++从入门到精通 第2版 刘锐宁 源代码 解压后42M 《Visual C++从入门到精通》是当前最为流行的可视化编程环境之一。《Visual C++从入门到精通(第2版)》由浅入深、循序渐进地讲解了如何使用Visual C++的开发...
Visual C++从入门到精通 第4章 C++的面向对象.ppt
Visual C++2012入门经典Visual C++2012入门经典Visual C++2012入门经典Visual C++2012入门经典Visual C++2012入门经典Visual C++2012入门经典Visual C++2012入门经典Visual C++2012入门经典Visual C++2012入门经典...
《Visual C++ 2013入门经典(第7版)》根据Visual C++ 2013进行了更新,展示了如何使用Visual C++建立实用的应用程序。阅读本书不需要任何编程经验。作者使用大量循序渐进的编程示例,引导读者掌握C++开发的全部...
Visual C++ 2012入门经典(第6版)[中文] 共101336KB(101M),分2个压缩包上传.第一个包要分,第二个包免费。必须同时下了才能解包哦,无密码。
Visual C++6.0从入门到精通系列教程(WDL).rar
Visual C++程序调试方法入门Visual C++程序调试方法入门Visual C++程序调试方法入门Visual C++程序调试方法入门
Visual C++数字图像处理开发入门与编程实践——光盘资料
VISUAL C++ 2010入门经典_第5版(中文版) Ivor Horton著 苏正泉 李文娟译
《Visual C++ 2013入门经典(第7版)》根据Visual C++ 2013进行了更新,展示了如何使用Visual C++建立实用的应用程序。阅读本书不需要任何编程经验。作者使用大量循序渐进的编程示例,引导读者掌握C++开发的全部...
Visual C++ 从入门到精通.pdf John Paul Mueller 著
Visual Studio,我们一般都简称为 VS,VC 全称是 Visual C++,C++就不用解释了吧?VisualStudio 其实是微软开发的一套工具集,它由各种各样的工具组成,这就好像 Office 2007是由 Word 2007、Excel 2007、Access ...
Visual C++/CLI从入门到精通 扫描版
一直在找这本Ivor Horton(霍顿)写的《Visual C++2008入门经典》中文版的书,据说非常经典。今天有幸终于找到了,赶紧上传和大家一起分享。请下载过的朋友支持鉴定一下。 注意:网上那些所谓的《Visual C++2008...
Visual C++ 2012入门经典(第6版)[中文] 共101336KB(101M),分2个压缩包上传.第一个包要分,第二个包免费。必须同时下了才能解包哦,无密码。
对初学Visual C++的读者来说,利用本书也可以很快入门,迅速达到中级甚至高级Visual C++程序员的水平。该书对从事Visual C++ 6开发与应用的广大科研人员、高校相关专业师生均不失为一本重要的自学、教学参者书。
Visual C++ 6从入门到精通.pdf 超经典啊
比较好的入门书.共享给大家.从最基础的C++讲起到VC高级应用.
《Visual C++ 从入门到实践》视频教程 内容介绍: 《Visual C++ 从入门到实践》视频教程是《Visual C++ 从入门到实践》这本书的配套视频,讲解得非常详细! 《Visual C++ 从入门到实践》视频教程配DVD光盘1张,内容...