Q: How to convert between a 'CString' and a 'BSTR'?
A:
'CString' to 'BSTR':
Use the AllocSysString member function of the CString:
If you pass the 'BSTR' to some OLE function, this will normally free the 'BSTR' memory when done with it.Code:CString cs("Hello"); BSTR bstr = cs.AllocSysString();
If you use the 'BSTR' by yourself, dont forget to call '::SysFreeString()' when you're done with it.
'BSTR' to 'CString':Code:::SysFreeString(bstr);
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:
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:HRESULT SomeOLEFunction(BSTR& bstr) { bstr = ::SysAllocString(L"Hello"); return S_OK; }
Note, that this won't work in a UNICODE build.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




Reply With Quote