找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4029|回复: 4

请问ACE main函数如何访问动态链接库中的ACE_Stream实例

[复制链接]
发表于 2010-4-19 18:35:45 | 显示全部楼层 |阅读模式
以 ACE_wrappers/examples/ASX/CCM_App例子为例。
ACE_Stream不是Service_object的派生类,
也就是说这样不行:
MT_Stream * pp = ACE_Dynamic_Service<MT_Stream>::instance("CCM_App");


那main函数如何使用,谢谢?
发表于 2010-4-20 08:45:23 | 显示全部楼层
http://www.acejoy.com/bbs/viewthread.php?tid=1633
这个帖子关于ACE_Stream有一些讨论,楼主可以看一下是否有参考价值的部分。
 楼主| 发表于 2010-4-20 09:26:37 | 显示全部楼层

回复 #2 modern 的帖子

我看过那个贴子。非常感谢你。那个帖子我看过的。
MT_Stream * pp = ACE_Dynamic_Service<MT_Stream>::instance("CCM_App"); 这样不行,因为MT_Stream不是Service_Object的派生类,
我的问题是如何使用 动态链接库的MT_Stream, 和服务配置框架结合起来。
 楼主| 发表于 2010-4-20 09:58:46 | 显示全部楼层
在主应用程序中,还可以使用迭代的方式,取到service configure中Stream的指定,向stream中压入消息" 他最后这么说,我会迭代,但我只能得到名字,而不能 取到service configure中Stream的指定,向stream中压入消息,      因为我取到名字后,使用ACE_Dynamic_Service,只能得到ACE_Service_Object派生类对象。而ACE_Stream不行。
 楼主| 发表于 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;
}
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-22 13:19 , Processed in 0.013265 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表