─━ IT ━─

BSTR 및 C문자열 변환

DKel 2021. 8. 16. 00:37
반응형
처음에 Windows 프로그래밍에서는, Visual Basic 스타일과 C 언어 스타일의 문자열의 변환에 혼란해 버리는 일이 있다.이 변환 자체는 그다지 어렵지는 않다.어려운 것은, 변환의 세세한 규칙을 기억해 두는 것이다.일반적으로 흔히 이뤄지는 처리도 아닌 데다 MSDN에는 방대한 양의 문서가 있어 모르는 것이 있어도 쉽게 답을 찾을 수 없다.그러나 가장 곤란한 것은, 형캐스트를 실행해 컴파일도 정상적으로 할 수 있었는데, 프로그램이 생각대로 동작하지 않을 때다.이 경우 코드는 제대로 동작하지 않으며, 버그의 원인을 찾아내는 것도 곤란하다.이 문제를 여러 번 겪어보면 먼저 문자열 변환이 제대로 됐는지 확인하는 것이 중요하다는 것을 알 수 있을 것이다.C 문자열은 NULL 문자로 종료하는 문자배열이고 한쪽 Visual Basic 문자열은 선두에 그 문자열의 길이 정보를 포함하고 있다(VB 문자열은 자신의 길이를 인식하고 있다).또한 모든 VB 문자열은 Unicode이다(1문자당 16비트).문자열의 형태 다음의 경우는 BSTR/C 문자열의 변환이 필요하다.C/C++로 COM 프로그래밍을 하고 있는 경우
복수 언어의 어플리케이션(Visual Basic 어플리케이션으로부터 액세스 되는 C++ DLL 등)을 쓰고 있는 경우 C 언어의 문자열의 형태와 클래스 여기에서는, 다음의 C/MFC/ATL 문자열형을 채택한다.데모 프로젝트 이 데모 프로젝트는, MFC 다이얼로그 베이스의 애플리케이션에 각종의 변환을 실행하는 버튼을 추가했을 뿐이다.이건 VC++ 6.0으로 작성했어참고로 이 프로젝트에서 사용한 지원 함수를 소개한다.BSTR GetBSTR ( )
{
_ bstr _ t bstr 1 ( _ T ( ′ This is the test string . ′ )) ;

BSTR bstr ;

bstr = bstr 1 . copy ( ) ;

return bstr ;
}




CComBSTR GetComBSTR ( )
{
CComBSTR bstr ( ′ This is the test string . ′ ) ;

return bstr ;
}


void CVbsDlg :: ShowBSTR ( BSTR bstr )
{
_ bstr _ t bstrStart ( bstr ) ;

CString s ;

s . Format ( _ T ( ′ % s ′ ) , ( LPCTSTR ) bstrStart ) ;

AfxMessageBox ( s ) ;

}변환에서는 구체적인 코드를 살펴보자.이후에서는 각종 변환 기술을 소개한다. // BSTR to _ bst _ t

BSTR bstrStart = GetBSTR ( ) ;

// use the constructor
_ bstr _ t bstrFinal ( bstrStart ) ;

ShowBSTR ( bstrFinal ) ;

// Use the = operator
bstrFinal = bstrStart ;

Show BSTR(bstr Final);_bstr_t 클래스로부터 BSTR를 입수할 수 있다. // _ bstr _ t to BSTR

_ bstr _ t bstrStart ( _ T ( ′ This is the test string . ′ )) ;

BSTR bstrFinish ;

// use _ bstr _ t :: copy member function
bstrFinish = bstrStart . copy ( ) ;

ShowBSTR ( bstrFinish ) ;

// use = operator
bstrFinish = bstrStart ;

Show BSTR(bstr Finish); CCom BSTR 클래스로부터 BSTR를 입수할 수 있다. // CComBSTR to BSTR
CComBSTR bstrStart ( _ T ( ′ This is the test string . ′ )) ;

BSTR bstrFinish ;

// use the = operator
bstrFinish = bstrStart ;

ShowBSTR ( bstrFinish ) ;

// use the Copy member function
bstrFinish = bstrStart . Copy ( ) ;

ShowBSTR ( bstrFinish ) ; // _ bstr _ t to CComBSTR
_ bstr _ t bstrStart ( _ T ( ′ This is the test string . ′ )) ;

CComBSTR bstrFinish ;

bstrFinish . AppendBSTR ( bstrStart ) ;

Show BSTR(bstr Finish);(주:Unicode에서만 변환가능) // BSTR to C String

BSTR bstrStart ;

bstrStart = GetBSTR ( ) ;

TCHAR szFinal [ 255 ] ;

// direct conversion from BSTR to LPCTSTR only works
// in Unicode
_ stprintf ( szFinal , _ T ( ′ % s ′ ) , ( LPCTSTR ) bstrStart ) ;
AfxMessageBox ( szFinal ) ;

_ bstr _ t bstrIntermediate ( bstrStart ) ; // convert to
// _ bstr _ t
CString strFinal ;

// you have to go through _ bstr _ t to have it work in ANSI
// and Unicode
_ stprintf ( szFinal , _ T ( ′ % s ′ ) , ( LPCTSTR ) bstrIntermediate ) ;

// Or , using MFC

strFinal . Format ( _ T ( ′ % s ′ ) , ( LPCTSTR ) bstrIntermediate ) ;

Afx Message Box(str Final);(이 방법은 ANSI와 Unicode 모두에서 유효) _ bstr _ t bstrStart ( _ T ( ′ This is the test string . ′ )) ;
TCHAR szFinal [ 255 ] ;

_ stprintf ( szFinal , _ T ( ′ % s ′ ) , ( LPCTSTR ) bstrStart ) ;

AfxMessageBox ( szFinal ) ; ( 不可能 。_bstr_t를 경유할 필요) // CComBSTR to C String
CComBSTR bstrStart ( ′ This is the test string . ′ ) ;

_ bstr _ t bstrIntermediate ( bstrStart ) ;

TCHAR szFinal [ 255 ] ;

_ stprintf ( szFinal , _ T ( ′ % s ′ ) ,
( LPCTSTR ) bstrIntermediate ) ;

Afx Message Box(sz Final); 컨스트럭터 또는 =연산자 사용. // LPCTSTR to _ bstr _ t

LPCTSTR szStart = _ T ( ′ This is the text string ′ ) ;

// Use the constructor
_ bstr _ t bstrFinal ( szStart ) ;

ShowBSTR ( bstrFinal ) ;

// or use = operator
bstrFinal = szStart ;

Show BSTR(bstr Final); 컨스트럭터 또는 CCom BSTR :: Append 함수 사용. // LPCTSTR to CComBSTR

// Use a constructor

LPCTSTR szStart = _ T ( ′ This is the text string ′ ) ;

// Use the constructor
CComBSTR bstrFinal ( szStart ) ;

ShowBSTR ( bstrFinal ) ;

// Or use the Append function
bstrFinal . Empty ( ) ;
bstrFinal . Append ( szStart ) ;

Show BSTR(bstr Final); 여기서 소개한 변환기술은 모두 데모 프로젝트에서 동작이 확인되었다.다른 기술을 시도하고 싶은 사람은 데모프로젝트를 다운로드하여 수정하면 된다.오류가 있으면 꼭 보고해 주었으면 한다.
반응형