본문 바로가기
개발언어/C++

COM 으로 구현된 우편번호 검색에 접근하여 값 문자열 변환하여 전달 받기 Converting with ATL Macros

by 엔돌슨 2010. 5. 28.
반응형

COM 으로 구현된 우편번호 검색에 접근하여 값 문자열 변환하여 전달 받기

프로젝트들은 dll로 모두 나누워져있다. 그리고 com으로 구현한것은 vb, c++, java, c# 어느 언어로 구현되었다고 하더라도
공통적으로 쓸 수 있는 모듈로 구성하기 위함이다.
여기서 중요한것은 어떤 언어에서 자료형이 다른 언어에서 자료형과 동일하지 않다는 것이다.

그래서 com으로 구현하므로 그 모듈에 접근하여 함수를 호출한 결과값을 해당 매크로로 변환작업을 거쳐
값을 전달 받을 수 있는 것이다.

값을 변환 할때 매크로를 쓰게 된다.
참고 사이트 : http://dozob.springnote.com/pages/1428956.xhtml


Converting with ATL Macros

ATL provides a group of macros to convert between different types. Because one convertion involves a series of temporary variables to hold and swap the string buffers, the space is prepared by macro USES_CONVERSION, which should be called before any conversion. They are defined in <atlconv.h>.

 

ANSI to ...

OLE to ...

TCHAR to ...

wchar_t to ...

A2BSTR

OLE2A

T2A

W2A

A2COLE

OLE2BSTR

T2BSTR

W2BSTR

A2CT

OLE2CA

T2CA

W2CA

A2CW

OLE2CT

T2COLE

W2COLE

A2OLE

OLE2CW

T2CW

W2CT

A2T

OLE2T

T2OLE

W2OLE

A2W

OLE2W

T2W

W2T

 

USES_CONVERSION;

MessageBox(NULL, W2A(bstr), NULL, MB_OK);

참고사이트: http://progtutorials.tripod.com/COM.htm 


아래 예제는 주소록 모듈에 접근하여 값을 받아 오는 예제이다.

1 //////////////////////////////////////////////////////////////////////////
2 /**
3 @brief :   FindAddress2
4     
5 @date  :   2010-05-28 오전 10:07:08
6 @author:   Kwangho Park
7 @remark:   주소찾기
8 수정내역
9 -------------------------------------------------------------------------
10 2010-05-28
11 */
12 BOOL CIntroData::FindAddress2(long lMode, CString strData)
13 {
14     CComPtr<_Connection>        unkn;                // 접근 커넥션 스마트포인터
15     CComPtr<IZipCodeModule>        pZipCodeModule;        // 주소록모듈 스마트포인터
16
17     // 데이타베이스 Connect로 접근커넥트 넘김.
18     m_obADOConnection.m_pobConnection.QueryInterface(&unkn);
19
20     // 내부적으로 com으로 접근하는 것을 생성..
21     HRESULT hr = pZipCodeModule.CoCreateInstance(__uuidof(ZipCodeModule));
22
23     // 넘겨받은 접근이 정상이 아니면.
24     if(FAILED(hr))
25     {
26         MessageBox(_T("주소찾기 컴포넌트를 생성할 수 없습니다."),
27                    _T("알림"), MB_ICONINFORMATION);
28         return FALSE;
29     }
30            
31     USES_CONVERSION;        // 문자열 변환을 쉽게 하기 위한 매크로..
32
33     BSTR    bstrData, bstrVillage, bstrZipCode, bstrAddress;        // BSTR로 선언
34     CString strZipCode, strAddress;                                    // 우편번호, 주소
35     VARIANT_BOOL    varbResult = VARIANT_FALSE;
36
37     bstrData    = T2BSTR(strData);        //TCHAR to BSTR로 변경.
38     bstrVillage = T2BSTR(_T(""));
39     bstrZipCode = T2BSTR(_T(""));
40     bstrAddress = T2BSTR(_T(""));
41
42     // 주소검색.
43     hr = pZipCodeModule->SearchAddressNZipcode(unkn, lMode, bstrData, &bstrZipCode, &bstrAddress, &varbResult);
44    
45     // 만약 실패시 할당된 BSTR을 해제.
46     if(FAILED(hr) || varbResult == VARIANT_FALSE)
47     {
48         SysFreeString(bstrVillage);
49         SysFreeString(bstrZipCode);
50         SysFreeString(bstrAddress);
51         return FALSE;
52     }   
53
54     // 검색한 우편번호와 주소를 받음.
55     strZipCode = OLE2T(bstrZipCode);        // OLE to TCHAR로 변경.
56     strAddress = OLE2T(bstrAddress);
57
58     // 받은 우편번호와 주소를 컨트롤에 출력(전달).
59     m_editIntroZip.SetMaskText(strZipCode);
60     m_editIntroAddr.SetWindowText(strAddress);
61     m_editIntroAddr2.SetFocus();    //포커스 지정.
62    
63     // 할당된. BSTR 을 해제.
64     SysFreeString(bstrData);
65     SysFreeString(bstrVillage);
66     SysFreeString(bstrZipCode);
67     SysFreeString(bstrAddress);
68
69     return TRUE;
70 }