멀티미디어 지식공작소 | 'COM' 태그의 글 목록
멀티미디어 지식공작소 위치로그  |  태그  |  미디어로그  |  방명록
icon COM 에 해당하는 글2 개
2008.02.03   [펌] .NET Compact Framework 2.0 응용 프로그램에 COM 개체 통합


icon [펌] .NET Compact Framework 2.0 응용 프로그램에 COM 개체 통합
프로그램 기술/C/C++/MFC | 2008. 2. 3. 18:16

단계별 작업: .NET Compact Framework 2.0 응용 프로그램에 COM 개체 통합

 

Microsoft Corporation

2005년 11월

적용 대상:
Microsoft .NET Compact Framework 버전 2.0
Microsoft Visual Studio 2005
Windows Mobile 기반 장치

요약: 각 사용자에 따라 진행 속도를 조절할 수 있는 이 기사의 실습을 통해 Microsoft .NET Compact Framework 2.0을 사용하여 기존의 기본 COM 개체를 관리되는 응용 프로그램에 보다 쉽게 통합하는 방법을 배울 수 있습니다. 또한 몇 개의 예제를 통해 COM 개체를 준비하여 .NET Compact Framework 프로젝트에 통합하고 관리되는 코드에서 이러한 개체를 호출하는 방법에 대해 알아보겠습니다. 이 실습을 완료하면 레거시 COM 개체를 모두 다시 작성할 필요 없이 .NET Compact Framework 응용 프로그램에서 직접 사용하는 방법을 알 수 있습니다. 이 실습은 레벨 300 실습이며 완료하려면 90분이 소요됩니다.

Microsoft 다운로드 센터에서 MED301_COM_NETCF2를 다운로드하십시오.

목차

소개
연습 1: Visual Studio 2005를 사용하여 COM 개체 만들기 및 사용
연습 2: 관리되는 응용 프로그램 내에서 Pocket Outlook 액세스
연습 3: 차세대 Windows Mobile 기반 장치에서 Pocket Outlook 액세스
부록 A: 장치 또는 에뮬레이터에서 실행 중인 응용 프로그램 종료
요약

이 연습을 완료하려면 다음이 필요합니다.

참고    이전 실습에서 에뮬레이터를 사용한 경우에는 이 실습을 시작하기 전에 해당 에뮬레이터의 하드 리셋을 수행해야 합니다. 에뮬레이터에서 File(파일)을 클릭하고 Reset(다시 시작)을 가리킨 다음 Hard(하드)를 클릭하면 됩니다.
배포 중에 프로세스 또는 파일이 사용 중이라는 오류가 발생하는 경우에는 해당 프로그램이 에뮬레이터에서 아직 실행 중인 것이므로, 프로그램을 끝내야 새 복사본을 배포 및 실행할 수 있습니다. 이 오류는 에뮬레이터를 배포하는 실습 중에 언제든 발생할 수 있습니다. 실행 중인 응용 프로그램을 끝내는 방법에 대한 지침을 보려면 이 실습의 부록을 참조하십시오.

소개

이 실습에서는 Microsoft .NET Compact Framework 버전 2.0을 사용하여 기존의 기본 COM 개체를 관리되는 응용 프로그램에 통합하는 방법을 배웁니다. 또한 몇 개의 예제를 통해 COM 개체를 준비하여 .NET Compact Framework 프로젝트에 통합하고 관리되는 코드에서 이러한 개체를 호출하는 방법에 대해 알아보겠습니다. 이 실습을 완료하면 레거시 COM 개체를 모두 다시 작성할 필요 없이 .NET Compact Framework 응용 프로그램에서 직접 사용하는 방법을 알 수 있습니다.

이 실습의 연습을 모두 완료하려면 시간이 많이 소요될 수 있으므로 자신에게 꼭 필요한 연습만 선택하여 수행하십시오. 각 연습은 완전히 새로운 프로젝트로 시작하며 특별한 연습 수행 순서는 없습니다.

  • Visual Studio 2005를 사용하여 COM 개체 만들기 및 사용
  • 관리되는 응용 프로그램에서 Pocket Outlook에 액세스
  • 차세대 Windows Mobile 기반 장치에서 Pocket Outlook에 액세스

연습 1: Visual Studio 2005를 사용하여 COM 개체 만들기 및 사용

이 연습에서는 .NET Compact Framework 2.0 응용 프로그램에서 사용할 COM 개체를 만듭니다. 여러 가지 작업을 수행하여 완전한 Pocket PC 응용 프로그램을 빌드하는 이 기사의 실습은 이 연습에서부터 시작합니다. 앞으로 확인하겠지만, Visual Studio 2005를 사용하면 관리되는 .NET Compact Framework 응용 프로그램을 만들 수 있을 뿐 아니라 ATL 및/또는 MFC가 지원되는 장치용 기본 Visual C++ 응용 프로그램도 만들 수 있습니다.

새 Pocket PC 프로젝트를 만들려면

1. 바탕 화면의 아이콘 또는 시작 메뉴를 사용하여 Visual Studio 2005를 시작합니다.

2. 메뉴에서 파일 | 새 프로젝트를 선택합니다.

3. 새 프로젝트 대화 상자의 프로젝트 형식 아래에서 Visual C++ | Pocket PC 2003이 선택되어 있는지 확인합니다.

4. 템플릿 아래에서 ATL 스마트 장치 프로젝트가 선택되어 있는지 확인합니다.

5. 이름 입력란에서 이름을 MyCOMObject로 변경합니다.

6. 위치 입력란에 C:\labs\COMInteropLab을 입력하거나 원하는 드라이브를 선택합니다.

7. 솔루션용 디렉터리 만들기 확인란이 아래 그림처럼 선택되어 있는지 확인합니다.

8. 확인을 클릭하여 ATL 스마트 장치 프로젝트 마법사를 시작합니다.

이 마법사는 COM 개체를 만드는 과정을 안내합니다. 몇 가지 기본 정보를 입력해야 하지만 대부분의 설정은 그대로 사용하면 됩니다.

9. 마법사의 시작 페이지에서 다음 그림과 같이 다음을 클릭합니다.

ATL 스마트 장치 프로젝트 마법사의 플랫폼 페이지에서 다음 그림과 같이 선택한 SDK 아래에 Pocket PC 2003이 있는지 확인한 후에 다음을 클릭합니다.

10. ATL 스마트 장치 프로젝트 마법사의 응용 프로그램 설정 페이지에서 서버 유형 아래에 DLL(동적 연결 라이브러리)이 선택되어 있는지 확인합니다.

11. 마침을 클릭하여 마법사를 끝냅니다.

COM 구성 요소 역할을 할 모든 코드가 들어 있는 MyCOMObject라는 새 프로젝트가 만들어집니다. 이 개체를 의미 있는 COM 개체로 만들려면 자신의 특정 COM 개체를 위한 기능을 추가해야 합니다.

COM 개체에 새 클래스를 추가하려면

1. 솔루션 탐색기에서 MyCOMObject 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 클래스를 클릭합니다. 또는 Visual Studio 2005 메뉴에서 프로젝트 | 클래스 추가를 선택합니다.

2. 클래스 추가 대화 상자의 범주 트리에서 다음 그림과 같이 ATL을 선택하고 사용 가능한 템플릿 목록에서 ATL 단순 개체가 선택되어 있는지 확인합니다.

3. 추가 단추를 클릭합니다.

ATL 단순 개체 마법사가 시작됩니다. 이 마법사에서는 새 프로젝트의 이름 및 일부 특정 개체 설정을 지정합니다.

4. ATL 단순 개체 마법사의 이름 페이지에서 다음 그림과 같이 C++ 약식 이름 입력란에 SimpleCalc를 입력하고 다른 값은 모두 기본값을 그대로 사용합니다.

5. 다음을 클릭합니다.

6. ATL 단순 개체 마법사의 옵션 페이지 스레딩 모델 아래에서 자유를 선택합니다.

7. ATL 단순 개체 마법사의 옵션 페이지 인터페이스 아래에서 다음 그림과 같이 사용자 지정을 선택합니다.

8. 마침을 클릭합니다.

ATL 단순 개체 마법사에서 여러 개의 새 파일이 만들어지며, 이 파일에 메서드 및 인터페이스를 추가하여 COM 개체에 기능을 부여하게 됩니다. 이제 구현할 COM 개체에는 덧셈, 뺄셈, 곱셈, 나눗셈 등의 몇 가지 기본적인 산술 함수가 포함되어 있습니다. 이러한 기능은 단순하지만 관리되는 .NET Compact Framework 응용 프로그램과 COM 개체가 상호 운용되는 방식을 이해하는 데 도움이 됩니다.

이제 SimpleCalc를 구현합니다. 앞으로 작성할 모든 메서드는 COM 인터페이스를 통해 제공됩니다. 즉, COM 클라이언트가 메서드에 액세스할 수 있으며 관리되는 클라이언트 응용 프로그램은 COM Interop를 통해 SimpleCalc의 메서드에 액세스할 수 있습니다. 이에 대해서는 이 실습의 뒷부분에서 살펴보겠습니다.

SimpleCalc 기능을 구현하려면

1. Visual Studio 2005 메뉴에서 보기 | 클래스 보기를 선택하거나 바로 가기 키 Ctrl+W+C를 사용하여 클래스 보기로 변경합니다.

2. 클래스 보기 창에서 MyCOMObject를 확장하고 ISimpleCalc 인터페이스를 마우스 오른쪽 단추로 클릭한 후 아래 그림과 같이 추가 | 메서드 추가를 선택합니다.

메서드 추가 마법사가 나타납니다. 이 마법사에서는 추가할 메서드의 서명을 지정합니다.

3. 메서드 이름 아래 입력란에 Add를 입력합니다.

4. 매개 변수 유형으로 int를 입력합니다.

5. 매개 변수 이름 아래 입력란에 firstValue를 입력합니다.

6. 매개 변수 특성 아래의 in 확인란을 선택합니다.

7. 추가 단추를 클릭합니다.

8. 매개 변수 형식으로 int를 입력합니다.

9. 매개 변수 이름 아래 입력란에 secondValue를 입력합니다.

10. 매개 변수 특성 아래의 in 확인란을 선택합니다.

11. 추가 단추를 클릭합니다.

12. 매개 변수 형식으로 int*를 입력합니다.

13. 매개 변수 이름 아래 입력란에 pResult를 입력합니다.

14. 매개 변수 특성 아래의 retval 확인란을 선택합니다.

15. 추가 단추를 클릭합니다.

그러면 메서드 추가 마법사의 이름 페이지가 다음 그림과 같이 표시됩니다.

16. 마침을 클릭합니다.

COM 인터페이스가 있는 비어 있는 새 메서드를 만들었습니다. 이 메서드의 인터페이스는 소스 파일 SimpleCalc.cpp의 구현(아직 비어 있음)인 SimpleCalc.h 헤더 파일에 있습니다. 이제 구성 요소에 몇 가지 메서드를 더 추가합니다. 새로 추가한 메서드는 클래스 보기에 자동으로 표시됩니다.

17. 클래스 보기 창에서 ISimpleCalc 인터페이스를 마우스 오른쪽 단추로 클릭하고 추가 | 메서드 추가를 선택합니다.

18. 메서드 이름 아래 입력란에 Subtract를 입력합니다.

19. 앞서 수행한 단계를 반복하여 메서드에 매개 변수를 추가합니다. 앞에서 입력한 것과 똑같은 매개 변수를 입력해야 합니다.

20. 동일한 단계를 반복하여 Multiply라는 새 메서드를 추가합니다.

21. 동일한 단계를 다시 반복하여 Divide라는 새 메서드를 추가합니다.

이제 기능만 추가하면 COM 구성 요소 작업이 완료됩니다.

22. Visual Studio 2005에서 솔루션 탐색기 보기로 변경한 다음 SimpleCalc.cpp 파일을 두 번 클릭하여 엽니다. 이 파일은 소스 파일 아래에 있습니다.

23. CSimpleCalc::Add 메서드를 찾아 다음 문을 메서드의 return S_OK 문 앞에 추가합니다.

  *pResult = firstValue + secondValue;
24. CSimpleCalc::Subtract 메서드를 찾아 다음 문을 메서드의 return S_OK 문 앞에 추가합니다.

  *pResult = firstValue - secondValue;
25. CSimpleCalc::Multiply 메서드를 찾아 다음 문을 메서드의 return S_OK 문 앞에 추가합니다.

  *pResult = firstValue * secondValue;
26. CSimpleCalc::Divide 메서드를 찾아 메서드 코드를 다음 코드로 대체합니다.

if (secondValue != 0)
{
    *pResult = firstValue / secondValue;
    return S_OK;
}
else
{
    *pResult = 0;
    return E_FAIL;
}
27. SimpleCalc.cpp의 코드는 다음과 같아야 합니다.

// SimpleCalc.cpp: CSimpleCalc의 구현

#include "stdafx.h"
#include "SimpleCalc.h"


// CSimpleCalc


STDMETHODIMP CSimpleCalc::Add(int firstValue, int secondValue, int* 
pResult) { // TODO: 여기에 구현 코드를 추가하십시오. *pResult = firstValue + secondValue; return S_OK; } STDMETHODIMP CSimpleCalc::Subtract(int firstValue, int secondValue,
int* pResult) { // TODO: 여기에 구현 코드를 추가하십시오. *pResult = firstValue - secondValue; return S_OK; } STDMETHODIMP CSimpleCalc::Multiply(int firstValue, int secondValue,
int* pResult) { // TODO: 여기에 구현 코드를 추가하십시오. *pResult = firstValue * secondValue; return S_OK; } STDMETHODIMP CSimpleCalc::Divide(int firstValue, int secondValue,
int* pResult) { // TODO: 여기에 구현 코드를 추가하십시오. if (secondValue != 0) { *pResult = firstValue / secondValue; return S_OK; } else { *pResult = 0; return E_FAIL;(참고: 프로그래머 코멘트는 샘플 프로그램 파일에는 영문으로 제공되며 기사에는 설명을 위해 번역문으로 제공됩니다.) } }
28. Visual Studio 2005의 빌드 | 솔루션 빌드 메뉴 명령을 사용하거나 F6 키를 눌러 위에서 만든 COM 구성 요소를 컴파일합니다.

이제 MyCOMObject에 코드를 모두 입력했습니다. 이 COM 구성 요소를 사용하기 위해 지금부터 관리되는 Pocket PC 응용 프로그램을 만들겠습니다. Visual Studio 2005에서는 서로 다른 프로젝트를 동일한 솔루션에 결합할 수 있으며 기본 프로젝트와 관리되는 프로젝트의 조합도 가능합니다. 지금부터 이에 대해 알아보겠습니다.

COM 객체를 사용할 관리되는 응용 프로그램을 만들려면

1. 솔루션 탐색기에서 솔루션 'MyCOMObject'(1 프로젝트)를 마우스 오른쪽 단추로 클릭한 다음 추가 | 새 프로젝트를 선택하여 솔루션에 다른 프로젝트를 추가합니다.

2. 프로젝트 형식 아래에서 Visual C# | 스마트 장치 | Windows Mobile Pocket PC가 선택되어 있는지 확인합니다.

3. 템플릿 아래에서 장치 응용 프로그램이 선택되어 있는지 확인합니다.

4. 이름 입력란에서 응용 프로그램 이름을 MyManagedCOMClient로 변경합니다.

5. 위치 입력란에 C:\labs\COMInteropLab\MyCOMObject를 입력하거나 원하는 드라이브를 선택합니다.

6. 확인을 클릭하면 다음 그림과 같이 MyCOMObject 솔루션에 추가할 비어 있는 새 프로젝트가 만들어집니다.

폼에서 아무 위치나 클릭하고 폼의 Text 속성을 변경하여 응용 프로그램 제목을 Simple Calculator로 변경합니다. 속성 창이 표시되지 않으면 Visual Studio 2005 메뉴에서 보기 | 속성 창을 클릭하여 표시할 수 있습니다.

7. 또한 응용 프로그램을 보다 쉽게 중지할 수 있도록 폼의 Minimize Box 속성을 False로 변경해야 합니다.

8. 다음 그림에 나와 있는 샘플 사용자 인터페이스에 따라 폼에 레이블 3개, 입력란 3개 및 단추 4개를 추가하고 이름을 지정합니다.

참고    도구 상자에서 컨트롤을 폼으로 끌어다 놓을 때는 주의하십시오. 컨트롤을 실수로 두 번 클릭하면 추가 코드가 생성되어 컴파일 오류가 발생할 수 있습니다.
그림과 같이 컨트롤의 Text 속성을 변경하여 컨트롤 이름을 변경할 수 있습니다.

9. 해당 Text 속성을 지워 TextBox 컨트롤을 비운 다음 TextBox 컨트롤에서 Result 레이블 오른쪽에 있는 ReadOnly 속성을 true로 설정합니다.

10. 위 그림의 Pocket PC 폼 오른쪽에 나와 있는 이름에 따라 속성 창의 Name 속성에서 각각의 이름을 설정하여 입력란 및 단추의 변수 이름을 변경합니다.

11. 디자인 보기에서 단추 4개를 모두 두 번 클릭하여 클릭 이벤트 처리기를 추가합니다. 하나의 클릭 이벤트 처리기를 추가한 후에는 디자인 보기로 다시 전환해야 다음 처리기를 추가할 수 있습니다.

이제 응용 프로그램의 사용자 인터페이스 부분을 만드는 작업이 완료되었습니다. 다음에는 MyCOMObject를 사용하기 위해 응용 프로그램에 기능을 추가합니다. COM 구성 요소를 사용하려면 해당 구성 요소에 대한 참조를 추가하여 관리되는 응용 프로그램에서 사용할 수 있도록 해야 합니다. 참조를 추가하여 COM 개체를 참조할 때 Visual Studio .NET 내부에서는 보다 많은 작업이 수행됩니다.

이때 Interop 어셈블리를 COM 구성 요소 내로 호출할 수 있어야 합니다. Interop 어셈블리에는 COM 인터페이스 및 형식의 관리되는 정의가 들어 있습니다. 이 어셈블리는 형식 라이브러리 가져오기(tlbimp.exe)를 사용하여 수동으로 생성할 수도 있고, COM 구성 요소의 형식 라이브러리(*.tlb) 파일에 대한 참조를 추가할 때 Visual Studio 2005에 의해 자동으로 생성될 수도 있습니다. 이에 대해서는 잠시 후 살펴보겠습니다. 관리되는 클라이언트 응용 프로그램의 경우 COM 구성 요소는 다음 그림에 나와 있는 것처럼 관리되는 구성 요소와 같이 표시됩니다. 런타임 호출 가능 래퍼가 모든 COM 세부 사항을 숨깁니다.

관리되는 코드 내에서 COM 구성 요소에 액세스할 수 있도록 Interop 어셈블리를 생성하려면 MyCOMObject.tlb에 대한 참조를 추가해야 합니다.

12. Visual Studio 2005의 솔루션 탐색기에 있는 MyManagedCOMClient 프로젝트에서 참조를 마우스 오른쪽 단추로 클릭한 다음 참조 추가를 클릭합니다.

13. 참조 추가 대화 상자에서 찾아보기 탭을 클릭하고 응용 프로그램을 저장한 드라이브로 이동한 다음 \COMInteropLab\MyCOMObject\MyCOMObject\Pocket PC 2003 (ARMV4)\Debug에서 MyCOMObject.tlb를 찾습니다.

14. 확인을 클릭하여 다음 그림과 같이 선택한 참조를 프로젝트에 추가합니다.

이제 MyCOMObject의 메서드를 관리되는 개체처럼 사용할 수 있으며, MyManagedCOMClient 응용 프로그램에서 사용하기 위해 만든 단추 클릭 이벤트 처리기에 기능을 추가할 때 이를 확인할 수 있습니다.

15. Form1.cs 파일의 시작 부분에 있는 다른 using 문 바로 아래에 다음 문을 추가하여 "System.Runtime.InteropServices" 네임스페이스에 대한 별칭을 만듭니다. Form1.cs 파일에는 다른 모든 코드도 추가됩니다.
using System.Runtime.InteropServices;
16. 다음 문을 추가하여 COM 구성 요소에 대한 별칭을 만듭니다.

using MyCOMObjectLib;
17. Form1 클래스에 다음 인스턴스 변수를 추가합니다.

private ISimpleCalc calculator = new SimpleCalc();

ISimpleCalc 유형의 인터페이스 변수를 선언했으며 SimpleCalc 개체로 이 변수를 인스턴스화했습니다. 이때 실제로는 COM 구성 요소가 인스턴스화된 것입니다.

18. 다음 코드를 btnAdd_Click 이벤트 처리기에 추가합니다.

int firstValue = Convert.ToInt32(tbValue1.Text);
int secondValue = Convert.ToInt32(tbValue2.Text);
int result = calculator.Add(firstValue, secondValue);
tbResult.Text = result.ToString();

Add 메서드를 계산기에 입력할 때 살펴보았던 것처럼, 이 코드는 관리되는 개체처럼 표시되며 Microsoft IntelliSense도 완벽하게 지원됩니다. 그러나 이를 COM 구성 요소에 정의되어 있는 Add 메서드에 대한 관리되는 호출과 비교하면 현저한 차이점을 알 수 있습니다.

  • 관리되는 Add 메서드의 서명:
    int Add (int firstValue, int secondValue);
    
  • COM Add 메서드의 서명:
    HRESULT Add ([in]int firstValue, [in]int secondValue, [out, 
    retval]int* pResult);

COM 메서드를 관리되는 메서드로 변환하는 작업은 형식 라이브러리 파일에 대한 참조를 추가할 때 자동으로 수행됩니다.

19. 다음 코드를 btnSubtract_Click 이벤트 처리기에 추가합니다.
int firstValue = Convert.ToInt32(tbValue1.Text);
int secondValue = Convert.ToInt32(tbValue2.Text);
int result = calculator.Subtract(firstValue, secondValue);
tbResult.Text = result.ToString();
20. 다음 코드를 btnMultiply_Click 이벤트 처리기에 추가합니다.
int firstValue = Convert.ToInt32(tbValue1.Text);
int secondValue = Convert.ToInt32(tbValue2.Text);
int result = calculator.Multiply(firstValue, secondValue);
tbResult.Text = result.ToString();
21. 다음 코드를 btnDivide_Click 이벤트 처리기에 추가합니다.
int firstValue = Convert.ToInt32(tbValue1.Text);
int secondValue = Convert.ToInt32(tbValue2.Text);
int result = calculator.Divide(firstValue, secondValue);
tbResult.Text = result.ToString();
22. 솔루션 탐색기의 MyManagedCOMClient 프로젝트 파일을 마우스 오른쪽 단추로 클릭한 다음 시작 프로젝트로 설정을 클릭하여 MyManagedCOMClient 응용 프로그램을 시작 프로젝트로 설정합니다.

23. Pocket PC 2003 SE 에뮬레이터가 대상 장치로 선택되어 있는지 확인합니다.

24. 도구 모음의 장치에 연결 단추를 클릭하여 Pocket PC 2003 SE 에뮬레이터에 대한 연결을 설정합니다.

아직 시작되지 않은 경우 Pocket PC 에뮬레이터가 시작됩니다. Visual Studio 2005와 연결이 설정되면 연결 대화 상자에 확인 메시지가 표시됩니다. 그러면 Pocket PC 에뮬레이터에서 응용 프로그램을 배포 및 실행할 준비가 된 것입니다.

25. 연결 대화 상자를 닫습니다.

26. F5 키를 누르거나 Visual Studio 2005 메뉴에서 디버그 | 디버깅 시작을 선택하여 응용 프로그램을 디버그 모드에서 시작합니다.

27. MyManagedCOMClient 배포 대화 상자에서 Pocket PC 2003 SE 에뮬레이터 장치가 선택되어 있는지 확인한 다음 배포 단추를 클릭합니다.

중요 배포 중에 프로세스 또는 파일을 사용 중이라는 오류가 발생하는 경우에는 해당 프로그램이 에뮬레이터에서 아직 실행 중인 것이므로, 프로그램을 끝내야 새 복사본을 배포 및 실행할 수 있습니다. 이 오류는 에뮬레이터를 배포하는 실습 중에 언제든 발생할 수 있습니다. 실행 중인 응용 프로그램을 끝내는 방법에 대한 지침을 보려면 이 실습의 마지막 작업을 참조하십시오.
28. Windows 작업 표시줄에서 해당 단추를 클릭하여 에뮬레이터가 표시되도록 하십시오.

잠시 기다리면 빈 응용 프로그램이 Pocket PC 2003 SE 에뮬레이터 내에서 실행됩니다. 그러면 응용 프로그램을 테스트할 수 있습니다. 응용 프로그램을 처음으로 배포할 때는 다소 시간이 걸립니다. Pocket PC 2003 에뮬레이터에서 응용 프로그램을 실행 중이므로, 응용 프로그램이 배포되기 전에 .NET Compact Framework 2.0도 에뮬레이터로 배포됩니다. .NET Compact Framework 2.0이 에뮬레이터에 이미 있는 경우에는 이 단계를 건너뜁니다.

29. value1value2 입력란에 서로 다른 숫자를 입력합니다.

30. 단추 4개를 차례로 클릭하고 결과를 확인합니다. 단추를 클릭할 때마다 다음 그림과 같이 COM 개체의 메서드가 호출됩니다.

31. value2 입력란에 0을 입력하고 나누기 단추를 클릭합니다. 그러면 다음 그림과 같이 예외가 발생합니다.

이는 COM 개체에 대한 메서드 호출에서 HRESULTS_OK가 아닌 다른 값이 반환되는 경우의 기본 동작입니다. 그러므로 COM 개체로 호출할 때는 항상 예외 처리를 추가하는 것이 좋습니다.

32. Visual Studio 2005 메뉴에서 디버그 | 디버깅 중지를 선택하여 디버거를 중지합니다.

33. 소스 파일 Form1.cs의 btnDivide_Click 이벤트 처리기 코드를 다음으로 변경합니다.

int firstValue = Convert.ToInt32(tbValue1.Text);
int secondValue = Convert.ToInt32(tbValue2.Text);
try
{
    int result = calculator.Divide(firstValue, secondValue);
    tbResult.Text = result.ToString();
}
catch
{
    tbResult.Text = "정의되지 않음";
}
34. F5 키를 누르거나 Visual Studio 2005 메뉴에서 디버그 | 디버깅 시작을 선택하여 응용 프로그램을 디버그 모드에서 시작합니다.

35. MyManagedCOMClient 배포 대화 상자에서 Pocket PC 2003 SE 에뮬레이터 장치가 선택되어 있는지 확인한 다음 배포 단추를 클릭합니다.

36. 다음 그림과 같이 value2 입력란에 0을 입력하고 나누기 단추를 클릭하여 결과를 확인합니다. 예외 처리기를 추가한 것만으로도 이 동작이 훨씬 수월해졌음을 알 수 있습니다.

37. 응용 프로그램 오른쪽 윗부분의 확인 단추를 클릭하여 응용 프로그램을 끝냅니다.

.NET Compact Framework 2.0에서는 직접 래퍼를 작성하지 않고도 COM 구성 요소에 대해 메서드를 호출할 수 있습니다. 뿐만 아니라 .NET Compact Framework 2.0에서는 네이티브 코드에서 관리되는 코드로 호출할 수도 있으므로, COM 개체에서 관리되는 클라이언트로의 콜백도 가능합니다.

이제 새 인터페이스를 추가하고 콜백 기능을 구현하여 MyCOMObject를 확장합니다. 여기서 구현할 콜백 기능은 COM 구성 요소에서 관리되는 메시지 상자로 전달된 메시지를 표시하기만 합니다. 콜백이 지원되기는 하지만 COM의 .NET 형식 활성화는 지원되지 않습니다.

COM에서 관리되는 클라이언트로 콜백을 수행하려면

1. 솔루션 탐색기에서 MyCOMObject.idl 파일을 두 번 클릭하여 엽니다. 이 파일은 트리 보기의 MyComObject | 소스 파일에 있습니다.

2. MyCOMObject.idl 파일에서 import ocidl.idl 줄의 정의를 찾아 그 바로 아래에 새 인터페이스를 수동으로 추가합니다. 아래 새 인터페이스용 코드를 입력하거나 이 문서에서 붙여넣으십시오.

[
  object,
  uuid(),
  helpstring("ISimpleCalcCallBack 인터페이스"),
  pointer_default(unique)
]
interface ISimpleCalcCallBack : IUnknown{
  [, helpstring("method ShowMsg")] HRESULT ShowMsg([in] LPTSTR 
pMsg); };
3. 다른 인터페이스와 구별하기 위해 새 UUID(Universally Unique Identifier)를 인터페이스에 추가합니다. UUID는 Visual Studio 2005에서 도구 메뉴의 GUID 만들기를 클릭하여 생성할 수 있습니다.

4. GUID 만들기 대화 상자에서 아래 그림과 같이 레지스트리 형식 옵션이 선택되어 있는지 확인합니다.

5. GUID를 클릭한 다음 복사를 클릭합니다.

6. 끝내기를 클릭하여 GUID 만들기 대화 상자를 닫습니다.

7. MyCOMObject.idl에서 방금 입력한 코드의 UUID 특성 뒤에 있는 대괄호 사이에 커서를 놓고 만든 GUID를 해당 위치에 붙여넣습니다. GUID의 일부로 복사한 중괄호는 제거하십시오.

8. MyCOMObject.idl 파일에 추가한 인터페이스(붙여넣은 GUID 포함)는 다음과 같습니다.

 [
  object,
  uuid(06E6406E-6ACB-4807-909F-51A0BE89F9EA),
  helpstring("ISimpleCalcCallBack 인터페이스"),
  pointer_default(unique)
]
interface ISimpleCalcCallBack : IUnknown{
   [, helpstring("method ShowMsg")] HRESULT ShowMsg([in] LPTSTR 
pMsg); };
참고    붙여넣은 GUID의 값은 이 예제에 나와 있는 값과는 다릅니다. 앞서 만든 COM 구성 요소에 대한 새로운 인터페이스에는 ShowMsg라는 하나의 메서드만 포함됩니다. 이 메서드는 ISimpleCalcCallBack 인터페이스에서 노출하는 유일한 메서드입니다. 이 메서드는 관리되는 코드의 콜백 역할을 하므로, 나중에 관리되는 코드에서 이 인터페이스에만 사용할 구현을 작성하게 됩니다. 그러나 일단은 다른 작업을 먼저 수행해야 합니다. COM 개체에 콜백 함수를 저장하려면 관리되는 코드로부터 해당 개체에 대한 참조를 전달해야 합니다. 따라서 ISimpleCalc 인터페이스에 다른 메서드를 추가합니다.
9. 클래스 보기 창에서 ISimpleCalc 인터페이스를 마우스 오른쪽 단추로 클릭하고 추가 | 메서드 추가를 선택합니다.

그러면 메서드 추가 마법사가 표시되며 여기서 추가할 메서드의 서명을 지정합니다.

10. 메서드 이름 아래 입력란에 Initialize를 입력합니다.

11. 매개 변수 유형으로 ISimpleCalcCallBack*을 입력합니다.

12. 매개 변수 이름 아래 입력란에 callbackInterface를 입력합니다.

13. 매개 변수 특성 아래의 in 확인란을 선택합니다.

14. 추가 단추를 클릭하고 마침 단추를 클릭합니다.

이제 인터페이스를 모두 만들었습니다. 그러나 콜백 함수를 사용하려면 Initialize 메서드를 구현해야 합니다.

15. Visual Studio 2005에서 솔루션 탐색기 보기로 변경한 다음 SimpleCalc.cpp 파일을 두 번 클릭하여 엽니다. 이 파일은 소스 파일 아래에 있습니다.

16. CSimpleCalc::Initialize 메서드를 찾아 다음 코드를 메서드의 return S_OK 문 앞에 추가합니다.

  pClientCallback = callbackInterface;

  // 새로운 인터페이스를 처음으로 사용하므로, 
// 해당 참조 횟수를 증가시켜야 합니다. pClientCallback->AddRef(); // 처음으로 관리되는 코드로 콜백합니다. pClientCallback->ShowMsg(_T("관리되는 콜백을 설치했습니다!"));
17. CSimpleCalc::Divide 메서드를 찾아 다음 코드를 메서드에 추가하여 사용자에게 오류 메시지가 표시되도록 합니다. return E_FAIL 문 앞에 코드를 추가하십시오.

if (pClientCallback)
    pClientCallback->ShowMsg(_T("0으로는 나눌 수 
없습니다!"));

Initialize 메서드의 코드에서 볼 수 있듯이 콜백 메서드는 로컬로 저장됩니다. 그러나 콜백 메서드를 저장할 변수를 선언해야 합니다. 또한 마지막으로 개체 작업을 마친 후에 인터페이스를 해제하기 위한 일부 코드를 입력해야 합니다.

18. 솔루션 탐색기에서 SimpleCalc.h 파일을 찾아 두 번 클릭하여 엽니다. 이 파일은 헤더 파일 아래에 있습니다.

19. 다음 코드를 CSimpleCalc 클래스 끝에 추가합니다.
private :
    ISimpleCalcCallBack* pClientCallback;
20. 헤더 파일 SimpleCalc.h의 같은 클래스 CSimpleCalc 내에서 FinalRelease 메서드를 찾아 다음 코드를 메서드에 추가합니다.
if (pClientCallback)
    pClientCallback->Release();
21. 빌드 | 솔루션 빌드 메뉴 명령을 사용하여 방금 확장한 COM 구성 요소를 컴파일합니다.

위에서 구현한 콜백 기능을 사용하려면 COM 구성 요소에 콜백 역할을 할 수 있는 관리되는 함수를 제공해야 합니다. MyManagedCOMClient 프로젝트에 추가할 새 클래스의 일부로 콜백 메서드를 만듭니다.

22. 솔루션 탐색기에서 MyManagedCOMClient 프로젝트를 마우스 오른쪽 단추로 클릭한 다음 추가 | 클래스 추가를 선택합니다.

23. 항목 추가 대화 상자의 템플릿 목록에서 클래스가 선택되어 있는지 확인합니다.

24. 클래스 이름을 NewMsgNotification.cs로 변경한 다음 추가 단추를 클릭합니다.

25. 앞서 만든 소스 파일 NewMsgNotification.cs의 모든 코드를 다음 코드로 대체합니다.

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using MyCOMObjectLib;

namespace MyManagedCOMClient
{
    public class NewMsgNotification : ISimpleCalcCallBack
    {
        public void ShowMsg(string message)
        {
            MessageBox.Show(message);
        }
    }
}

여기서 알 수 있듯이 NewMsgNotification 클래스는 COM 구성 요소에서 만들었던 ISimpleCalcCallBack 인터페이스에서 파생됩니다. 이 인터페이스에는 ShowMsg라는 함수가 필요한데 이 함수도 위의 클래스에서 정의됩니다. 마지막으로 콜백 함수를 COM 구성 요소에 연결해야 합니다.

26. Visual Studio 2005의 소스 코드 편집기에서 소스 파일 Form1.cs를 엽니다.

27. 위에서 만든 새 클래스에 대한 인스턴스 변수를 추가합니다.

private NewMsgNotification newMsg = new NewMsgNotification();
28. Form1 클래스의 생성자를 찾아 계산기 COM 개체의 Initialize 메서드에 호출을 추가합니다. 이렇게 하면 COM 개체에 사용할 콜백 함수를 알려 줄 수 있습니다. 다음 문을 InitializeComponent() 바로 아래에 추가하면 됩니다.

calculator.Initialize((ISimpleCalcCallBack)newMsg);
29. F5 키를 누르거나 Visual Studio 2005 메뉴에서 디버그 | 디버깅 시작을 선택하여 응용 프로그램을 디버그 모드에서 시작합니다.

30. MyManagedCOMClient 배포 대화 상자에서 Pocket PC 2003 SE 에뮬레이터 장치가 선택되어 있는지 확인한 다음 배포 단추를 클릭합니다.

잠시 기다리면 응용 프로그램이 Pocket PC 2003 SE 에뮬레이터 내에서 실행됩니다. 또한 다음 그림과 같이 관리되는 콜백이 설치되었음을 알려 주는 메시지 상자가 즉시 나타납니다.

이 메시지 상자는 새로 만든 클래스의 관리되는 코드 내에 있지만 COM 구성 요소 내에서 호출됩니다. 이제 0으로 나누면 어떤 결과가 발생하는지 확인해 봅시다.

31. 확인을 클릭하여 메시지 상자를 닫습니다.

32. value1 입력란에는 1을, value2 입력란에는 0을 입력합니다.

33. divide 단추를 클릭하면 다음 그림과 같이 또 다른 메시지 상자가 나타납니다.

34. 확인을 클릭하여 메시지 상자를 닫고 응용 프로그램 오른쪽 윗부분의 확인 단추를 클릭하여 응용 프로그램을 끝냅니다.

이 작업을 수행하면 첫 번째 연습은 끝납니다. ATL을 사용하여 COM 구성 요소를 만들었으며 관리되는 클라이언트 응용 프로그램 내에서 이 구성 요소를 사용했습니다. 관리되는 코드 내에서 COM 구성 요소의 메서드를 호출할 수 있을 뿐 아니라 COM 구성 요소에 관리되는 콜백 함수를 등록할 수도 있습니다. 앞에서 살펴본 것처럼 직접 래퍼를 작성하지 않고도 관리되는 코드 내에서 아주 간단하게 COM 구성 요소에 액세스할 수 있습니다. .NET Compact Framework 버전 1.0에서는 구성 요소에 액세스하기 위해 래퍼를 직접 작성해야 했습니다. 다음 연습에서는 관리되는 응용 프로그램 내에서 널리 알려진 기존 COM 구성 요소를 사용합니다.

연습 2: 관리되는 응용 프로그램에서 Pocket Outlook에 액세스

이 연습에서는 POOM(Pocket Outlook Object Model)을 통해 Microsoft Pocket Outlook을 사용하는 새 Pocket PC 2003 응용 프로그램을 만듭니다. POOM은 Pocket Outlook 기능을 제공하는 COM 구성 요소이므로 해당 기능을 사용자의 관리되는 응용 프로그램에서 사용할 수 있습니다. .NET Compact Framework 1.0에서는 POOM을 사용하는 절차가 까다로웠습니다. 즉, 네이티브 코드에서 POOM 구성 요소를 결합하는 래퍼 DLL을 만들거나 이 작업을 수행할 수 있는 타사 라이브러리를 사용해야 했습니다. 이 연습에서 살펴보겠지만 .NET Compact Framework 2.0을 사용하면 COM Interop를 통해 관리되는 응용 프로그램 내에서 POOM을 훨씬 간편하게 사용할 수 있습니다. 이 연습에서는 뛰어난 사용자 인터페이스를 만드는 대신 POOM에서 제공하는 기능을 중점적으로 만듭니다.

새 Pocket PC 프로젝트를 만들려면

1. 바탕 화면의 아이콘 또는 시작 메뉴를 사용하여 Visual Studio 2005를 시작합니다.

2. 메뉴에서 파일 | 새 프로젝트를 선택합니다.

3. 프로젝트 대화 상자의 프로젝트 형식 아래에서 Visual C# | 스마트 장치 | Windows Mobile 5.0 Pocket PC가 선택되어 있는지 확인합니다.

4. 템플릿 아래에서 장치 응용 프로그램이 선택되어 있는지 확인합니다.

5. 이름 입력란에서 이름을 UsingPOOM으로 변경합니다.

6. 위치 입력란에 C:\labs\COMInteropLab을 입력하거나 원하는 드라이브를 사용합니다.

7. 솔루션용 디렉터리 만들기 확인란이 아래 그림처럼 선택되어 있는지 확인합니다.

8. 확인을 클릭하여 비어 있는 새 Pocket PC 프로젝트를 만듭니다.

9. 폼에서 아무 위치나 클릭하고 폼의 Text 속성을 변경하여 응용 프로그램 제목을 UsingPOOM으로 변경합니다.

10. 또한 응용 프로그램을 보다 쉽게 중지할 수 있도록 폼의 Minimize Box 속성을 False로 변경해야 합니다.

11. 다음 그림에 나와 있는 샘플 사용자 인터페이스에 따라 폼에 목록 상자 하나와 단추 4개를 추가하고 이름을 변경합니다.

참고    도구 상자에서 컨트롤을 폼으로 끌어다 놓을 때는 주의하십시오. 컨트롤을 실수로 두 번 클릭하면 추가 코드가 생성되어 컴파일 오류가 발생할 수 있습니다.

12. 위 그림의 Pocket PC 폼 오른쪽에 나와 있는 이름에 따라 속성 창에서 각각의 Name 값을 설정하여 단추의 변수 이름을 변경합니다.

13. 디자인 보기에서 단추 4개를 모두 두 번 클릭하여 클릭 이벤트 처리기를 추가합니다. 하나의 클릭 이벤트 처리기를 추가한 후에는 디자인 보기로 다시 전환해야 다음 처리기를 추가할 수 있습니다.

이제 응용 프로그램의 초기 사용자 인터페이스 부분을 만드는 작업이 완료되었습니다.

관리되는 응용 프로그램에서 POOM을 사용하기 위해 여러 PInvoke 래퍼를 작성하거나 고유한 관리되는 개체 모델을 직접 정의하지 않아도 됩니다. 대신 형식 라이브러리 가져오기(tlbimp.exe) SDK 도구를 사용하여 어셈블리를 생성하면 POOM을 직접 호출할 수 있습니다. 이제 POOM 형식 라이브러리를 만듭니다. 그런 다음 Interop 어셈블리를 만들어 해당 어셈블리를 Visual Studio 2005 프로젝트에서 참조합니다.

관리되는 코드에서 COM 구성 요소를 호출하는 가장 쉬운 방법은 구성 요소의 인터페이스, Coclass 등을 정의하는 형식 라이브러리를 만드는 것입니다. 아쉽게도 Pocket PC나 Smartphone SDK에는 POOM용 형식 라이브러리가 포함되어 있지 않기 때문에 직접 빌드해야 합니다. 다행히도 형식 라이브러리를 빌드하는 작업은 간단합니다.

Pocket PC 응용 프로그램에 사용할 POOM을 만들려면

1. Windows XP 시작 메뉴에서 시작 | 모든 프로그램 | Microsoft Visual Studio 2005를 선택하고 Visual Studio 도구 | Visual Studio 2005 명령 프롬프트를 선택하여 Visual Studio 2005 명령 프롬프트를 엽니다.

참고    이 명령 프롬프트를 사용해야 하는 이유는 Visual Studio 2005에서 제공되는 특정 명령줄 도구를 사용할 수 있도록 여러 가지 환경 변수를 설정하기 때문입니다.
2. 명령 프롬프트 창에서
cd "C:\Program Files\Microsoft Visual Studio 8\SmartDevices\SDK\PocketPC2003\Include"를 입력하고 Enter 키를 눌러 작업 디렉터리를 변경합니다.

이제 midl.exe를 실행하여 POOM에서 사용할 형식 라이브러리를 만듭니다. 일반적으로 관리되는 응용 프로그램 내에서 액세스할 예정이며 사용 가능한 형식 라이브러리가 없는 모든 COM 구성 요소에 대해 이 단계를 실행해야 합니다. 이를 위해서는 해당 COM 구성 요소에 대한 인터페이스 정의 파일이 있어야 합니다.

중요 Pimstore.idl은 Pocket PC 2003 SDK에서 제공되지 않습니다. 이 실습의 소스 코드에 이 파일이 포함되어 있습니다. 다음 단계를 진행하기 전에 이 파일을 2단계에 나와 있는 Include 폴더에 복사해야 합니다.
3. 명령 프롬프트 창에 midl pimstore.idl을 입력하고 Enter 키를 누르면 POOM에 사용할 형식 라이브러리가 만들어집니다.

이 명령을 실행하면 이름이 pimstore.tlb인 형식 라이브러리 파일이 만들어집니다. 도구에서 생성되는 경고는 무시해도 됩니다. 다음 단계는 Visual Studio 내에서 pimstore.tlb를 참조하는 것입니다.

4. 명령 프롬프트 창을 닫습니다.

5. 관리되는 코드 내에서 POOM에 액세스할 수 있도록 Interop 어셈블리를 만들려면 pimstore.tlb에 대한 참조를 추가해야 합니다. 이렇게 하려면 솔루션 탐색기의 UsingPOOM 프로젝트 아래에 있는 참조를 마우스 오른쪽 단추로 클릭하고 참조 추가를 클릭합니다.

6. 참조 추가 대화 상자에서 찾아보기 탭을 클릭한 다음 pimstore.tlb를 찾습니다. 이 파일은 C:\Program Files\Microsoft Visual Studio 8\SmartDevices\SDK\PocketPC2003\Include에 있습니다.

7. 확인을 클릭하면 Interop 어셈블리가 생성됩니다.

8. 솔루션 탐색기의 참조 트리를 확장하면 다음 그림과 같이 새로 추가된 PocketOutlook에 대한 참조를 확인할 수 있습니다. PocketOutlook은 POOM에 대한 관리되는 인터페이스인 위에서 만든 Interop 어셈블리입니다.

POOM을 관리되는 응용 프로그램 내에서 사용하려면 여러 가지 네임스페이스를 추가해야 합니다. 또한 Pocket Outlook 응용 프로그램 인스턴스를 만들어 로그온해야 합니다. POOM은 응용 프로그램 전체에 걸쳐 사용하므로 응용 프로그램 인스턴스를 만들어 기본 폼을 로드할 때 해당 인스턴스에 로그온합니다. 기본 폼을 닫으면 Pocket Outlook 응용 프로그램에서 로그오프됩니다. 즉, POOM 기능을 응용 프로그램의 수명 동안 계속 사용할 수 있습니다.

Pocket PC 응용 프로그램 내에서 POOM에 액세스하려면

1. Form1.cs 파일의 시작 부분에 있는 다른 using 문 바로 아래에 다음 문을 추가하여 "System.Runtime.InteropServices" 네임스페이스에 대한 별칭을 만듭니다. Form1.cs 파일에는 다른 모든 코드도 추가됩니다.

using System.Runtime.InteropServices;
2. 다음 문을 추가하여 POOM에 대한 별칭을 만듭니다.

using PocketOutlook;
3. Form1 클래스에 다음 인스턴스 변수를 추가합니다.

private ApplicationClass outlookApp;
4. Visual Studio 2005에서 Form1.cs(디자인) 창을 열고 폼에서 컨트롤 외부의 아무 위치나 클릭한 다음 속성 창에서 도구 모음의 이벤트 단추를 클릭합니다.

5. Load 이벤트를 찾아 두 번 클릭합니다.

6. 이제 Form1_Load 이벤트 처리기가 만들어졌으며 여기에 다음 코드를 추가해야 합니다.

// 응용 프로그램 개체의 인스턴스를 만들어 로그온합니다.
outlookApp = new PocketOutlook.ApplicationClass();
outlookApp.Logon(0);
7. Visual Studio 2005에서 Form1.cs(디자인) 창을 다시 열고 폼에서 컨트롤 외부의 아무 위치나 클릭한 다음 속성 창에서 도구 모음의 이벤트 단추를 클릭합니다.

8. Closing 이벤트를 찾아 두 번 클릭합니다.

9. 이제 Form1_Closing 이벤트 처리기가 만들어졌으며 여기에 다음 코드를 추가해야 합니다.

outlookApp.Logoff();

이제 사용자의 응용 프로그램에서 Pocket Outlook 기능을 사용할 수 있으므로 이 시점에서 Pocket Outlook 응용 프로그램 개체의 인스턴스를 만들어 해당 인스턴스에 로그온/로그오프할 수 있는지를 테스트해야 합니다.

10. F5 키를 누르거나 Visual Studio 2005 메뉴에서 디버그 | 디버깅 시작을 선택하여 응용 프로그램을 디버그 모드에서 시작합니다.

11. UsingPoom 배포 대화 상자에서 Pocket PC 2003 SE 에뮬레이터 장치가 선택되어 있는지 확인한 다음 배포 단추를 클릭합니다.

잠시 기다리면 다음 그림과 같이 응용 프로그램이 Pocket PC 2003 SE 에뮬레이터 내에서 실행됩니다.

다음에는 Pocket Outlook 응용 프로그램 개체를 검사할 수 있도록 응용 프로그램에 중단점을 추가해야 합니다.

12. Form1_Closing 메서드를 찾아 outlookApp.Logoff() 문에 중단점을 설정합니다. 문을 마우스 오른쪽 단추로 클릭하고 중단점을 가리킨 다음 중단점 설정을 클릭합니다.

13. 응용 프로그램 오른쪽 윗부분의 확인을 클릭합니다.

그러면 디버거에서 응용 프로그램을 중지하며 Visual Studio 2005 내에서 변수를 검사할 수 있습니다.

14. Visual Studio 편집기 내에서 outlookApp.Logoff()를 가리키고 자동 창의 디버그 정보를 확인합니다. outlookApp의 내용은 다음 그림과 유사하게 표시됩니다.

참고    커서를 몇 초 더 가리키고 있으면 더 많은 정보가 표시됩니다.

15. 중단점을 마우스 오른쪽 단추로 클릭하고 삭제를 클릭합니다.

16. 응용 프로그램을 올바르게 닫을 수 있도록 F5 키를 눌러 응용 프로그램을 계속 실행합니다.

응용 프로그램을 사용하여 작업을 수행하려면 에뮬레이터에서 Pocket Outlook에 연락처를 몇 개 추가해야 합니다.

17. Pocket PC 2003 에뮬레이터가 표시되어 있는지 확인하고 시작(Start) 메뉴를 클릭한 다음 연락처(Contacts)를 클릭합니다.

18. 에뮬레이터에서 새로 만들기(New)를 클릭한 다음 새 연락처(New Contacts)를 몇 개 추가합니다. 다음 그림과 같이 연락처 이름만 입력하고 확인(ok)을 클릭합니다.

이제 UsingPOOM 응용 프로그램이 앞에서 Pocket Outlook에 추가한 연락처를 사용자 응용 프로그램 내의 목록 상자에 표시할 수 있도록 하는 코드를 작성합니다. Form1_Load 이벤트 처리기에서 목록 상자를 Pocket Outlook의 연락처로 채웁니다.

19. Form1.cs 파일 내에서 Form1_Load 메서드를 찾아 다음 코드를 outlookApp.Logon(0) 문 바로 아래에 추가합니다.

ShowContacts();
20. ShowContacts라는 새 메서드를 Form1.cs 파일에 다음 코드와 함께 추가합니다.

private void ShowContacts()
{
    // 목록 상자를 Pocket Outlook의 연락처 정보로 
// 채웁니다. Folder contactsFolder =
outlookApp.GetDefaultFolder(OlDefaultFolders.olFolderContacts); PocketOutlook.Items contacts =
(PocketOutlook.Items)contactsFolder.Items; listBox1.BeginUpdate(); listBox1.Items.Clear(); foreach (ContactItem contact in contacts) { string name = contact.FirstName + " " + contact.LastName; listBox1.Items.Add(name); } listBox1.EndUpdate(); }

위에서 입력한 코드는 Pocket Outlook이 연락처를 저장하는 폴더를 검색하고 연락처의 Items 컬렉션을 차례로 확인하여 연락처 이름을 목록 상자에 추가합니다. Pocket Outlook에 일부 연락처를 추가하고 UsingPOOM 응용 프로그램을 실행하는 경우에는 목록 상자에 해당 연락처가 표시됩니다.

21. F5 키를 누르거나 Visual Studio 2005 메뉴에서 디버그 | 디버깅 시작을 선택하여 응용 프로그램을 디버그 모드에서 시작합니다.

22. UsingPoom 배포 대화 상자에서 Pocket PC 2003 SE 에뮬레이터 장치가 선택되어 있는지 확인한 다음 배포 단추를 클릭합니다.

23. 다음 그림과 같이 연락처가 목록 상자에 표시되는지 확인한 후에 폼 오른쪽 윗부분의 확인 단추를 클릭하여 응용 프로그램을 끝낼 수 있습니다.

다음에 수행할 작업은 연락처 정보를 추가, 업데이트, 삭제 및 확인하기 위해 단추 클릭 이벤트 처리기에 기능을 추가하는 것입니다. 연락처에 대한 자세한 정보를 보고 새 연락처를 삽입하고 선택한 연락처에 대한 약속을 삽입하려면, 먼저 응용 프로그램에서 사용할 여러 개의 추가(단순) 폼을 만들어야 합니다. 맨 처음 만드는 폼은 ContactDetails 폼입니다.

응용 프로그램의 기능을 확장하려면

1. Visual Studio 2005 메뉴에서 프로젝트 | Windows Form 추가를 선택하고 새 항목 추가 대화 상자의 이름 필드에 ContactDetails.cs를 입력한 다음 추가 단추를 클릭합니다.

2. 다음 그림과 같이 레이블 4개의 Text 값을 추가 및 변경하고 입력란 4개를 추가해야 하는 새 폼이 표시됩니다.

참고    도구 상자에서 컨트롤을 폼으로 끌어다 놓을 때는 주의하십시오. 컨트롤을 실수로 두 번 클릭하면 추가 코드가 생성되어 컴파일 오류가 발생할 수 있습니다.

3. 해당 Text 속성을 지워 입력란을 비운 다음 Name 속성을 사용하여 위의 그림에서 폼 오른쪽에 표시되어 있는 것과 같이 입력란의 이름을 지정합니다.

4. 해당 ReadOnly 속성을 true로 설정하여 Name 입력란을 읽기 전용으로 만듭니다.

5. 각 입력란에 대해 TextChanged 이벤트 처리기를 추가합니다. TextChanged 이벤트 처리기를 추가하려면 입력란을 클릭하고 속성 창에서 TextChanged 이벤트를 찾아 두 번 클릭합니다. 사용 가능한 이벤트를 모두 보려면 이벤트 단추를 클릭해야 합니다.

6. Visual Studio 2005에서 ContactDetails.cs(디자인) 창을 열고 폼에서 컨트롤 외부의 아무 위치나 클릭한 다음 속성 창에서 도구 모음의 이벤트 단추를 클릭합니다.

7. Load 이벤트를 찾아 두 번 클릭합니다.

8. 디자인 보기로 돌아와 Form_Closing 이벤트를 추가합니다. Closing 이벤트를 찾아 두 번 클릭합니다.

9. ContactDetails.cs 소스 파일에서 Ctrl+A를 눌러 모든 텍스트를 선택하고 모든 코드를 다음 코드로 대체합니다. 이 문서의 코드를 붙여 넣어도 됩니다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using PocketOutlook;

namespace UsingPOOM
{
    public partial class ContactDetails : Form
    {
        private ContactItem thisContact;
        private bool isDirty;
        private bool newEntry;

        public ContactDetails(ContactItem contact, bool 
newEntryRequested) { InitializeComponent(); thisContact = contact; isDirty = false; newEntry = newEntryRequested; } private void ContactDetails_Load(object sender, EventArgs e) { if (thisContact != null && !newEntry) { tbName.Text = thisContact.FirstName + " " +
thisContact.LastName; tbCompany.Text = thisContact.CompanyName; tbPhone.Text = thisContact.BusinessTelephoneNumber; tbEmail.Text = thisContact.Email1Address; this.Text = "ContactDetails"; tbName.ReadOnly = true; } else if (newEntry) { this.Text = "새 연락처 추가"; tbName.ReadOnly = false; } } private void tbName_TextChanged(object sender, EventArgs e) { isDirty = true; } private void tbCompany_TextChanged(object sender, EventArgs
e) { isDirty = true; } private void tbPhone_TextChanged(object sender, EventArgs e) { isDirty = true; } private void tbEmail_TextChanged(object sender, EventArgs e) { isDirty = true; } private void ContactDetails_Closing(object sender,
CancelEventArgs e) { if (isDirty) { // 세부 정보가 변경되었습니다. // 연락처 목록에서 정보를 업데이트하십시오. if (newEntry) { string[] nameParts; nameParts = tbName.Text.Split(' '); if (nameParts[0].Length == 0) { MessageBox.Show("이름 필드에 내용을 입력해야
합니다."); e.Cancel = true; } else { thisContact.FirstName = nameParts[0]; if (nameParts.Length == 2) { thisContact.LastName = nameParts[1]; } else if (nameParts.Length > 2) { // 중간 이름도
// 입력했습니다. // 추가로 입력하는 데이터는
// 무시됩니다! thisContact.MiddleName = nameParts[1]; thisContact.LastName = nameParts[2]; } } } thisContact.CompanyName = tbCompany.Text; thisContact.BusinessTelephoneNumber = tbPhone.Text; thisContact.Email1Address = tbEmail.Text; thisContact.Save(); } } } }

위에서 추가한 코드는 선택한 Pocket Outlook 연락처에 대한 일부 세부 정보를 표시합니다. 이 코드의 많은 부분은 제대로 작동하는 사용자 인터페이스를 만들기 위한 오버헤드로 이루어져 있습니다. 연락처는 폼의 생성자로 전달되며 정보는 ContactDetails_Load 이벤트를 실행하는 동안 폼에서 표시됩니다. 사용자가 입력란 중 하나에서 텍스트를 변경할 때마다 isDirty 플래그가 true로 설정됩니다. 폼을 다시 닫으면 입력란의 수정된 정보는 Pocket Outlook의 연락처 데이터베이스에 저장됩니다.

물론 이 응용 프로그램은 매우 간단합니다. 이 응용 프로그램에서는 사용자에게 수정 내용을 저장해야 하는지를 묻는 메시지를 표시하지 않고 자동으로 수정된 데이터를 저장합니다. 이 연습에서는 뛰어난 사용자 인터페이스를 만들고 해당 인터페이스를 위한 많은 양의 코드를 작성하기보다는 POOM을 사용하는 부분에 중점을 둡니다. ContactDetails 대화 상자 또한 새 연락처 정보를 입력하기 위해 다시 사용됩니다. 이를 위해 생성자에는 부울 변수 newEntry도 포함되어 있습니다. 연락처 업데이트와 새 연락처 삽입의 가장 큰 차이점은 ContactDetails_Closing 이벤트 처리기에 있습니다. 즉, 새 연락처의 경우에는 유효한 이름을 입력해야 합니다. 정보를 업데이트하는 경우에는 이름을 변경할 수 없습니다. 시간을 할애하여 ContactDetails.cs 파일의 코드를 살펴보고, 특히 Pocket Outlook 연락처 데이터베이스에 데이터가 저장되는 방식을 확인하십시오.

다음에는 연락처 정보 가져오기 단추를 클릭하면 ContactDetails 대화 상자가 표시되도록 Form1.cs 파일을 수정해야 합니다. ContactDetails 대화 상자가 표시되기 전에 목록 상자에서 현재 선택한 연락처가 연락처 데이터베이스에서 검색되어 ContactDetails 대화 상자 생성자로 전달됩니다.

10. Form1.cs 파일에서 btnDetails_Click 이벤트 처리기를 찾아 다음 코드를 추가합니다.

Folder contactsFolder = 
    outlookApp.GetDefaultFolder(OlDefaultFolders.olFolderContacts);
PocketOutlook.Items contacts = 
(PocketOutlook.Items)contactsFolder.Items; if (listBox1.SelectedIndex == -1) listBox1.SelectedIndex = 0; ContactDetails cd = new ContactDetails( (ContactItem) contacts.Item(listBox1.SelectedIndex+1), false); cd.ShowDialog();

이제 연락처 정보를 표시 및 수정하기 위한 기능을 추가하는 작업이 완료되었습니다. 다음에는 앞서 살펴보았듯이 ContactDetails 대화 상자를 공유하는 새 연락처 추가 단추에 대해 이벤트 처리기에 코드를 추가합니다.

11. Form1.cs 파일에서 btnNewContact_Click 이벤트 처리기를 찾아 다음 코드를 추가합니다.

Folder contactsFolder = 
    outlookApp.GetDefaultFolder(OlDefaultFolders.olFolderContacts);
PocketOutlook.Items contacts = 
(PocketOutlook.Items)contactsFolder.Items; ContactItem contact = (ContactItem)contacts.Add(); ContactDetails cd = new ContactDetails(contact, true); cd.ShowDialog(); ShowContacts();

여기서 알 수 있듯이 btnNewContact_Click 이벤트 처리기의 코드와 btnDetails_Click 이벤트 처리기의 코드는 ContactDetails 대화 상자의 생성자가 호출되는 방식과 새 연락처가 추가된 경우 목록 상자에서 추가적인 업데이트가 수행된다는 점을 제외하면 거의 동일합니다.

다음에는 연락처 목록에서 연락처 항목을 삭제하는 몇 가지 기능을 추가합니다. 여기서도 사용자 인터페이스는 매우 간단합니다. 예를 들어 사용자가 연락처를 삭제하기로 결정해도 이를 확인하는 질문 메시지가 표시되지 않습니다.

12. Form1.cs 파일에서 btnDelContact_Click 이벤트 처리기를 찾아 다음 코드를 추가합니다.

Folder contactsFolder = 
    outlookApp.GetDefaultFolder(OlDefaultFolders.olFolderContacts);
PocketOutlook.Items contacts = 
(PocketOutlook.Items)contactsFolder.Items; if (listBox1.SelectedIndex == -1) listBox1.SelectedIndex = 0; ContactItem ci = (ContactItem)contacts.Item(listBox1.SelectedIndex +
1); ci.Delete(); ShowContacts();

연락처 목록에 항목을 추가 및 업데이트하는 것과 마찬가지로 항목을 삭제하는 것도 POOM을 사용하면 매우 간단히 수행할 수 있습니다. 즉, PocketOutlook.Items 목록에서 올바른 항목을 선택하여 해당 Delete 메서드를 호출하면 됩니다.

응용 프로그램을 테스트하기 전에 마지막으로 수행할 작업은 연락처 목록에서 선택한 연락처에 대해 약속을 입력할 수 있는 새 대화 상자를 만드는 것입니다.

13. Visual Studio 2005 메뉴에서 프로젝트 | Windows Form 추가를 선택하고 새 항목 추가 대화 상자의 이름 필드에 AddAppt.cs를 입력한 다음 추가 단추를 클릭합니다.

14. 다음 그림과 같이 레이블 3개의 Text 값을 추가 및 변경하고 입력란 2개를 추가하고 하나의 날짜/시간 선택을 추가해야 하는 새 폼이 표시됩니다.

참고    도구 상자에서 컨트롤을 폼으로 끌어다 놓을 때는 주의하십시오. 컨트롤을 실수로 두 번 클릭하면 추가 코드가 생성되어 컴파일 오류가 발생할 수 있습니다.

15. 해당 Text 속성을 지워 입력란 2개를 비운 다음 Name 속성을 사용하여 위의 그림에서 폼 오른쪽에 표시되어 있는 것과 같이 입력란 및 날짜/시간 선택의 이름을 지정합니다.

16. 해당 ReadOnly 속성을 true로 설정하여 Name 입력란을 읽기 전용으로 만듭니다.

17. Visual Studio 2005에서 AddAppt.cs(디자인) 창을 열고 폼에서 컨트롤 외부의 아무 위치나 클릭한 다음 속성 창에서 도구 모음의 이벤트 단추를 클릭합니다.

18. Load 이벤트를 찾아 두 번 클릭합니다.

19. 디자인 보기로 돌아와 Closing 이벤트를 두 번 클릭하여 Form_Closing 이벤트를 추가합니다.

20. AddAppt.cs 소스 파일에서 Ctrl+A를 눌러 모든 텍스트를 선택하고 모든 코드를 다음 코드로 대체합니다. 이 문서의 코드를 붙여 넣어도 됩니다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using PocketOutlook;

namespace UsingPOOM
{
    public partial class AddAppt : Form
    {
        private ContactItem thisContact;
        private AppointmentItem thisAppt;

        public AddAppt(ContactItem contact, AppointmentItem appt)
        {
            InitializeComponent();
            thisContact = contact;
            thisAppt = appt;
        }

        private void AddAppt_Load(object sender, EventArgs e)
        {
            tbName.Text = thisContact.FirstName + " " + 
thisContact.LastName; dtpDate.Value = DateTime.Now; } private void AddAppt_Closing(object sender, CancelEventArgs
e) { if (tbSubject.Text.Length == 0) { MessageBox.Show("올바른 제목을 추가해야 합니다."); e.Cancel = true; } else { thisAppt.Subject = tbName.Text + " - " +
tbSubject.Text; thisAppt.Start = dtpDate.Value; thisAppt.Save(); } } } }

위에서 추가한 코드는 연락처 목록에서 이름을 가져와 해당 연락처에 대한 새 약속을 추가합니다. 여기서 알 수 있듯이 연락처 추가와 약속 추가는 거의 같은 작업입니다. 새 약속을 추가하는 경우에는 Add 메서드를 사용하여 약속 정보를 수집하고 해당 약속을 Pocket Outlook 데이터베이스에 저장합니다. 연락처를 추가할 때와 마찬가지로 모든 약속이 저장되는 올바른 폴더를 사용 중인지 확인해야 합니다. 저장 폴더는 약속 단추의 이벤트 처리기에서 설정합니다.

마지막으로 약속 단추를 클릭하면 AddAppts 대화 상자가 표시되도록 Form1.cs 파일을 최종적으로 수정해야 합니다. AddAppts 대화 상자가 표시되기 전에 목록 상자에서 현재 선택한 연락처가 연락처 데이터베이스에서 검색되어 AddAppts 대화 상자 생성자로 전달됩니다. 또한 비어 있는 새 약속도 대화 상자로 전달됩니다.

21. Form1.cs 파일에서 btnNewAppt_Click 이벤트 처리기를 찾아 다음 코드를 추가합니다.

Folder contactsFolder = 
    outlookApp.GetDefaultFolder(OlDefaultFolders.olFolderContacts);
PocketOutlook.Items contacts = 
(PocketOutlook.Items)contactsFolder.Items; Folder apptsFolder =
outlookApp.GetDefaultFolder(OlDefaultFolders.olFolderCalendar); PocketOutlook.Items appts = (PocketOutlook.Items)apptsFolder.Items; AppointmentItem appt = (AppointmentItem)appts.Add(); if (listBox1.SelectedIndex == -1) listBox1.SelectedIndex = 0; AddAppt aa = new AddAppt((ContactItem)contacts.Item(listBox1.SelectedIndex +
1), appt); aa.ShowDialog();

이제는 응용 프로그램 테스트 작업만 남아 있습니다. 이 응용 프로그램에 입력한 정보를 Pocket Outlook에서도 사용할 수 있는지 확인하려면 연락처 또는 일정으로 변경하여 해당 응용 프로그램에 표시되는 정보를 UsingPOOM 응용 프로그램에 입력한 정보와 비교하면 됩니다.

22. F5 키를 누르거나 Visual Studio 2005 메뉴에서 디버그 | 디버깅 시작을 선택하여 응용 프로그램을 디버그 모드에서 시작합니다. 다음 그림과 같이 응용 프로그램이 표시됩니다.

23. 모든 옵션을 테스트하여 응용 프로그램이 제대로 작동하는지 확인하고 작업 결과를 주기적으로 연락처 또는 일정과 비교합니다. 다음 그림에서처럼 원하는 대로 연락처를 입력, 수정 및 삭제하고 새 약속을 입력할 수 있습니다.

24. 테스트가 완료되면 폼 오른쪽 윗부분의 확인 단추를 클릭하여 응용 프로그램을 끝냅니다.

25. 이제 Pocket PC 2003 에뮬레이터의 사용은 끝났으므로 에뮬레이터도 끝내야 합니다. File(파일)을 클릭하고 Exit(끝내기)를 클릭합니다. 메시지가 표시되면 에뮬레이터 상태를 저장합니다.

연습 3: 차세대 Windows Mobile 기반 장치에서 Pocket Outlook에 액세스

.NET Compact Framework 2.0이 릴리스되면 뛰어난 기능을 통해 네이티브 코드와의 상호 운용 작업을 보다 쉽고 완벽하게 수행할 수 있을 것입니다. 앞의 연습에서는 관리되는 응용 프로그램 내에서 비교적 쉽게 COM 구성 요소를 사용할 수 있음을 확인했습니다. 차세대 Windows Mobile 기반 장치가 도입되면 이러한 장치용 SDK의 일부로 제공되는 관리되는 API를 통해 지금보다도 훨씬 쉽게 일부 기본 구성 요소에 액세스할 수 있을 것입니다. 특히 Telephony API 및 Pocket Outlook API를 매우 쉽게 사용할 수 있습니다.

이 연습에서는 이전 연습에서 수행했던 것처럼 Pocket Outlook을 사용하는 차세대 Windows Mobile 기반 장치용 관리되는 응용 프로그램을 만들겠습니다. 그러나 이 연습과 앞서 수행한 연습 간에는 중요한 차이점이 있습니다. 이 연습에서는 관리되는 API를 사용하므로 사용자가 COM 구성 요소와 직접 상호 운용할 필요가 없습니다. 사용자가 직접 작성해야 하는 코드의 양을 비교하기 위해 연습 2의 응용 프로그램과 기능이 동일한 응용 프로그램을 만듭니다.

차세대 Windows Mobile 기반 장치용 새 Pocket PC 프로젝트를 만들려면

1. 바탕 화면의 아이콘 또는 시작 메뉴를 사용하여 Visual Studio 2005를 시작합니다.

2. 메뉴에서 파일 | 새 프로젝트를 선택합니다.

3. 새 프로젝트 대화 상자의 프로젝트 형식 아래에서 Visual C# | 스마트 장치 | Windows Mobile 5.0 Pocket PC가 선택되어 있는지 확인합니다.

4. 템플릿 아래에서 장치 응용 프로그램이 선택되어 있는지 확인합니다.

5. 이름 입력란에서 이름을 ManagedPOOM으로 변경합니다.

6. 위치 입력란에 C:\labs\COMInteropLab을 입력하거나 원하는 위치를 사용합니다.

7. 솔루션용 디렉터리 만들기 확인란이 아래 그림처럼 선택되어 있는지 확인합니다.

8. 확인을 클릭하여 비어 있는 새 Pocket PC 프로젝트를 만듭니다.

9. 폼에서 아무 위치나 클릭하고 폼의 Text 속성을 변경하여 응용 프로그램 제목을 Managed POOM으로 변경합니다. 속성 창이 표시되지 않으면 Visual Studio 2005 메뉴에서 보기 | 속성 창을 선택하여 표시할 수 있습니다.

10. 응용 프로그램을 보다 쉽게 중지할 수 있도록 폼의 Minimize Box 속성을 False로 변경합니다.

11. 다음 그림에 나와 있는 샘플 사용자 인터페이스에 따라 폼에 목록 상자 하나와 단추 4개를 추가합니다.

참고    도구 상자에서 컨트롤을 폼으로 끌어다 놓을 때는 주의하십시오. 컨트롤을 실수로 두 번 클릭하면 추가 코드가 생성되어 컴파일 오류가 발생할 수 있습니다.
12. 다음 그림과 같이 컨트롤의 Text 속성을 변경하여 단추 이름을 변경합니다.

13. 위 그림의 Pocket PC 폼 오른쪽에 나와 있는 이름에 따라 속성 창에서 각각의 Name 값을 설정하여 단추의 변수 이름을 변경합니다.

14. 디자인 보기에서 단추 4개를 모두 두 번 클릭하여 클릭 이벤트 처리기를 추가합니다. 하나의 클릭 이벤트 처리기를 추가한 후에는 디자인 보기로 다시 전환해야 다음 처리기를 추가할 수 있습니다.

이제 응용 프로그램의 초기 사용자 인터페이스 부분을 만드는 작업이 완료되었습니다.

차세대 Windows Mobile 기반 장치에서는 많은 장치 기능을 관리되는 API에서 제공합니다. 필요한 관리되는 API에 대한 참조를 추가하면 해당 API를 바로 사용할 수 있습니다. Microsoft.WindowsMobile로 시작하는 모든 구성 요소에는 특정 기능과 관련된 관리되는 래퍼가 포함되어 있습니다.

Pocket Outlook을 응용 프로그램에서 사용할 수 있도록 하려면

1. Visual Studio 2005의 솔루션 탐색기에서 ManagedPOOM 프로젝트 아래의 참조를 마우스 오른쪽 단추로 클릭하고 참조 추가를 클릭합니다.

2. 다음 그림과 같이 참조 추가 대화 상자에서 .NET 탭을 클릭하고 Microsoft.WindowsMobile.PocketOutlook을 선택한 다음 확인을 클릭하여 참조를 프로젝트에 추가합니다.

관리되는 응용 프로그램 내에서 Pocket Outlook을 사용하려면 네임스페이스를 추가해야 합니다. 또한 Pocket Outlook 응용 프로그램 인스턴스를 만들고 OutlookSession 개체를 인스턴스화하는 방법으로 해당 인스턴스에 로그온해야 합니다. 응용 프로그램 전체에 걸쳐 Pocket Outlook을 사용하므로 OutlookSession은 인스턴스 변수 형태로 사용됩니다.

3. Form1.cs 파일의 시작 부분에 있는 다른 using 문 바로 아래에 다음 문을 추가하여 Microsoft.WindowsMobile.PocketOutlook 네임스페이스에 대한 별칭을 만듭니다. Form1.cs 파일에는 다른 모든 코드도 추가됩니다.

using Microsoft.WindowsMobile.PocketOutlook;

Microsoft.WindowsMobile.PocketOutlook 네임스페이스에는 Pocket Outlook에 대한 올바른 관리되는 인터페이스가 들어 있으므로 연습 2에서 수행했던 것처럼 COM Interop를 설정할 필요가 없습니다.

4. Form1 클래스에 다음 인스턴스 변수를 추가합니다.

private OutlookSession oSession;
5. Visual Studio 2005에서 Form1.cs(디자인) 창을 열고 폼에서 컨트롤 외부의 아무 위치나 클릭한 다음 속성 창에서 도구 모음의 이벤트 단추를 클릭합니다.

6. Load 이벤트를 찾아 두 번 클릭합니다.

7. 이제 Form1_Load 이벤트 처리기가 만들어졌으며 여기에 다음 코드를 추가해야 합니다.

            oSession = new OutlookSession();
            ShowContacts();
8. Visual Studio 2005에서 Form1.cs(디자인) 창을 다시 열고 폼에서 컨트롤 외부의 아무 위치나 클릭한 다음 속성 창에서 도구 모음의 이벤트 단추를 클릭합니다.

9. Closing 이벤트를 찾아 두 번 클릭합니다.

10. 이제 Form1_Closing 이벤트 처리기가 만들어졌으며 여기에 다음 코드를 추가해야 합니다.

oSession.Dispose();
11. ShowContacts라는 새 메서드를 Form1.cs 파일에 다음 코드와 함께 추가합니다.

private void ShowContacts()
{
    // 목록 상자를 Pocket Outlook의 연락처 정보로 
채웁니다. ContactFolder cFolder = oSession.Contacts; listBox1.BeginUpdate(); listBox1.Items.Clear(); foreach (Contact contact in cFolder.Items) { string name = contact.FirstName + " " + contact.LastName; listBox1.Items.Add(name); } listBox1.EndUpdate(); }

ShowContacts의 코드를 이전 연습의 ShowContacts 코드와 비교하면 차세대 Windows Mobile 기반 장치와 관리되는 코드를 함께 사용하는 경우 연락처 데이터베이스에 훨씬 간편하게 액세스할 수 있음을 알 수 있습니다. 실제로 연락처 정보를 검색할 때는 굵게 표시된 문만 있으면 됩니다. 다른 문은 모두 연락처 정보를 목록 상자에 추가하기 위한 것입니다. 이제 응용 프로그램을 첫 번째로 테스트 실행해 봅니다.

12. Pocket PC SE 에뮬레이터가 대상 장치로 선택되어 있는지 확인합니다.

13. 도구 모음의 장치에 연결 단추를 클릭하여 Pocket PC SE 에뮬레이터에 대한 연결을 설정합니다.

아직 시작되지 않은 경우 Pocket PC SE 에뮬레이터가 시작됩니다. Visual Studio 2005와 연결이 설정되면 연결 대화 상자에 확인 메시지가 표시됩니다. 응용 프로그램을 테스트하려면 먼저 연락처 데이터베이스에 연락처를 한두 개 추가해야 합니다.

14. Pocket PC SE 에뮬레이터가 표시되어 있는지 확인하고 시작(Start) 메뉴를 클릭한 다음 연락처(Contacts)를 클릭합니다.

15. 새 연락처(New Contacts)를 몇 개 추가합니다. 연락처 이름만 입력하면 됩니다.

이제 Pociet PC SE 에뮬레이터에서 응용 프로그램을 배포 및 실행할 준비가 되었습니다.

16. F5 키를 누르거나 Visual Studio 2005 메뉴에서 디버그 | 디버깅 시작을 선택하여 응용 프로그램을 디버그 모드에서 시작합니다.

17. ManagedPoom 배포 대화 상자에서 Windows Mobile Pocket PC 에뮬레이터 장치가 선택되어 있는지 확인한 다음 배포 단추를 클릭합니다.

잠시 기다리면 다음 그림과 같이 응용 프로그램이 에뮬레이터 내에서 실행됩니다. 응용 프로그램의 기본 폼이 표시되는 즉시 연락처 데이터베이스에 입력한 연락처가 응용 프로그램의 목록 상자에 나타나는 것을 확인할 수 있습니다. 이 연락처는 물론 연락처 데이터베이스에서 가져온 것입니다.

18. 연락처가 목록 상자에 표시되는지 확인한 후에 폼 오른쪽 윗부분의 확인 단추를 클릭하여 응용 프로그램을 다시 끝낼 수 있습니다.

다음에 수행할 작업은 연락처 정보를 추가, 업데이트, 삭제 및 확인하기 위해 단추 클릭 이벤트 처리기에 기능을 추가하는 것입니다. 연락처에 대한 자세한 정보를 보고 새 연락처를 삽입하고 선택한 연락처에 대한 약속을 삽입하려면, 먼저 응용 프로그램에서 사용할 여러 개의 추가(단순) 폼을 만들어야 합니다. 맨 처음 만드는 폼은 ContactDetails 폼입니다.

응용 프로그램의 기능을 확장하려면

1. Visual Studio 2005 메뉴에서 프로젝트 | Windows Form 추가를 선택하고 항목 추가 대화 상자의 이름 필드에 ContactDetails.cs를 입력한 다음 추가 단추를 클릭합니다.

2. 다음 그림과 같이 레이블 4개를 추가하고 이름을 지정한 다음 입력란 4개를 추가해야 하는 새 폼이 표시됩니다.

참고    도구 상자에서 컨트롤을 폼으로 끌어다 놓을 때는 주의하십시오. 컨트롤을 실수로 두 번 클릭하면 추가 코드가 생성되어 컴파일 오류가 발생할 수 있습니다.

3. 해당 Text 속성을 지워 입력란을 비운 다음 Name 속성을 사용하여 위의 그림에서 폼 오른쪽에 표시되어 있는 것과 같이 입력란의 이름을 지정합니다.

4. 해당 ReadOnly 속성을 true로 설정하여 Name 입력란을 읽기 전용으로 만듭니다.

5. 각 입력란에 대해 TextChanged 이벤트 처리기를 추가합니다. TextChanged 이벤트 처리기를 추가하려면 입력란을 클릭하고 속성 창에서 TextChanged 이벤트를 찾아 두 번 클릭합니다. 사용 가능한 이벤트를 모두 보려면 이벤트 단추를 클릭해야 합니다. 디자인 보기 및 코드 보기를 전환해 가며 작업해야 합니다.

6. Visual Studio 2005에서 ContactDetails.cs(디자인) 창을 열고 폼에서 컨트롤 외부의 아무 위치나 클릭한 다음 속성 창에서 도구 모음의 이벤트 단추를 클릭합니다.

7. Load 이벤트를 찾아 두 번 클릭합니다.

8. 디자인 보기로 돌아와 Closing을 두 번 클릭하여 Form_Closing 이벤트를 추가합니다.

9. ContactDetails.cs 소스 파일에서 Ctrl+A를 눌러 모든 텍스트를 선택하고 모든 코드를 다음 코드로 대체합니다. 이 문서의 코드를 붙여 넣어도 됩니다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.WindowsMobile.PocketOutlook;

namespace ManagedPOOM
{
    public partial class ContactDetails : Form
    {
        private Contact thisContact;
        private bool isDirty;
        private bool newEntry;

        public ContactDetails(Contact contact, bool 
newEntryRequested) { InitializeComponent(); thisContact = contact; isDirty = false; newEntry = newEntryRequested; } private void ContactDetails_Load(object sender, EventArgs e) { if (thisContact != null && !newEntry) { tbName.Text = thisContact.FirstName + " " +
thisContact.LastName; tbCompany.Text = thisContact.CompanyName; tbPhone.Text = thisContact.BusinessTelephoneNumber; tbEmail.Text = thisContact.Email1Address; this.Text = "ContactDetails"; tbName.ReadOnly = true; } else if (newEntry) { this.Text = "새 연락처 추가"; tbName.ReadOnly = false; } } private void tbName_TextChanged(object sender, EventArgs e) { isDirty = true; } private void tbCompany_TextChanged(object sender, EventArgs
e) { isDirty = true; } private void tbPhone_TextChanged(object sender, EventArgs e) { isDirty = true; } private void tbEmail_TextChanged(object sender, EventArgs e) { isDirty = true; } private void ContactDetails_Closing(object sender,
CancelEventArgs e) { if (isDirty) { // 세부 정보가 변경되었습니다. // 연락처 목록에서 정보를 업데이트하십시오. if (newEntry) { string[] nameParts; nameParts = tbName.Text.Split(' '); if (nameParts[0].Length == 0) { MessageBox.Show("이름 필드에 내용을 입력해야
합니다."); e.Cancel = true; } else { thisContact.FirstName = nameParts[0]; if (nameParts.Length == 2) { thisContact.LastName = nameParts[1]; } else if (nameParts.Length > 2) { // 중간 이름도
// 입력했습니다. // 추가로 입력하는 데이터는
// 무시됩니다! thisContact.MiddleName = nameParts[1]; thisContact.LastName = nameParts[2]; } } } thisContact.CompanyName = tbCompany.Text; thisContact.BusinessTelephoneNumber = tbPhone.Text; thisContact.Email1Address = tbEmail.Text; thisContact.Update(); } } } }

이 코드는 주로 사용자 인터페이스 제어 작업을 처리하기 때문에 많은 부분이 연습 2에서 ContactDetails 폼에 대해 추가한 코드와 동일합니다. 가장 큰 차이점이 있다면 여기서는 ContactItem 개체 대신 Contact 개체를 사용하여 연락처 정보를 참조한다는 것입니다. 그리고 Save 메서드 대신 Update 메서드를 사용하여 연락처의 변경 내용을 저장한다는 것이 또 다른 차이점입니다. 코드 설명을 보려면 연습 2의 ContactDetails 폼 설명을 다시 읽어 보십시오. 다음에는 연락처 정보 가져오기 단추를 클릭하면 ContactDetails 대화 상자가 표시되도록 Form1.cs 파일을 수정해야 합니다. ContactDetails 대화 상자가 표시되기 전에 목록 상자에서 현재 선택한 연락처가 연락처 데이터베이스에서 검색되어 ContactDetails 대화 상자 생성자로 전달됩니다.

10. Form1.cs 파일에서 btnDetails_Click 이벤트 처리기를 찾아 다음 코드를 추가합니다.

ContactFolder cFolder = oSession.Contacts;

if (listBox1.SelectedIndex == -1)
    listBox1.SelectedIndex = 0;

ContactDetails cd = new 
ContactDetails(cFolder.Items[listBox1.SelectedIndex], false); cd.ShowDialog();

btnDetails_Click 이벤트 처리기의 코드와 연습 2에서 나왔던 동일한 이벤트 처리기의 코드를 비교해 보면 차세대 Windows Mobile 기반 장치의 관리되는 API를 사용하는 경우 작업이 훨씬 단순해짐을 명확하게 확인할 수 있습니다. 이제 연락처 정보를 표시 및 수정하기 위한 기능을 추가하는 작업이 완료되었습니다. 다음에는 이전 연습에서 살펴보았듯이 ContactDetails 대화 상자를 공유하는 새 연락처 추가 단추에 대해 이벤트 처리기에 코드를 추가합니다.

11. Form1.cs 파일에서 btnNewContact_Click 이벤트 처리기를 찾아 다음 코드를 추가합니다.

ContactFolder cFolder = oSession.Contacts;
ContactDetails cd = new ContactDetails(cFolder.Items.AddNew(),
true); cd.ShowDialog(); ShowContacts();

여기서 알 수 있듯이 btnNewContact_Click 이벤트 처리기의 코드와 btnDetails_Click 이벤트 처리기의 코드는 ContactDetails 대화 상자의 생성자가 호출되는 방식과 새 연락처가 추가된 경우 목록 상자에서 추가적인 업데이트가 수행된다는 점을 제외하면 거의 동일합니다.

다음에는 연락처 목록에서 연락처 항목을 삭제하는 몇 가지 기능을 추가합니다. 여기서도 사용자 인터페이스는 단순합니다. 예를 들어 사용자가 연락처를 삭제하기로 결정해도 이를 확인하는 질문 메시지가 표시되지 않습니다.

12. Form1.cs 파일에서 btnDelContact_Clickk 이벤트 처리기를 찾아 다음 코드를 추가합니다.

ContactFolder cFolder = oSession.Contacts;

if (listBox1.SelectedIndex == -1)
    listBox1.SelectedIndex = 0;

cFolder.Items[listBox1.SelectedIndex].Delete();

ShowContacts();

연락처 목록에 항목을 추가 및 업데이트하는 것과 마찬가지로 항목을 삭제하는 것도 매우 단순합니다. 즉, ContactFolder 항목 컬렉션 목록에서 올바른 항목을 선택하여 해당 Delete 메서드를 호출하면 됩니다.

응용 프로그램을 테스트하기 전에 마지막으로 수행할 작업은 연락처 목록에서 선택한 연락처에 대해 약속을 입력할 수 있는 새 대화 상자를 만드는 것입니다.

13. Visual Studio 2005 메뉴에서 프로젝트 | Windows Form 추가를 선택하고 항목 추가 대화 상자의 이름 필드에 AddAppt.cs를 입력한 다음 추가 단추를 클릭합니다.

14. 다음 그림과 같이 레이블 3개를 추가하고 이름을 지정한 다음 입력란 2개를 추가하고 하나의 날짜/시간 선택을 추가해야 하는 새 폼이 표시됩니다.

15. 해당 Text 속성을 지워 입력란을 비운 다음 Name 속성을 사용하여 위의 그림에서 폼 오른쪽에 표시되어 있는 것과 같이 입력란의 이름을 지정합니다.

16. 해당 ReadOnly 속성을 true로 설정하여 Name 입력란을 읽기 전용으로 만듭니다.

17. Visual Studio 2005에서 AddAppt.cs(디자인) 창을 열고 폼에서 컨트롤 외부의 아무 위치나 클릭한 다음 속성 창에서 도구 모음의 이벤트 단추를 클릭합니다.

18. Load 이벤트를 찾아 두 번 클릭합니다.

19. 디자인 보기로 돌아와 Closing을 두 번 클릭하여 Form_Closing 이벤트를 추가합니다.

20. AddAppt.cs 소스 파일에서 Ctrl+A를 눌러 모든 텍스트를 선택하고 모든 코드를 다음 코드로 대체합니다. 이 문서의 코드를 붙여 넣어도 됩니다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.WindowsMobile.PocketOutlook;

namespace ManagedPOOM
{
    public partial class AddAppt : Form
    {
        private Contact thisContact;
        private Appointment thisAppt;

        public AddAppt(Contact contact, Appointment appt)
        {
            InitializeComponent();
            thisContact = contact;
            thisAppt = appt;
        }

        private void AddAppt_Load(object sender, EventArgs e)
        {
            tbName.Text = thisContact.FirstName + " " + 
thisContact.LastName; dtpDate.Value = DateTime.Now; } private void AddAppt_Closing(object sender, CancelEventArgs
e) { if (tbSubject.Text.Length == 0) { MessageBox.Show("올바른 제목을 추가해야 합니다."); e.Cancel = true; } else { thisAppt.Subject = tbName.Text + " - " +
tbSubject.Text; thisAppt.Start = dtpDate.Value; thisAppt.Update(); } } } }

ContactDetails 대화 상자와 마찬가지로 여기서 추가한 코드도 대부분 사용자 인터페이스를 처리합니다. 그러나 ContactDetails.cs 소스 파일의 코드와 AddAppt.cs 소스 파일의 코드를 비교해 보면 약속을 추가하는 작업과 새 연락처를 추가하는 작업이 매우 비슷함을 알 수 있습니다. 위에서 추가한 기능을 사용하려면 약속 단추의 이벤트 처리기를 구현해야 합니다.

이를 위해서는 약속 단추를 클릭하면 AddAppts 대화 상자가 표시되도록 Form1.cs 파일을 최종적으로 수정해야 합니다. AddAppts 대화 상자가 표시되기 전에 목록 상자에서 현재 선택한 연락처가 연락처 데이터베이스에서 검색되어 AddAppts 대화 상자 생성자로 전달됩니다. 또한 비어 있는 새 약속도 대화 상자로 전달됩니다.

21. Form1.cs 파일에서 btnNewAppt_Click 이벤트 처리기를 찾아 다음 코드를 추가합니다.

ContactFolder cFolder = oSession.Contacts;
AppointmentFolder aFolder = oSession.Appointments;

if (listBox1.SelectedIndex == -1)
    listBox1.SelectedIndex = 0;

AddAppt aa = new AddAppt(cFolder.Items[listBox1.SelectedIndex],
                         aFolder.Items.AddNew());
aa.ShowDialog();

이제는 응용 프로그램 테스트 작업만 남아 있습니다. 원하는 대로 연락처를 입력, 수정 및 삭제하고 새 약속을 입력할 수 있습니다. 이 응용 프로그램에 입력한 정보를 Pocket Outlook에서도 사용할 수 있는지 확인하려면 연락처 또는 일정으로 변경하여 해당 응용 프로그램에 표시되는 정보를 ManagedPOOM 응용 프로그램에 입력한 정보와 비교하면 됩니다.

22. F5 키를 누르거나 Visual Studio 2005 메뉴에서 디버그 | 디버깅 시작을 선택하여 응용 프로그램을 디버그 모드에서 시작합니다.

23. 모든 옵션을 테스트하여 응용 프로그램이 제대로 작동하는지 확인하고 작업 결과를 주기적으로 연락처 또는 일정과 비교합니다.

24. 테스트가 완료되면 폼 오른쪽 윗부분의 확인 단추를 클릭하여 응용 프로그램을 끝냅니다.

부록 A: 장치 또는 에뮬레이터에서 실행 중인 응용 프로그램 종료

이 작업에서는 장치 또는 에뮬레이터에서 실행 중인 응용 프로그램을 종료하는 방법을 설명합니다. 디버거를 연결하지 않고 시작한 응용 프로그램을 종료한 후 새로운 응용 프로그램 복사본을 배포해야 하는 경우 여기 나와 있는 정보를 유용하게 사용할 수 있습니다. 응용 프로그램을 종료하려면 Visual Studio의 Remote Process Viewer(원격 프로세스 뷰어) 원격 도구를 사용합니다.

프로세스를 종료해야 하므로 실행 파일의 이름을 알아야 합니다. 대부분의 경우 이 파일 이름은 Visual Studio 프로젝트 이름과 같습니다. 실행 파일의 이름을 모르는 경우에는 프로젝트 속성을 통해 확인할 수 있습니다.

1. Visual Studio에서 프로젝트를 선택한 다음 xxx 속성을 선택합니다. 여기서 xxx는 현재 프로젝트 이름입니다.

2. 어셈블리 이름 필드의 값을 확인합니다. 실행 파일은 이 이름으로 장치 또는 에뮬레이터에서 실행됩니다.

3. 속성 대화 상자를 닫습니다.

이제 프로세스를 종료할 수 있습니다.

4. 시작 메뉴에서 시작 > Microsoft Visual Studio 2005를 클릭한 다음 Visual Studio Remote Tools > Remote Process Viewer(Visual Studio 원격 도구 > 원격 프로세스 뷰어)를 클릭합니다.

5. Windows CE 장치 선택 대화 상자가 표시되면 다음 그림과 같이 응용 프로그램을 실행 중인 에뮬레이터 또는 장치를 선택하고 확인을 클릭합니다.

6. 에뮬레이터 또는 장치에 연결되면 다음 그림과 같이 원격 프로세스 뷰어의 위쪽 창에서 종료할 응용 프로그램을 찾습니다.

전체 프로세스 이름을 보려면 맨 왼쪽의 프로세스 열을 확장해야 할 수도 있습니다.

7. 프로세스 이름을 클릭하여 프로세스를 선택합니다.

8. 프로세스를 종료하려면 원격 프로세스 뷰어 메뉴에서 파일 > 프로세스 종료를 선택합니다.

참고    프로세스 종료를 클릭하기 전에 올바른 프로세스가 선택되어 있는지 확인하십시오. 잘못된 프로세스를 종료하면 장치 또는 에뮬레이터를 사용할 수 없게 될 수 있으며 이 경우 다시 사용하려면 재설정해야 합니다.
9. 원격 프로세스 뷰어 메뉴에서 대상 > 새로 고침을 선택하여 프로세스가 종료되었는지 확인한 다음 위쪽 창으로 다시 스크롤합니다. 응용 프로그램 이름이 여전히 표시되어 있으면 프로세스가 아직 종료되지 않은 것이므로 위의 단계를 반복해야 합니다.
참고    대부분의 프로세스는 위의 단계를 한 번만 시도하면 종료되지만 응용 프로그램 상태에 따라 단계를 두 번 반복해야 하는 경우도 있습니다.

축하합니다! .NET Compact Framework 2.0 응용 프로그램에 COM 개체 통합 실습을 마쳤습니다.

요약

이 실습에서는 다음 연습을 수행했습니다.

  • Visual Studio 2005를 사용하여 COM 개체 만들기 및 사용
  • 관리되는 응용 프로그램에서 Pocket Outlook에 액세스
  • 차세대 Windows Mobile 기반 장치에서 Pocket Outlook에 액세스

이 실습을 통해 .NET Compact Framework 2.0의 COM 상호 운용성 기능을 살펴보기 위한 다양한 응용 프로그램을 만들어 보았습니다. 또한 ATL을 사용하여 처음부터 작성한 COM 구성 요소를 관리되는 응용 프로그램 내에서 사용하는 방법과 POOM(Pocket Outlook Object Model)을 사용하여 기존 COM 구성 요소를 관리되는 응용 프로그램 내에서 사용하는 방법도 배웠습니다. 마지막으로 .NET Compact Framework 버전 2.0의 뛰어난 COM 지원을 통해 COM 인터페이스가 포함된 기존 응용 프로그램을 차세대 Windows Mobile 기반 장치에서 보다 쉽게 사용할 수 있음을 확인했습니다. 이는 해당 응용 프로그램 및 구성 요소의 기능을 제공하는 관리되는 API를 활용함으로써 가능합니다.


arrow 트랙백 | 댓글



[PREV] [1][2] [NEXT]
관리자  |   글쓰기
BLOG main image
- 블로그를 처음 만들면서
분류 전체보기 (142)
기술동향 뉴스 (51)
신조어 사전 (1)
기술용어집 (5)
영상처리 기술 (29)
IT 사용정보 (7)
프로그램 기술 (23)
학술정보 (1)
생활정보 (9)
낙서장 (13)
나의 이야기 (0)
About Me (0)
Total :
Today :
Yesterday :
rss
위치로그 : 태그 : 방명록 : 관리자
multimedia's Blog is powered by Daum / Designed by plyfly.net