Programming - cpueblo.com

RAPI 를 이용해 PDA 의 연락처를 PC 에서 읽기


RAPI 를 이용해 PDA 의 연락처를 PC 에서 읽는 방법을 소개합니다

글쓴이 : 유광희 날짜 : 2007-06-08 (금) 15:01 조회 : 18614
RAPI 를 이용해 PDA 의 연락처를 PC 에서 읽는 방법을 소개합니다

소개

RAPI 란 데스크탑 에서 PDA를 제어하기 위한 Remote API 의 약자 입니다
RAPI 를 이용하여 ActiveSync 가 연결된 PDA 장치의 연락처 정보를 직접 읽어서 출력하는 예제 입니다.

개발 환경

Visual C++ 6.0 및 Pocket PC 2003 SE 기기 & Pocket PC 2003 SDK

주요 소스


bool CRAPIContacts :: Read()
{
    // RAPI 핸들용
    HRESULT hr;

    // DB 검색용
    CEOID    m_ContactsCEOID;
    HANDLE    m_ContactsHDB;

    // DB 파일 핸들 얻기 처리용
    HANDLE    hEnum;
    CEOID    enumCeoid;
    CEOIDINFO oidInfo;

    // DB 내의 데이터 레코드 처리용
    DWORD    dwRecSize = 0;
    WORD    wProps = 0;
    PBYTE    pRecordvar = NULL;

    // DB 레코드 위치 관리용
    CEOID    oid = 0;
    DWORD    dwIndex = 0;
    int        iRecIndex = 0;

    try
    {
        //
        // RAPI 초기화 하기 (내부에서 연결도 하더라)
        //
        hr = CeRapiInit();
        if (hr != ERROR_SUCCESS)
            throw "RAPI 초기화 에러";


        //
        // PDA 내부의 Database 를 검색하여 Contacts Database 의 핸들을 얻자꾸나
        //
        m_ContactsCEOID = NULL;

        hEnum = CeFindFirstDatabase(0);
        while(enumCeoid = CeFindNextDatabase( hEnum))
        {
            CString strDBName;

            // DB 명을 얻어서 ANSI STR 로 바꾼 후에
            CeOidGetInfo(enumCeoid, &oidInfo);
            strDBName = oidInfo.infDatabase.szDbaseName;

            // Contacts Database 이름이면 연락처 DB 이니..
            if (int Pos = strDBName.Find("Contacts Database") >= 0)
            {
                m_ContactsCEOID = enumCeoid;
                break;
            }
        }


        //
        // 연락처 DB 를 검색하지 못하였다면 실패
        //
        if (!m_ContactsCEOID)
            throw "연락처 DB 검색 실패";


        //
        // 연락처 DB 를 열자꾸나
        //
        HWND m_hWnd = NULL;
        m_ContactsHDB = CeOpenDatabase (&m_ContactsCEOID, NULL, 0,  CEDB_AUTOINCREMENT, m_hWnd);
        if( m_ContactsHDB == INVALID_HANDLE_VALUE )
            throw "DB 연결 실패";


        //
        // 첫 위치로 이동
        //
        iRecIndex = 0;
        oid = CeSeekDatabase (m_ContactsHDB, CEDB_SEEK_BEGINNING, iRecIndex, &dwIndex);
        if(GetLastError() != ERROR_SUCCESS)
            throw "위치 이동 실패";


        //
        // 첫번째 Row 를 가져오자~
        //
        oid = CeReadRecordProps (m_ContactsHDB, CEDB_ALLOWREALLOC, &wProps, NULL, &(LPBYTE )pRecordvar, &dwRecSize);
        if( oid == ERROR_INSUFFICIENT_BUFFER )
            throw "첫 데이터 읽기 실패";


        //
        // 뺑뺑이를 돌려
        //
        CONTACTITEM ContactItem;
        while (oid != 0 )
        {
            ZeroMemory(&ContactItem, sizeof(CONTACTITEM));

            //
            // 데이터 분석 시작
            //
            PCEPROPVAL pRecord = (PCEPROPVAL)pRecordvar;

            WORD    iPropId;
            int        iPropDataType;

            for( int i = 0; i < wProps; i++ )
            <FONT COLOR=#0000FF>{
                CString Str = "";
                iPropId = HIWORD(pRecord[i].propid );
                iPropDataType = LOWORD(pRecord[i].propid );


                //
                // 매크로로 CASE 를 처리하다. 같은 문장이 많아
                //
#define CASECONTACTITEM(v, Out)    \\
    case v:    \\
    Str = pRecord[i].val.lpwstr;    \\
    if (Str != "") \\
    strncpy((char *)&Out, (LPCTSTR)Str, sizeof(Out)); \\
                break;


                switch (iPropId)
                {
                    CASECONTACTITEM(0x3A06,    ContactItem.FirstName);
                    CASECONTACTITEM(0x3A1C,    ContactItem.MobilePhoneNumber);
                    CASECONTACTITEM(0x4083,    ContactItem.EMail1);
                    CASECONTACTITEM(0x3A11,    ContactItem.LastName);
                    CASECONTACTITEM(0x3a17,    ContactItem.JobTitle);
                    CASECONTACTITEM(0x3a16,    ContactItem.CompanyName);
                    CASECONTACTITEM(0x3A18,    ContactItem.DepartmentName);
                    CASECONTACTITEM(0x3A08,    ContactItem.FirstName);
                    CASECONTACTITEM(0x3A09,    ContactItem.HomeTelephoneNumber);
                    CASECONTACTITEM(0x3A05,    ContactItem.ContactsSuffix);
                }
            }

            OnProgress(Sender, &ContactItem, iRecIndex, 10);


            //
            // 다음 Row 를 요청
            //
            oid = CeReadRecordProps (m_ContactsHDB, CEDB_ALLOWREALLOC, &wProps, NULL, &(LPBYTE )pRecordvar, &dwRecSize);
            //OutputDebugString("   \\n");

            iRecIndex++;
        }

        //
        // 닫자
        //
        CeCloseHandle(m_ContactsHDB);
        CeRapiUninit();
        return true;
    }

    //
    // 캐치~ 아웃~
    //
    catch (...)
    {
        // 열린 DB 가 있으면 닫자
        if (m_ContactsHDB)
            CloseHandle(m_ContactsHDB);

        // RAPI UnInit
        CeRapiUninit();
        return false;
    }
}

예제와 소스 다운로드

다운로드

작성자

http://cpueblo.com

유광희


Downloads

  • GetContactsWithRAPI.zip

  •