BSTR --> _bstr_t
_bstr_t bstrDes(bstrSrc); // Constructor.
bstrDes = bstrSrc; // Operator "=" function
_bstr_t --> BSTR
BSTR bstrDes = bstrSrc.copy();
BSTR bstrDes = bstrSrc; // Operator "="
This article deals with the following C/MFC/ATL string types:
String Type | Description |
char/wchar/TCHAR | The C strings for ANSI and Unicode |
CString | The C++/MFC class wrapper for C strings |
BSTR | The Visual Basic string type |
_bstr_t | A C++ class wrapper for the Visual Basic string type |
CComBSTR | Yet another C++ class wrapper for the Visual Basic string type used predominately in ATL code |
The demo project is just an MFC dialog-based application with buttons for each type of conversion. It is built using VC++ 6.0. It uses a couple of support functions you may find helpful:
BSTR GetBSTR() { _bstr_t bstr1(_T("This is the test string.")); BSTR bstr; bstr = bstr1.copy(); return bstr; } CComBSTR GetComBSTR() { CComBSTR bstr("This is the test string."); return bstr; } void CVbsDlg::ShowBSTR(BSTR bstr) { _bstr_t bstrStart(bstr); CString s; s.Format(_T("%s"), (LPCTSTR)bstrStart); AfxMessageBox(s); }
So, let's get to it. Here are the conversion techniques:
Converting BSTR to _bstr_t Converting a _bstr_t to BSTR Converting a CComBSTR to BSTR Converting _bstr_t to CComBSTR Converting BSTR to C String
(Note: conversion that only works in Unicode)
// BSTR to C String
BSTR bstrStart;
bstrStart = GetBSTR();
TCHAR szFinal[255];
(this works in both ANSI and Unicode)
_bstr_t bstrStart(_T("This is the test string.")); TCHAR szFinal[255]; _stprintf(szFinal, _T("%s"), (LPCTSTR)bstrStart); AfxMessageBox(szFinal);
(not possible; must go through _bstr_t)
// CComBSTR to C String
CComBSTR bstrStart("This is the test string.");
_bstr_t bstrIntermediate(bstrStart);
TCHAR szFinal[255];
_stprintf(szFinal, _T("%s"),
(LPCTSTR)bstrIntermediate);
AfxMessageBox(szFinal);
Use a constructor or = operator
// LPCTSTR to _bstr_t LPCTSTR szStart = _T("This is the text string"); // Use the constructor _bstr_t bstrFinal(szStart); ShowBSTR(bstrFinal); // or use = operator bstrFinal = szStart; ShowBSTR(bstrFinal);
Use a constructor or CComBSTR::Append function
// LPCTSTR to CComBSTR // Use a constructor LPCTSTR szStart = _T("This is the text string"); // Use the constructor CComBSTR bstrFinal(szStart); ShowBSTR(bstrFinal); // Or use the Append function bstrFinal.Empty(); bstrFinal.Append(szStart); ShowBSTR(bstrFinal);Converting _bstr_t to C String Converting CComBSTR to LPCTSTR Converting LPCTSTR to _bstr_t Converting LPCTSTR to CComBSTR
// BSTR to _bst_t BSTR bstrStart = GetBSTR(); // use the constructor _bstr_t bstrFinal(bstrStart); ShowBSTR(bstrFinal); // Use the = operator bstrFinal = bstrStart; ShowBSTR(bstrFinal);
You may want to get a BSTR from a _bstr_t class.
// _bstr_t to BSTR _bstr_t bstrStart(_T("This is the test string.")); BSTR bstrFinish; // use _bstr_t::copy member function bstrFinish = bstrStart.copy(); ShowBSTR(bstrFinish); // use = operator bstrFinish = bstrStart; ShowBSTR(bstrFinish);
You may want to get a BSTR from a CComBSTR class.
// CComBSTR to BSTR CComBSTR bstrStart(_T("This is the test string.")); BSTR bstrFinish; // use the = operator bstrFinish = bstrStart; ShowBSTR(bstrFinish); // use the Copy member function bstrFinish = bstrStart.Copy(); ShowBSTR(bstrFinish);
// _bstr_t to CComBSTR
_bstr_t bstrStart(_T("This is the test string."));
CComBSTR bstrFinish;
bstrFinish.AppendBSTR(bstrStart);
ShowBSTR(bstrFinish);