2012-10-18 22 views
3

我有一個接收BSTR的類函數。在我的班級中,我有一個LPCSTR成員變量。現在我需要在LPCSTR中追加BSTR。我如何做到這一點。 這是我的功能。在LPCSTR中追加BSTR

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

在我的m_classMember我希望這個函數的值應該是「名稱:text_received_in_function」後。我怎麼能做到這一點。

+0

這是類的成員,它是LPCSTR,我應該在這裏使用, –

+0

它沒有指向任何東西, –

回答

2

使用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的生存期和字符串。在上面的例子中,代碼可能會崩潰。

如果你擁有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; 
} 

應該做的工作。

1

首先,我建議你不是使用原始char/wchar_t*指針作爲字符串的數據成員;通常,使用強健的C++ 字符串類會更好(更簡單,更易於維護,異常安全等)。

由於您正在編寫Windows代碼,因此您可能希望使用ATL::CString,它很好地集成在Win32編程的上下文中(例如:它提供了一些便利,如從資源加載字符串,它可以實時運行,與TCHAR模型等)。

如果你想用TCHAR模式工作(並在這兩個ANSI/MBCS和Unicode版本的代碼編譯),你可能會想使用ATL string conversion helper classCW2TBSTR轉換(這是Unicode wchar_t*)以char*在ANSI/MBCS構建,並將其保留爲Unicode構建中的wchar_t*

#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正如其他建議。)