在LPCSTR追加BSTR(Appending BSTR in a LPCSTR)

2019-09-24 06:13发布

我有的receving一个BSTR类的功能。 在我的课堂我有一个成员变量是LPCSTR。 现在我需要追加BSTR插件LPCSTR。 我怎样才能做到这一点。 这里是我的功能。

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

在我m_classMember我想在此之后函数值应为“姓名:text_received_in_function”。 我怎样才能做到这一点。

Answer 1:

使用Microsoft特定_bstr_t类,它本身处理ANSI / Unicode的。 就像是

#include <comutils.h>
// ...

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

是什么,你几乎要。 然而,正如评论指出的那样,你必须管理的生命周期m_classMember和concatened字符串。 在上面的例子中,代码很可能崩溃。

如果你拥有的MyClass对象,你可以简单地增加一个成员变量:

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

然后使用m_classMember作为指针到的字符串内容m_concatened

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

否则,之前的分配m_classMember ,你应该释放它在您分配它以同样的方式( freedelete []等),并创建一个新char*您在其中复制concatened字符串的内容阵列。 就像是

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;
}

应该做的工作。



Answer 2:

首先,我建议你不要使用原始char/wchar_t*指针作为数据成员的字符串; 在一般情况下,它的更好(更简单,更易于维护,异常安全等),使用强大的C ++ 字符串类

既然你正在编写Windows代码,您可能需要使用ATL::CString ,这是很好的整合在Win32编程的情况下(如:它提供了一些便利,比如从资源加载的字符串,它工作外的开箱与TCHAR模型,等等)。

如果你想用工作TCHAR模型(并在这两个ANSI / MBCS和Unicode版本的代码编译),你可能会想使用ATL字符串转换辅助类 CW2T从转换BSTR (这是Unicode wchar_t* ),以char*在ANSI / MBCS建设,并把它作为wchar_t*在Unicode版本。

#include <atlstr.h>    // for CString
#include <atlconv.h>   // for CW2T

void MyClass::MyFunction(BSTR text)
{
    // Assume:
    // CString m_classMember;

    m_classMember = _T("Name: ");

    // Concatenate the content of the BSTR.
    // CW2T keeps the BSTR as Unicode in Unicode builds,
    // and converts to char* in ANSI/MBCS builds.
    m_classMember += CW2T(text);
}

相反,如果你只是想以Unicode编译(这是有道理的在当今世界)你的代码,你可以摆脱_T("...")装修CW2T ,并且只需使用:

void MyClass::MyFunction(BSTR text)
{
    // Assume:
    // CString m_classMember;

    m_classMember = L"Name: ";

    // Concatenate the content of the BSTR.
    m_classMember += text;
}

(或使用STL的std::wstring作为其他建议。)



文章来源: Appending BSTR in a LPCSTR