Click to See Complete Forum and Search --> : MFC String: How to convert between a 'CString' and a 'BSTR'?


Gabriel Fleseriu
February 14th, 2003, 03:55 AM
Q: How to convert between a 'CString' and a 'BSTR'?

A:

'CString' to 'BSTR':

Use the AllocSysString member function of the CString:


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.


::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:


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:

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.
<br><br>

rhaggard
February 18th, 2005, 10:11 AM
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.
<br><br>

Sahir
March 20th, 2005, 12:50 AM
#include &lt;comutil.h&gt;

BSTR bstr;
SomeOLEFunction(bstr);
CString cs(com_util::ConvertBSTRToString(bstr));
AfxMessageBox(cs, MB_OK, 0);

<br><br>