關於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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.