C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[579] 빌더에서 _bstr_t 클래스 사용하기.
김태선 [jsdkts] 9780 읽음    2006-03-04 00:45
COM 은 무조건 2바이트를 기본으로 하는 유니코드형 문자만을 사용합니다.
이를 엑세스하기 위한 기본 자료형은 wchat_t 형입니다.
이는 1바이트 문자형인 char 에 대응하는 것입니다.

보통은 wchar_t *을 BSTR 로 형정의(typedef)해서 사용하는데,
아무래도 원시적인 문자열에 대한 포인트에 불과하므로, AnsiString 같은 편리성이 없습니다.
그래서 빌더는 WideString형을 제공하지만,
경우에 따라서 BSTR 문자열을 쉽게 제어할 수 있는 클래스가 필요하기도 합니다.
(COM이나 COM이 아니거나 간에 또는 VC++과 호환을 맞추기 위해)
이 경우 comutil.h 에 정의되어 있는 COM 제어 지원용 _bstr_t 형 클래스를  사용하는 경우가 있습니다.
_bstr_t 는 AnsiString 과 유사하게 2바이트 유니코드 문자열을 다룰 수 있도록 해주는
C++에서만 제공되는 클래스입니다.

문제는 이를 프로그램에 사용하기 위해
#include <comdef.h>
를 하고 나서 컴파일하면 에러없이 잘되는데, 링크가 안된다는데 있습니다.
이유는  _bstr_t 클래스가 사용하는 몇가지 기본 함수가 RTL에 없기 때문입니다.
이 함수들은 bcbatl.lib 에 포함되어 있습니다.
그러므로 이를 링크시 포함시켜 주면 됩니다.

하지만 문제가 하나 더 있습니다.
_com_issue_error() 함수의 본체를 찾을 수 없다며 링크가 안됩니다.
이 함수는 _bstr_t 등의 처리시 에러 발생에 대한 처리를 사용자가 하기 위해 준비되어 있는 것으로
생각되는데(정확한 이유는 못 찾음), 이는 사용자가 함수를 만들어 주면 해결됩니다.

아래는 간단한 예제입니다.
아래에서는 그냥 에러나는 HRESULT 번호를 찍고 멈추게 했습니다.
VC 같은 경우는 ATLASSERT가 준비되어 있어 보다 안전한 종료를 돕는데,
빌더는 동일한 기능을 찾아본적이 없어 그냥 assert 로 대신했습니다.

누구 아시는 분이 댓글을 추가해주시면 좋겠군요.

// 폼에 버턴하나 메모장 하나 올려 놓고 코딩합니다.
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <comdef.h>
#include <assert.h>

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#pragma link "bcbatl.lib"

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    _bstr_t  s = "테스트";
    wchar_t  *s1 = s;

    Memo1->Lines->Add(s1); // wchat_t * 형은 AnsiString형에 바로 대입해도 되므로.
}
//---------------------------------------------------------------------------
// 사용자 에러 처리.

void __stdcall _com_issue_error(long HRESULT) throw(_com_error)
{
    //ATLASSERT(HRESULT);
    assert(HRESULT); // 본래는 _com_error 객체를 던지는 에러처리를 해야 함.
}
//---------------------------------------------------------------------------

+ -

관련 글 리스트
579 빌더에서 _bstr_t 클래스 사용하기. 김태선 9780 2006/03/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.