我的vb程序调用一个dll,dll中分配了一个BSTR,请问,当我用vb获得了这个bstr之后,该如何释放?

解决方案 »

  1.   

    一般来说内存的分配与释放均应封装在DLL中比较合理,而DLL里面只有内存分配而将释放处理
    交给调用去处理这种做法是不合理的。
      

  2.   

    to  winehero(编程人生) :
    但现在的关键是,我们没有那个dll的源代码,只能从vb来下手解决问题,请问我该怎么办呢?
      

  3.   

    楼主逻辑混乱!别人的内存,你怎么可能释放呢?
    dll既然允许别的程序控制自己的内存,那说明它自身没有控制这段内存;
    既然没有控制,那还需要释放什么?
      

  4.   

    不能释放别人的内存,这是 windows 最基本的原则,
      

  5.   

    to  viena(维也纳nn-实心木头人):
    不好意思,你的这段我没看明白,既然已经分配了内存,为什么可以不释放呢?
    to  viena(维也纳nn-实心木头人),zlt982001(乐天) ,Gujianda(朝成暮毁):
    我看到msdn中有下面一段:
    我的理解是,
    一般情况下,分配和释放分配给 BSTR 的内存的规则如下: 
    当调用进来一个需要 BSTR 参数的函数时,必须在调用之前为 BSTR 分配内存,并且在完成操作之后将其释放。例如: 
    HRESULT IWebBrowser2::put_StatusText( BSTR bstr );
    // shows using the Win32 function 
    // to allocate memory for the string: 
    BSTR bstrStatus = ::SysAllocString( L"Some text" );
    if (bstrStatus == NULL)
       return E_OUTOFMEMORY;
    pBrowser->put_StatusText( bstrStatus );
    // Free the string:
    ::SysFreeString( bstrStatus );
    //...
    当调用进来一个返回 BSTR 的函数时,必须自己来释放字符串。例如: 
    HRESULT IWebBrowser2::get_StatusText( BSTR FAR* pbstr ); 
    //...
    BSTR bstrStatus;
    pBrowser->get_StatusText( &bstrStatus );
    // shows using the Win32 function 
    // to freee the memory for the string: 
    ::SysFreeString( bstrStatus );
    当实现返回 BSTR 的函数时,请分配字符串,但不要释放它。接收函数会释放内存。例如: 
    // Example shows using MFC's 
    // CString::AllocSysString
    //...
    HRESULT CMyClass::get_StatusText( BSTR * pbstr )
    {
       try
       {
          //m_str is a CString in your class
          *pbstr = m_str.AllocSysString( );
          }
       catch (...)
       {
          return E_OUTOFMEMORY;
       }
    // The client is now responsible for freeing pbstr.
    return( S_OK );
    }
    //...
      

  6.   

    winehero(编程人生)说的有道理啊
    既然是封装在Dll中的 自然应该在Dll中释放 
    即使没释放 也不应该在程序中处理
      

  7.   

    因为你根本不知道该DLL是怎么申请到那块内存的(SysAllocString?NEW?MALLOC?),所以你没法在VB里释放。而如果该DLL没有提供释放的入口,那么该DLL就不是个妥善的DLL。