• ACE写DLL工厂 - [ACE]

    2008-05-04

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://egeho123.blogbus.com/logs/20242944.html

    摘要:
       服务动态配置在编写服务端应用在有很明显的优点,本文简要介绍用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. 运行结果


    收藏到:Del.icio.us




    评论

  • 你好^_^,看似你对ACE还是有研究的,能不能帮我解决一下这个问题
    http://www.acejoy.com/bbs/viewthread.php?tid=1164&extra=page%3D1
    学的人少,遇到问题也不知道问谁,帮个忙,拜托