Skip to content

CComBSTR Basics

This section describes common usage of the CComBSTR smart data type.

When implementing a method that should return a BSTR, either as [out, retval], [in, out] or [out], the BSTR should be allocated by the driver and freed by the client.

HRESULT Acme4321::IAcme4321Display_get_Text(BSTR* val)
{
HRESULT hr = S_OK;
CComBSTR bstrText(_T("Hello world."));
// Assign the internal BSTR while transfering ownership
*val = bstrText.Detach();
return hr;
}

Although using Detach is preferred (it doesn’t allocate a new BSTR unnecessarily), it is sometimes more appropriate to use CopyTo, as in the following example. Since the string we want to return is kept in a member variable, we do not want the internal BSTR ownership transferred to the caller.

class Acme4321
{
...
CComBSTR m_bstrText;
};
HRESULT Acme4321::IAcme4321Display_get_Text(BSTR* val)
{
HRESULT hr = S_OK;
// Copy the string
hr = m_bstrText.CopyTo(val);
return hr;
}
Receiving

When a client application calls a driver that returns a BSTR, the client must free the BSTR that is allocated by the driver.

void main()
{
// Initialize COM, create instance of object...
CComBSTR bstrText;
hr = pDriver->get_Text(&bstrText);
if (SUCCEEDED(hr))
{
// Do something with the string that is received...
}
// String will be freed by the destructor
// Release instance of object, terminate COM...
}

More information is available in the MSDN documentation for CComBSTR.