请问ACE main函数如何访问动态链接库中的ACE_Stream实例
以 ACE_wrappers/examples/ASX/CCM_App例子为例。ACE_Stream不是Service_object的派生类,
也就是说这样不行:
MT_Stream * pp = ACE_Dynamic_Service<MT_Stream>::instance("CCM_App");
那main函数如何使用,谢谢? http://www.acejoy.com/bbs/viewthread.php?tid=1633
这个帖子关于ACE_Stream有一些讨论,楼主可以看一下是否有参考价值的部分。
回复 #2 modern 的帖子
我看过那个贴子。非常感谢你。那个帖子我看过的。MT_Stream * pp = ACE_Dynamic_Service<MT_Stream>::instance("CCM_App"); 这样不行,因为MT_Stream不是Service_Object的派生类,
我的问题是如何使用 动态链接库的MT_Stream, 和服务配置框架结合起来。 在主应用程序中,还可以使用迭代的方式,取到service configure中Stream的指定,向stream中压入消息" 他最后这么说,我会迭代,但我只能得到名字,而不能 取到service configure中Stream的指定,向stream中压入消息, 因为我取到名字后,使用ACE_Dynamic_Service,只能得到ACE_Service_Object派生类对象。而ACE_Stream不行。
解决了一点点
我研究了一下午,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;
}
页:
[1]