Introduction
When we do COM or ActiveX programming, we often have to cope with BSTR strings.
Even thought there are APIs for BSTR manipulation, it is a bit difficult to safely manage
the BSTR string. This article presents an easy way to manage the
BSTR string using the CString class.
Managing BSTR is difficult
We usually use conversion macros like OLE2A, A2BSTR etc.
But before using these macros, we should specify USES_CONVERSION macro at
the beginning of the function in order to avoid compiler errors. We should also include
the atlconv.h file to use these macros. It is also difficult to directly do
operations like appending, searching etc. in a BSTR string.
Easy way
There is an easy way to manipulate BSTR string using the MFC
CString class.
CString constructor accepts the LPCWSTR. LPCWSTR is nothing but the
unsigned short*. i.e. the BSTR. Apart from this the operator = is overloaded
in CString class to support assignment operation. CString class also contains a
member function AllocSysString() which returns the BSTR string corresponding to
the CString object. Use the API SysFreeString to free the
BSTR string when
we no longer need the BSTR string.
Converting a BSTR to CString object sample:
void f(BSTR bStr)
{
CString csStr = bStr; ...
}
Converting a CString object to BSTR:
void SomeFunction()
{
...
CString csStr = "Hello World!";
BSTR bStr = csStr.AllocSysString();
f(bStr)
::SysFreeString(bStr); ...
}
Using temporary objects:
We can also use temporary objects of the CString class as follows.
Suppose we want to compare the right 3 characters of a BSTR with another
string, we can do as shown in the below function by using a temporary CString object.
void SomeFun()
{
...
if(!CString(bStr).Right(3).Compare("man"))
{
}
...
}