CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 3 of 3
  1. #1
    Join Date
    Jun 2001
    Location
    Switzerland
    Posts
    4,443

    MFC String: How to convert between a 'CString' and a 'BSTR'?

    Q: How to convert between a 'CString' and a 'BSTR'?

    A:

    'CString' to 'BSTR':

    Use the AllocSysString member function of the CString:

    Code:
    CString cs("Hello");
    BSTR bstr = cs.AllocSysString();
    If you pass the 'BSTR' to some OLE function, this will normally free the 'BSTR' memory when done with it.

    If you use the 'BSTR' by yourself, dont forget to call '::SysFreeString()' when you're done with it.

    Code:
    ::SysFreeString(bstr);
    'BSTR' to 'CString':

    You will mostly need this when you have some OLE function that returns a 'BSTR'. Such an OLE Function will basically do something like this:

    Code:
    HRESULT SomeOLEFunction(BSTR& bstr)
    {
      bstr = ::SysAllocString(L"Hello");
      return S_OK;
    }
    Use a temporary variable of the type '_bstr_t' to wrap the 'BSTR'. This way you handle both the 208 and make sure that you have no memory leak:
    Code:
    BSTR bstr;
    SomeOLEFunction(bstr);
    _bstr_t tmp(bstr, FALSE);   //wrap the BSTR
    CString cs(static_cast<const char*>(tmp));  //convert it
    AfxMessageBox(cs, MB_OK, 0);
    // when tmp goes out of scope it will free the BSTRs memory
    Note, that this won't work in a UNICODE build.


    Last edited by Andreas Masur; July 24th, 2005 at 06:48 AM.

  2. #2
    Join Date
    Jan 2005
    Posts
    1

    Re: MFC String: How to convert between a 'CString' and a 'BSTR'?

    This statement is incorrect: "If you pass the BSTR to some OLE function, this will normally free the BSTRs memory when done with it."

    The general rule to COM resource is, if you allocate it then you release it. The only exception is when a value is passed over a COM interface as an OUT param. In that case, the receiver of the value is responsible for releasing the resource.

    This sort of mistake is particularly onerous because the memory leaked is not associated with the process that leaked it. The only way that this leak is recovered is by reboot of the system.


    Last edited by Andreas Masur; July 24th, 2005 at 06:49 AM.

  3. #3
    Join Date
    Aug 2002
    Location
    Kerala
    Posts
    1,183

    Re: MFC String: How to convert between a 'CString' and a 'BSTR'?

    Code:
    #include <comutil.h>
    
    BSTR bstr;
    SomeOLEFunction(bstr);
    CString cs(com_util::ConvertBSTRToString(bstr)); 
    AfxMessageBox(cs, MB_OK, 0);

    Last edited by Andreas Masur; July 24th, 2005 at 06:49 AM.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured