acecoder 发表于 2010-4-19 18:35:45

请问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函数如何使用,谢谢?

modern 发表于 2010-4-20 08:45:23

http://www.acejoy.com/bbs/viewthread.php?tid=1633
这个帖子关于ACE_Stream有一些讨论,楼主可以看一下是否有参考价值的部分。

acecoder 发表于 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, 和服务配置框架结合起来。

acecoder 发表于 2010-4-20 09:58:46

在主应用程序中,还可以使用迭代的方式,取到service configure中Stream的指定,向stream中压入消息" 他最后这么说,我会迭代,但我只能得到名字,而不能 取到service configure中Stream的指定,向stream中压入消息,      因为我取到名字后,使用ACE_Dynamic_Service,只能得到ACE_Service_Object派生类对象。而ACE_Stream不行。

acecoder 发表于 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;
}
页: [1]
查看完整版本: 请问ACE main函数如何访问动态链接库中的ACE_Stream实例