Focus on ACE

订阅 ace-china
电子邮件:
浏览存于 groups.google.com 上的所有帖子

C++博客 首页 新随笔 联系 聚合 管理
  64 Posts :: 3 Stories :: 22 Comments :: 0 Trackbacks

ACE运行时的初始化和结束时的回收操作

url: http://www.cppblog.com/ace

   ace VERSION:  5.4 . 9

   HOST MACHINE and OPERATING SYSTEM:
       Windows XP SP1

   COMPILER NAME AND VERSION (AND PATCHLEVEL):
       Microsoft Visual C
++  .NET

   THE $ACE_ROOT
/ ace / config.h FILE:
       #include 
" ace/config-win32.h "

   DOES THE PROBLEM AFFECT:
       EXECUTION

   SYNOPSIS:
       In my dll ace work incorrect, but 
in  exe good.

   REPEAT BY:


// 正确:测试连接的简单程序
#include  < iostream >
#include 
" ace/INET_Addr.h "
#include 
" ace/SOCK_Connector.h "
#include 
" ace/SOCK_Stream.h "

int  _tmain( int  argc, _TCHAR *  argv[])
{
   std::cout 
<<   " Hi\n " ;

   
//  Create remote address
   ACE_INET_Addr server_addr;
   
if  ( server_addr. set 1234 , INADDR_LOOPBACK )  ==   - 1  )  {
       std::cout 
<<   " Bad address\n " ;
       
return   1 ;
   }


   
//  Create connection
   ACE_SOCK_Connector connector;
   ACE_SOCK_Stream connection;
   
if  (connector.connect (connection, server_addr)  <   0 )   {
       std::cout 
<<   " Connection failed\n " ;
       
return   2 ;
   }


   
return   0 ;
}


// 不正确:放在Dll项目中的代码片断

#include 
" ace/INET_Addr.h "
#include 
" ace/SOCK_Connector.h "
#include 
" ace/SOCK_Stream.h "

BOOL APIENTRY DllMain( HANDLE hModule,
                      DWORD  ul_reason_for_call,
                      LPVOID lpReserved
                                        )
{
       
switch  (ul_reason_for_call)
       
{
       
case  DLL_PROCESS_ATTACH:
       
case  DLL_THREAD_ATTACH:
       
case  DLL_THREAD_DETACH:
       
case  DLL_PROCESS_DETACH:
               
break ;
       }

   
return  TRUE;
}


int  test()
{
   
//  Create remote address
   ACE_INET_Addr server_addr;
   
if  ( server_addr. set 1234 , INADDR_LOOPBACK )  ==   - 1  )  {
       
return   1 ;
   }


   
//  Create connection
   ACE_SOCK_Connector connector;
   ACE_SOCK_Stream connection;
   
if  (connector.connect (connection, server_addr)  <   0 )   {
       
return   2 ;
   }


   
return   0 ;
}



如果我从dll中调用 test()函数,函数返回2...

========================
解答:

平台不同及兼容性问题的一个特殊地方是运行时对象的初始化和程序退出时与那相类象相关的析构操作。这种不同尤其表现在包含有多线程的时候,这是因为编译器没有附加的能力来顺序访问那些有先后之分的运行时对象(静态数据)的自动初始化和析构的方法。因此ACE说的一句话"静态是邪恶的",幸运的是,ACE提供了一种可移植的解决方案来解决对象初始化和析构的问题。

如果你的程序不是从标准的main()开始的,你需要在初始化和结束时用到对象管理器。你需要调用下面两个函数:

ace::init() 在其它ACE操作之行前初始化对象管理器。

ace::fini() 在你的ACE操作完成后,结束对象管理器。这个调用将触发注册在对象管理器中所有对象的clearup操作。

这对于Windows程序来说可能很要紧,因为Windows程序使有WinMain()好过于标准的main()函数,在库中使用ACE但用户找不到主程序入口。对于库来说,为库分别提供初始化结束化函数来分别调用ACE::init()和ACE::fini()是非常有用的。

posted on 2006-05-16 10:20 Stone Jiang 阅读(1100) 评论(0)  编辑 收藏 引用 所属分类: ACE

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理