ACE运行时的初始化和结束时的回收操作(From:Focus on ACE)

本文探讨了在Windows环境下使用ACE库时遇到的问题,特别是当ACE库被用作DLL时出现的连接失败现象。文章提供了两种不同场景下的代码示例,并分析了问题产生的原因在于DLL的初始化与结束过程中的对象管理。提出了在非标准main函数启动的应用中如何通过调用ACE提供的初始化和结束函数来解决此类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


   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()是非常有用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值