Re: Assigning a BSTR to a CString
Hi Giovanni
You may put a breakpoint for operator= and trace the code that is being
executed.
I already have done this. Debugging deeper and deeper I reach the statement
return( ::HeapAlloc( m_hHeap, 0, nBytes ) );
and this returns a NULL pointer, then here begins the error. This is 100%
MicroSoft code, so it is hard to modify this behaviour in some way.
BTW: if your method which takes the CString as input does *not* modify the
string, why don't you just pass a *pointer*?
i.e. just pass a pointer to the first BSTR Unicode character.
// Not good:
// HRESULT SaveStringToDB( CString str );
// Better (just pass pointer):
HRESULT SaveStringToDB( const wchar_t * str );
So you don't have to allocate a new block on the heap.
G
Well, to save I use a const reference, so I don't need to make a second
copy:
HRESULT SaveStringToDB( const CString& str );
I think it is a similar approach to using a pointer. The problem is in the
first copy when I try to fill the CString
HRESULT FillWithXML(CString& strXML)
{
... // A call to MSXML.dll to retrieve the BSTR with the XML
strXML = bstrXML;
...
}
One additional problem is that I don't have full freedom to modify the
method interface, because it is not just my code, but a class method widely
used by several people in my company since some years ago, so I would break
code if I change the method declaration. The only way would be to write a
FillWithXML2 method and use this one instead the previous one.
Anyway, thanks you for your comments and advice, Giovanni.
Jorge.