| CodeGuru Home | VC++ / MFC / C++ | .NET / C# | Visual Basic | Newsletters | VB Forums | Developer.com |
|
|||||||
| CodeGuru Individual FAQs The indivdual FAQs for CodeGuru. See the specific Topic FAQ forums for index pages and links to these Frequently Asked/Answered Questions. |
![]() |
|
|
Thread Tools | Search this Thread | Display Modes |
|
#1
|
||||
|
||||
|
MFC String: How to convert between a 'CString' and a 'BSTR'?
Q: How to convert between a 'CString' and a 'BSTR'?
A: 'CString' to 'BSTR': Use the AllocSysString member function of the CString: 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. 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: Code:
HRESULT SomeOLEFunction(BSTR& bstr)
{
bstr = ::SysAllocString(L"Hello");
return S_OK;
}
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 Last edited by Andreas Masur; July 24th, 2005 at 07:48 AM. |
|
#2
|
|||
|
|||
|
Re: MFC String: How to convert between a 'CString' and a 'BSTR'?
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. Last edited by Andreas Masur; July 24th, 2005 at 07:49 AM. |
|
#3
|
||||
|
||||
|
Re: MFC String: How to convert between a 'CString' and a 'BSTR'?
Code:
#include <comutil.h> BSTR bstr; SomeOLEFunction(bstr); CString cs(com_util::ConvertBSTRToString(bstr)); AfxMessageBox(cs, MB_OK, 0); Last edited by Andreas Masur; July 24th, 2005 at 07:49 AM. |
![]() |
| Bookmarks |
|
||||||
| Thread Tools | Search this Thread |
| Display Modes | |
|
|