关于ACE服务全局宏定义

 
ACE全局宏定义
 
VERSIONED_NAMESPACE是新版本定义的,我们可以看作替换的时候为空
 
服务工厂宏定义1
# define ACE_SVC_FACTORY_DEFINE(X) ACE_FACTORY_DEFINE(ACE_Svc, X)
 
我们看到了ACE_SVC_FACTORY_DEFINE就是讲上面定义的CLS定义成ACE_Svc,本质是一样的。不同地方是DLL倒出前缀不一样,是ACE_Svc_Export不是ACE_Local_Service_Export_Export
 
服务工厂宏定义2
# define ACE_FACTORY_DEFINE(CLS,SERVICE_CLASS) /
void ACE_MAKE_SVC_CONFIG_GOBBLER_NAME(ACE_VERSIONED_NAMESPACE_NAME,SERVICE_CLASS) (void *p) { /
 ACE_VERSIONED_NAMESPACE_NAME::ACE_Service_Object * _p = /
    static_cast< ACE_VERSIONED_NAMESPACE_NAME::ACE_Service_Object *> (p); /
 ACE_ASSERT (_p != 0); /
 delete _p; } /
extern "C" CLS##_Export ACE_VERSIONED_NAMESPACE_NAME::ACE_Service_Object */
ACE_MAKE_SVC_CONFIG_FACTORY_NAME(ACE_VERSIONED_NAMESPACE_NAME,SERVICE_CLASS) (ACE_Service_Object_Exterminator *gobbler) /
{ /
 ACE_TRACE (#SERVICE_CLASS); /
 if (gobbler != 0) /
    *gobbler = (ACE_Service_Object_Exterminator) ACE_MAKE_SVC_CONFIG_GOBBLER_NAME(ACE_VERSIONED_NAMESPACE_NAME,SERVICE_CLASS); /
 return new SERVICE_CLASS; /
}
 
#define ACE_MAKE_SVC_CONFIG_GOBBLER_NAME(VERSIONED_NAMESPACE,SERVICE_CLASS) 转定义为ACE_MAKE_SVC_CONFIG_FUNCTION_NAME(_gobble,VERSIONED_NAMESPACE,SERVICE_CLASS)
 
# define ACE_MAKE_SVC_CONFIG_FUNCTION_NAME(PREFIX,VERSIONED_NAMESPACE,SERVICE_CLASS) PREFIX ## _ ## SERVICE_CLASS
 
转换成实际的代码:就是SERVICE_CLASS前加了_gobble_
_gobble_SERVICE_CLASS
 
 
 
#define ACE_MAKE_SVC_CONFIG_FACTORY_NAME(VERSIONED_NAMESPACE,SERVICE_CLASS) 转定义ACE_MAKE_SVC_CONFIG_FUNCTION_NAME(_make,VERSIONED_NAMESPACE,SERVICE_CLASS)
 
# define ACE_MAKE_SVC_CONFIG_FUNCTION_NAME(PREFIX,VERSIONED_NAMESPACE,SERVICE_CLASS) PREFIX ## _ ## SERVICE_CLASS
 
转换成实际的代码:就是SERVICE_CLASS前加了_make_
_make_SERVICE_CLASS
 
 
 
#define ACE_MAKE_SVC_CONFIG_GOBBLER_NAME(VERSIONED_NAMESPACE,SERVICE_CLASS) ACE_MAKE_SVC_CONFIG_FUNCTION_NAME(_gobble,VERSIONED_NAMESPACE,SERVICE_CLASS)
 
# define ACE_MAKE_SVC_CONFIG_FUNCTION_NAME(PREFIX,VERSIONED_NAMESPACE,SERVICE_CLASS) PREFIX ## _ ## SERVICE_CLASS
 
转换成实际的代码
_gobble_SERVICE_CLASS
 
 
这句话展开如下:
ACE_FACTORY_DEFINE (ACE_Local_Service, myclass)
 
整个宏如下???替换成对应的类名myclass:
Class myclass
{
 ……
};
 
void _gobble_myclass (void*p)
{
    ACE_Service_Object * _p = static_cast< ACE_Service_Object *> (p);
  ACE_ASSERT (_p != 0);
  delete _p;
}
 
// 这里需要注意一下,DLL倒出的前缀CLS
extern "C" CLS_Export ACE_Service_Object *
_make_myclass (ACE_Service_Object_Exterminator *gobbler)
{
 ACE_TRACE (myclass);
 if (gobbler != 0)
    *gobbler = (ACE_Service_Object_Exterminator) _gobble_myclass);
 return new myclass;
}
 
_make_myclass创建(new)一个实例,并传出一个实例删除函数_gobble_myclass
 
 
 
 
 
 
静态服务定义
ACE_STATIC_SVC_DEFINE (
 myclass,    // 描述类的名,一般就是类名
 ACE_TEXT ("myclass"), // 这个可以自己定义
 ACE_SVC_OBJ_T,
 &ACE_SVC_NAME (myclass),
 ACE_Service_Type::DELETE_THIS
 | ACE_Service_Type::DELETE_OBJ,
 0 // This object is not initially active.
);
 
#define ACE_STATIC_SVC_DEFINE(SERVICE_CLASS, NAME, TYPE, FN, FLAGS, ACTIVE) /
ACE_Static_Svc_Descriptor ace_svc_desc_##SERVICE_CLASS = { NAME, TYPE, FN, FLAGS, ACTIVE };
 
看服务名定义
# define ACE_SVC_NAME(SERVICE_CLASS) ACE_MAKE_SVC_CONFIG_FACTORY_NAME(ACE_VERSIONED_NAMESPACE_NAME,SERVICE_CLASS)
 
#define ACE_MAKE_SVC_CONFIG_FACTORY_NAME(VERSIONED_NAMESPACE,SERVICE_CLASS) ACE_MAKE_SVC_CONFIG_FUNCTION_NAME(_make,VERSIONED_NAMESPACE,SERVICE_CLASS)
 
# define ACE_MAKE_SVC_CONFIG_FUNCTION_NAME(PREFIX,VERSIONED_NAMESPACE,SERVICE_CLASS) PREFIX ## _ ## SERVICE_CLASS
 
转换成实际的代码:
_make_SERVICE_CLASS
 
 
 
实际如下:是初始化一个静态结构的成员
ACE_Static_Svc_Descriptor ace_svc_desc_myclass
{
    "myclass",      // 服务描述串
    ACE_SVC_OBJ_T,
    &_make_myclass, // 这是就是上面的_make_myclass创建(new)一个实例函数指针
    ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
    0
}
 
 
 
 
// 静态对象定义
ACE_STATIC_SVC_REQUIRE (myclass)
 
# define ACE_STATIC_SVC_REQUIRE(SERVICE_CLASS)/
class ACE_Static_Svc_##SERVICE_CLASS {/
public:/
 ACE_Static_Svc_##SERVICE_CLASS() { /
    ACE_Service_Config::static_svcs ()->insert (/
         &ace_svc_desc_##SERVICE_CLASS); /
    } /
};/
static ACE_Static_Svc_##SERVICE_CLASS ace_static_svc_##SERVICE_CLASS;
 
 
实际的代码:
class ACE_Static_Svc_??? {
public:
 ACE_Static_Svc_???() {
    ACE_Service_Config::static_svcs ()->insert (
         &ace_svc_desc_???);
    }
};
static ACE_Static_Svc_??? ace_static_svc_???;
 
??? 替换成实际的类名
 
 
整个在一起实际宏代码如下:
 
ACE_FACTORY_DEFINE (ACE_Local_Service, myclass)
ACE_STATIC_SVC_DEFINE (
 myclass,    // 描述类的名,一般就是类名
 ACE_TEXT ("myclass"), // 这个可以自己定义
 ACE_SVC_OBJ_T,
 &ACE_SVC_NAME (myclass),
 ACE_Service_Type::DELETE_THIS
 | ACE_Service_Type::DELETE_OBJ,
 0 // This object is not initially active.
);
ACE_STATIC_SVC_REQUIRE (myclass)
 
 
宏展开替换如下
 
// 服务类定义
Class myclass
{
 ……
};
 
// 删除服务实例的函数
void _gobble_myclass (void*p)
{
    ACE_Service_Object * _p = static_cast< ACE_Service_Object *> (p);
  ACE_ASSERT (_p != 0);
  delete _p;
}
 
// 创建服务实例的函数
extern "C" ACE_Local_Service_Export_Export ACE_Service_Object *
_make_myclass (ACE_Service_Object_Exterminator *gobbler)
{
 ACE_TRACE (myclass);
 if (gobbler != 0)
    *gobbler = (ACE_Service_Object_Exterminator) _gobble_myclass);
 return new myclass;
}
 
// 服务实例描述
ACE_Static_Svc_Descriptor ace_svc_desc_myclass
{
    "myclass", // 服务描述的名称
    ACE_SVC_OBJ_T,
    &_make_myclass, // 这是就是上面的创建实例函数指针
    ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
    0
}
 
// 静态服务类定义
class ACE_Static_Svc_myclass {
public:
 ACE_Static_Svc_ myclass () {
    ACE_Service_Config::static_svcs ()->insert (
         &ace_svc_desc_myclass);
    }
};
 
// 静态实例定义
static ACE_Static_Svc_myclass ace_static_svc_myclass;
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值