다음을 통해 공유


IPacket

업데이트: 2007년 11월

데이터를 보관하며 IDevicePacketStream을 구현하여 장치 에이전트 응용 프로그램과 데스크톱 컴퓨터 간에 데이터를 전송하는 개체에 사용됩니다.

IPacket : public IUnknown

메서드

메서드

설명

IPacket::get_Count

패킷의 총 데이터 개체 수를 가져옵니다.

IPacket::IsEndOfPacket

내부 반복기가 패킷의 끝에 도달했는지 확인합니다.

IPacket::ReadBool

개체에서 부울 값을 읽고 내부 반복기가 패킷의 다음 데이터 개체를 가리키도록 합니다.

IPacket::ReadByte

개체에서 바이트를 읽고 내부 반복기가 패킷의 다음 데이터 개체를 가리키도록 합니다.

IPacket::ReadBytes

개체에서 바이트 배열을 읽고 내부 반복기가 패킷의 다음 데이터 개체를 가리키도록 합니다.

IPacket::ReadInt32

개체에서 정수를 읽고 내부 반복기가 패킷의 다음 데이터 개체를 가리키도록 합니다.

IPacket::ReadChar

개체에서 문자를 읽고 내부 반복기가 패킷의 다음 데이터 개체를 가리키도록 합니다.

IPacket::ReadDataType

패킷에 있는 현재 개체의 데이터 형식을 열거형 값으로 반환합니다.

IPacket::ReadString

개체에서 문자열을 읽고 내부 반복기가 패킷의 다음 데이터 개체를 가리키도록 합니다.

IPacket::Reset

패킷의 내부 반복기가 패킷의 첫 번째 데이터 개체를 가리키도록 다시 설정합니다. 다음 읽기 작업에서는 패킷의 첫 번째 데이터 개체를 읽습니다.

IPacket::WriteBool

개체에 부울 값을 씁니다.

IPacket::WriteByte

개체에 바이트를 씁니다.

IPacket::WriteBytes

개체에 바이트 배열을 씁니다.

IPacket::WriteChar

개체에 문자를 씁니다.

IPacket::WriteInt32

개체에 정수를 씁니다.

IPacket::WriteString

개체에 문자열을 씁니다.

설명

이 인터페이스를 구현하는 개체를 가져오려면 GetNewPacket를 사용합니다.

이 인터페이스를 구현하는 개체는 byte, byte[], string, int 및 char 형식의 개체만 보관할 수 있습니다. 이 인터페이스는 사용자 지정 개체를 읽고 쓰도록 확장할 수 없습니다. 그러나 사용자는 사용자 지정 데이터 형식을 기본 데이터 형식으로 분할하거나 바이트 배열로 serialize하여 스트림을 통해 사용자 지정 개체를 전송할 수 있습니다.

예제

다음 예제는 패킷 하나를 데스크톱에 쓰고 데스크톱에서 패킷 하나를 읽는 장치 에이전트 응용 프로그램입니다.

#include "stdafx.h"

// Custom implementation of IAgentTransportShutdownCallback
class MyShutdownCallback: public IAgentTransportShutdownCallback
{
private:
    long ref;
public:
    HRESULT STDMETHODCALLTYPE Shutdown(IUnknown *in_pUnknown) 
    {
        // Add your cleanup code here 
        MessageBox(NULL,_T("conmanclient2 exited"),_T("conmanclient exited"),0);
        return 0;
    }

    // Must implement members from IUnknown
    HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject)
    {
        return 0;
    }
    ULONG STDMETHODCALLTYPE AddRef( void)
    {
        return InterlockedIncrement(&ref);
    }

    ULONG STDMETHODCALLTYPE Release( void)
    {
        if(InterlockedDecrement(&ref) == 0)
        {
            delete this;
            return 0;
        }
        return ref;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    // Load the Device Agent Transport Library
    HINSTANCE hmod;
    hmod = LoadLibrary(L"DeviceAgentTransport.dll");

    // Get an instance of IDeviceAgentTransport
    GetDeviceAgentTransportFunc f1 = (GetDeviceAgentTransportFunc)
        ::GetProcAddress(hmod, L"GetDeviceAgentTransport");
    IDeviceAgentTransport *pTransport = NULL;
    f1(&pTransport);

    // Register the callback with the Device Agent Transport
    MyShutdownCallback *shutdownCallback = new MyShutdownCallback();
    pTransport->RegisterShutdownCallback(shutdownCallback,shutdownCallback);

    // Let the desktop application know that this remote agent was deployed successfully 
    // and that this remote agent will handle the supplied list of services.
    LPCOLESTR szServiceIds[] = {L"F85E57BA-5AE9-4FF7-8433-6AB7D991D033"};
    pTransport->AcknowledgeLaunch(1, szServiceIds);

    // Open a communcation stream with desktop application on the service.
    IDevicePacketStream *pStream = NULL;
    pTransport->AcceptConnectionEx(szServiceIds[0], &pStream);

    // Get an instance of IPacket
    GetNewPacketFunc f2 = (GetNewPacketFunc) ::  GetProcAddress(hmod, L"GetNewPacket");
    IPacket *pPacket = NULL;
    f2(&pPacket);

    // Write a message and sent the packet.
    pPacket->WriteBool(true);
    pPacket->WriteByte(0xff);
    pPacket->WriteChar('c');
    pPacket->WriteInt32(1024);
    pPacket->WriteString(L"Hello Desktop Computer");
    pStream->Write(pPacket);

    // Check for a packet while communication stream is connected.
    f2(&pPacket);
    VARIANT_BOOL connected;
    pStream->IsConnected(&connected);
    while(connected)
    {
        pStream->IsConnected(&connected);
        VARIANT_BOOL available;

        // If a packet is found, display the string.
        pStream->IsPacketAvailable(&available);
        if(available)
        {
            pStream->Read(&pPacket);
            VARIANT_BOOL endofpacket;
            pPacket->IsEndOfPacket(&endofpacket);
            while (!endofpacket) 

            {
                pPacket->IsEndOfPacket(&endofpacket);
                DataTypeEnum datatype;
                pPacket->ReadDataType(&datatype);
                switch (datatype)
                {
                    case DT_BYTE:
                        BYTE byteValue;
                        pPacket->ReadByte(&byteValue);
                        break;
                    case DT_INT32:
                        INT32 intValue;
                        pPacket->ReadInt32(&intValue);
                        break;
                    case DT_WIDECHAR:
                        wchar_t charValue;
                        pPacket->ReadChar(&charValue);
                        break;
                    case DT_BOOL:
                        VARIANT_BOOL boolValue;
                        pPacket->ReadBool(&boolValue);
                        break;
                    case DT_BYTEARRAY:
                        BYTE * buffer[100];
                        ULONG length;
                        pPacket->ReadBytes(buffer,&length);
                        break;
                    case DT_STRING:
                        LPWSTR string;
                        pPacket->ReadString(&string);
                        MessageBox(NULL, string,string,0);
                        break;
                    default:
                        break;
                }
            };
        }
    };
    return 0;
}

관리되는 동등 항목

Microsoft.SmartDevice.DeviceAgentTransport.IPacket

요구 사항

DeviceAgentTransport.h

참고 항목

기타 리소스

관리되지 않는 장치측 스마트 장치 연결 API