Search code examples
c++string-concatenationbstrlpcstr

Appending BSTR in a LPCSTR


I have a class function which is receving a BSTR. In my class I have a member variable which is LPCSTR. Now I need to append BSTR ins LPCSTR. How I can do that. Here is my function.

void MyClass::MyFunction(BSTR text)
{
    LPCSTR name = "Name: ";
    m_classMember = name + text; // m_classMember is LPCSTR.
}

in my m_classMember I want that after this function value should be "Name: text_received_in_function". How i can do that.


Solution

  • Use the Microsoft specific _bstr_t class, which handles the ANSI/Unicode natively. Something like

    #include <comutils.h>
    // ...
    
    void MyClass::MyFunction(BSTR text)
    {
        _bstr_t name = "Name: " + _bstr_t(text, true);
        m_classMember = (LPCSTR)name;
    }
    

    is what you almost want. However, as pointed out by the remarks, you have to manage the lifetime of m_classMember and the concatened string. In the example above, the code is likely to crash.

    If you own the MyClass object, you could simply add another member variable:

    class MyClass {
    private:
      _bstr_t m_concatened;
    //...
    };
    

    and then use m_classMember as a pointer to the string content of m_concatened.

    void MyClass::MyFunction(BSTR text)
    {
        m_concatened = "Name: " + _bstr_t(text, true);
        m_classMember = (LPCSTR)m_concatened;
    }
    

    Otherwise, prior to the assignment of m_classMember, you should free it in the same way you allocated it (free, delete [], etc), and create a new char* array in which you copy the content of the concatened string. Something like

    void MyClass::MyFunction(BSTR text)
    {
        _bstr_t name = "Name: " + _bstr_t(text, true);
    
        // in case it was previously allocated with 'new'
        // should be initialized to 0 in the constructor
        delete [] m_classMember; 
        m_classMember = new char[name.length() + 1];
    
        strcpy_s(m_classMember, name.length(), (LPCSTR)name);
        m_classMember[name.length()] = 0;
    }
    

    should do the work.