第一种对了第二种的话.......编译能过吗? 这个这个...CComBSTR....有那个那个 CopyTo 方法吗??
你是不是想写 m_FileName=bstr.Copy();
那样的话, 确实没有释放。

解决方案 »

  1.   

    惭愧,俺一直都用第二种,编译没问题,做出来的COM在VB里用也没问题。
    CComBSTR有这个CopyTo方法。估计和你说的bstr.Copy()一样的。那怎样释放呢?(第二种)
      

  2.   

    sorry , 我在MSDN文档里没有发现 CComBSTR有 CopyTO 的方法, 就以为没有此方法。后来,看了ATL的源代码,才发现有这个方法。下面是  CommBSTR::CopyTo 的实现代码。 HRESULT CopyTo(BSTR* pbstr)
    {
    ATLASSERT(pbstr != NULL);
    if (pbstr == NULL)
    return E_POINTER;
    *pbstr = ::SysAllocStringLen(m_str, ::SysStringLen(m_str));
    if (*pbstr == NULL)
    return E_OUTOFMEMORY;
    return S_OK;
    }
    如果 m_FileName的类型是BSTR的话,我想应该用 bstr.CopyTo(&m_FileName);(有&符)我们已经看到 CopyTo 如何为m_FileName 分配的内存。只要析构时 ::SysFreeString一下就好了,和第一种的释放方法没有区别。不过我觉得如果你这样写会更省事一点, 让 CComBSTR自己管理内存
    class CLog{
        CComBSTR m_FileName;
        CLog(){
        m_FileName=_T("C:\\logger.log");
        }
    }