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 |
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 }