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