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:??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
代碼分別如下
?
//
@file:?ServiceFactory.h
//
@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?*/
/*******************************************************************/
//
@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_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. 運行結果
?