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)
主程序代碼
?
// @description:??IVR?86業務服務主程序入口
// @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_RETURN?event_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_t?N_THREADS? = ? 4 ;
????ACE_TP_Reactor?tp_reactor;
????ACE_Reactor?reactor?( & 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
代碼分別如下
?
// @description:??IVR?86業務服務
// @author:?jiangtao
// @data:?2006-7-3
// @version:1.0.0
#ifndef?SERVICEFACTORY_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_Export?ServiceFactory_T?:? public ?ACE_Service_Object
{
public :
?? /// ?Initializes?object?when?dynamic?linking?occurs.
?? virtual ? int ?init?( int ?argc,?ACE_TCHAR? * argv[]);
?? /// ?Terminates?object?when?dynamic?unlinking?occurs.
?? virtual ? int ?fini?( void );
?? /// ?Returns?information?on?a?service?object.
?? virtual ? int ?info?(ACE_TCHAR? ** info_string,?size_t?length? = ? 0 )? const ;
};
#endif ?/*?SERVICEFACTORY_H?*/
/*******************************************************************/
#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_t?length)? 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. 運行結果
?