2012-10-18 9 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이 함수 값은 "Name : text_received_in_function"이어야합니다. 어떻게 할 수 있니?

+0

이 클래스의 멤버입니다. LPCSTR입니다. 여기에서 사용해야하는 것은 –

+0

입니다. 아무 것도 가리키고 있지 않습니다. –

답변

2

기본적으로 ANSI/유니 코드를 처리하는 Microsoft 특정 _bstr_t 클래스를 사용하십시오. 예 :

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

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

거의 원하는 것입니다. 그러나 언급에 의해 지적 된 바와 같이, 당신은 m_classMember과 concatened 문자열의 수명을 관리해야합니다. 위의 예에서 코드는 충돌 할 가능성이 높습니다.

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

을 다음 m_concatened의 문자열 내용에 대한 포인터로 m_classMember를 사용 : 당신이 MyClass 객체를 소유하고 있다면

, 당신은 단순히 다른 멤버 변수를 추가 할 수 있습니다.

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

그렇지 않으면, m_classMember의 할당하기 전에, 당신은 당신이 그것을 할당 같은 방법으로 (free, delete [] 등)에서 무료, 당신은 concatened의 콘텐츠를 복사하는 새로운 char* 배열을 생성한다 끈. 예 :

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 코드를 작성 했으므로 Win32 프로그래밍의 컨텍스트에서 잘 통합 된 ATL::CString을 사용할 수 있습니다 (예 : 리소스에서 문자열로드와 같은 몇 가지 편의 기능을 제공하며, out-of-the- TCHAR 모델이있는 상자 등).

당신이 TCHAR 모델로 작업 (및 ANSI/MBCS와 유니 코드 빌드 모두에서 코드를 컴파일 가능한을)하려는 ​​경우, 당신은 ATL string conversion helper classCW2T가에 char*에 (유니 코드 wchar_t* 인) BSTR 변환하는 방법을 사용할 수 있습니다 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); 
} 

대신, 당신은 _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을 사용하십시오.