|
楼主 |
发表于 2010-4-20 18:23:18
|
显示全部楼层
解决了一点点
我研究了一下午,Service_Type是Service_Type_Impl 的bridge,
ACE_Service_Type_Impl 有三种派生类, Service_Object_Type, Module_Type,
Stream_Type。 消息块能在流中流转,不过可能是windows上动态链接库和主程序使用
不同的堆的缘故,程序结束时有异常。不管咋样,终于能使用动态链接库中的
ACE_Stream实例了。
使用动态链接库中的ACE_Stream代码如下:
int
ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{
ACE_STATIC_SVC_REGISTER(ACE_Service_Manager);
ACE_Service_Config loggerd;
if (loggerd.open (argc,
argv,
ACE_DEFAULT_LOGGER_KEY,
// Don't ignore static services!
0) == -1 && errno != ENOENT)
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("%p\n%a"),
ACE_TEXT ("open"),
1));
const ACE_Service_Type * pST ;
//该函数调用能得到"CCM_App"的 Service_Type的指针。
ACE_Service_Config::current()->find("CCM_App", &pST);
//这样就能返回指向动态链接库中MT_Stream类型对象的指针。
MT_Stream *p = ( MT_Stream *)pST->type()->object() ;
ACE_Message_Block * pMB = new ACE_Message_Block(1024);
std::string str("hello, world!");
pMB->copy(str.c_str(), str.size());
ACE::write_n (ACE_STDOUT, pMB->rd_ptr (), pMB->length ( ) ) ;
p->put(pMB->duplicate());
pMB->release();
ACE_Message_Block * pmblk;
p->get(pmblk);
ACE::write_n (ACE_STDOUT, pmblk->rd_ptr (), pmblk->length ( ) ) ;
pmblk->release();
return 0;
} |
|