チュートリアル : デスクトップ アプリケーションとデバイス アプリケーションの間でデータを交換する

更新 : 2007 年 11 月

このチュートリアルでは、デバイス エージェント アプリケーション、デスクトップ アプリケーション、およびデータ ストア内のアドオン パッケージを作成します。デスクトップ アプリケーションは、アドオン パッケージ内の情報に基づいてデバイス エージェントの配置と起動を行います。その後、デスクトップ アプリケーションはデバイス エージェント アプリケーションとパケット データを交換し、終了します。このチュートリアルでは、次のタスクを実行します。

  • マネージ デバイス エージェント アプリケーションを作成します。

  • デバイス エージェント アプリケーション用のアドオン パッケージを作成します。

  • パッケージの起動とデバイス エージェントとの通信を行うデスクトップ アプリケーションを作成します。

Bb546002.alert_note(ja-jp,VS.90).gifメモ :

お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。

デバイス エージェント アプリケーションを作成する

デバイス エージェント アプリケーションを作成するには

  1. Visual Studio を起動します。

  2. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。

    [新しいプロジェクト] ダイアログ ボックスが表示されます。

  3. (Visual C#) [Visual C#] を展開し、[スマート デバイス] をクリックします。プロジェクトに「DeviceAgent」、ソリューションに「DataExchange」という名前を付けます。[OK] をクリックします。

    (Visual Basic) [Visual Basic] を展開し、[スマート デバイス] をクリックします。プロジェクトに「DeviceAgent」、ソリューションに「DataExchange」という名前を付けます。[OK] をクリックします。

    [新規スマート デバイス プロジェクトの追加] ダイアログ ボックスが表示されます。

  4. ターゲット プラットフォームとして [Windows Mobile 5.0 Smartphone SDK] を選択します。次に、テンプレート ペインの [コンソール アプリケーション] をクリックし、[OK] をクリックします。

    新しい DeviceAgent プロジェクトがソリューション エクスプローラに表示されます。

  5. (Visual C#) ソリューション エクスプローラで [参照設定] を右クリックし、[参照の追加] をクリックします。

    (Visual Basic) ソリューション エクスプローラで [DeviceAgent] を右クリックし、[参照の追加] をクリックします。

    [参照の追加] ダイアログ ボックスが表示されます。

  6. [参照] タブをクリックし、drive:\Program Files\Common Files\Microsoft Shared\CoreCon\1.0\Target\Lib に移動します。Microsoft.Smartdevice.DeviceAgentTransport.dll をクリックし、[OK] をクリックします。

    プロジェクトに Microsoft.Smartdevice.DeviceAgentTransport への参照が追加されます。

  7. Program.cs (C#) または Module1.vb (Visual Basic) がまだ開かれていない場合は、ソリューション エクスプローラでファイルをダブルクリックして、コード エディタで開きます。

  8. ファイルの先頭にカーソルを置きます。

  9. 次のコードを挿入します。

    using Microsoft.SmartDevice.DeviceAgentTransport;
    
    Imports Microsoft.SmartDevice.DeviceAgentTransport
    
  10. Main メソッドの中にカーソルを移動します。

  11. 次のコードを挿入します。

    string[] serviceids = {"A92866CA-AE83-4848-9438-501D8DB3CF25"};
    
    IDeviceAgentTransport transport = DeviceAgentTransportFactory.GetAgentTransport();
    
    // Don't keep it waiting.
    transport.AcknowledgeLaunch(1, serviceids);
    
    IDevicePacketStream packetstream;
    
    transport.AcceptConnectionEx(serviceids[0], out packetstream);
    IPacket packet;
    packet = PacketFactory.GetNewPacket();
    packet.WriteInt32(Environment.Version.Major);
    packet.WriteInt32(Environment.Version.Minor);
    packet.WriteInt32(Environment.Version.Build);
    packet.WriteInt32(Environment.Version.Revision);
    packetstream.Write(packet);
    
    Dim serviceids(0 To 0) As String
    serviceids(0) = "A92866CA-AE83-4848-9438-501D8DB3CF25"
    
    Dim transport As IDeviceAgentTransport = DeviceAgentTransportFactory.GetAgentTransport()
    
    ' Don't keep it waiting.
    transport.AcknowledgeLaunch(1, serviceids)
    
    Dim packetstream As IDevicePacketStream
    
    transport.AcceptConnectionEx(serviceids(0), packetstream)
    Dim packet As IPacket
    packet = PacketFactory.GetNewPacket()
    packet.WriteInt32(Environment.Version.Major)
    packet.WriteInt32(Environment.Version.Minor)
    packet.WriteInt32(Environment.Version.Build)
    packet.WriteInt32(Environment.Version.Revision)
    packetstream.Write(packet)
    

    このコードでは、IDeviceAgentTransport オブジェクトを作成し、デスクトップ コンピュータからの接続を受け入れます。プログラムによって、.NET Compact Framework のバージョン情報を含むパケットがデスクトップ コンピュータに送信されます。

  12. [ビルド] メニューの [ソリューションのビルド] をクリックします。

    これで、DeviceAgent という名前のスマート デバイス アプリケーションが作成されました。後でこのアプリケーションをデバイスに配置します。

データ ストア内にアドオン パッケージを作成する

データ ストア内にアドオン パッケージを作成するには

  1. メモ帳を起動します。

  2. メモ帳のファイルに次のコードをコピーします。

    <?xml version="1.0" standalone="no"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:template match="/">
        <ADDONCONTAINER>
          <ADDON>
            <PACKAGECONTAINER>
              <PACKAGE ID="" NAME="DeviceAgent">
                <PROPERTYCONTAINER />
                <PACKAGETYPECONTAINER>
                  <PACKAGETYPE Name="ARMV4I" ID="ARMV4I" Protected="True">
                    <PROPERTYCONTAINER>
                      <PROPERTY ID="RemotePath" Protected="True">%CSIDL_PROGRAM_FILES%\DeviceAgent</PROPERTY>
                      <PROPERTY ID="RootPath" Protected="True">C:\DataExchange\DeviceAgent\bin\Debug</PROPERTY>
                      <PROPERTY ID="CPU" Protected="True">ARMV4I</PROPERTY>
                      <PROPERTY ID="Host" Protected="True">DeviceAgent</PROPERTY>
                    </PROPERTYCONTAINER>
                    <FILECONTAINER>
                      <FILE ID="DeviceAgent.exe" />
                      <FILE ID="Microsoft.Smartdevice.DeviceAgentTransport.dll" />
                      <FILE ID="DeviceAgentTransport.dll" />
                    </FILECONTAINER>
                  </PACKAGETYPE>
                </PACKAGETYPECONTAINER>
              </PACKAGE>
            </PACKAGECONTAINER>
          </ADDON>
        </ADDONCONTAINER>
      </xsl:template>
    </xsl:stylesheet>
    
  3. Visual Studio で、[ツール] メニューの [GUID の作成] をクリックします。

    [GUID の作成] ダイアログ ボックスが表示されます。

  4. [Registry Format] を選択し、[コピー] をクリックしてから [終了] をクリックします。

  5. メモ帳の Package タグの ID 属性に GUID を貼り付け、GUID を囲んでいるかっこを削除します。

    たとえば、<Package ID="9C50B38D-4259-40b3-AE9F-C5887DD898FF" Name="DeviceAgent"> のようにします。

  6. <PROPERTY ID="RootPath" Protected="True"> タグの値を、DeviceAgent.exe が置かれているフォルダに変更します。

    たとえば、<PROPERTY ID="RootPath" Protected="True">c:\DataExchange\DeviceAgent\bin\debug</PROPERTY> のようにします。

    Bb546002.alert_note(ja-jp,VS.90).gifメモ :

    DeviceAgent.exe の場所を調べるには、ソリューション エクスプローラで DeviceAgent プロジェクトを右クリックし、[プロパティ] をクリックします。[ビルド] タブをクリックし、[出力パス] の隣にある [参照] をクリックします。

  7. drive:\Program Files\Common Files\Microsoft Shared\CoreCon\1.0\Target\wce400\armv4i\DeviceAgentTransport.dll ライブラリを、ルート パスで指定されたパスにコピーします。

    Bb546002.alert_note(ja-jp,VS.90).gifメモ :

    Microsoft.Smartdevice.DeviceAgentTransport.dll アセンブリは DeviceAgentTransport.dll ライブラリを使用するため、この手順は重要です。作成するアプリケーションでは、両方のファイルを配置する必要があります。

  8. メモ帳でファイルを保存します。

    \ProgramData\Microsoft\corecon\1.0\addons\package.xsl (Windows Vista)

    \Documents and Settings\All Users\Application Data\Microsoft\corecon\1.0\addons\package.xsl (その他)

    Bb546002.alert_note(ja-jp,VS.90).gifメモ :

    package.xsl というファイル名が既に使用されている場合は、別の名前を使用します。フォルダ内のすべてのファイルがアドオン パッケージとして処理されるため、ファイル名は重要ではありません。

  9. Visual Studio を終了し、再起動します。

    Visual Studio の起動時にアドオン パッケージ フォルダが読み込まれます。Visual Studio が正しく起動された場合、パッケージで構文エラーは発生しません。

    これで、Visual Studio によって生成された一意な ID を持つ、DeviceAgent という名前のアドオン パッケージがデータ ストア内に作成されました。このパッケージが配置されると、スマート デバイス接続 API によって、DeviceAgent プロジェクトの出力フォルダからデバイスの drive:\Program File\DeviceAgent ディレクトリに 3 つのファイルがコピーされます。次に、デバイス上で DeviceAgent.exe が実行されます。

パッケージの配置とデバイス エージェントとの通信を行うデスクトップ アプリケーションを作成する

パッケージの配置とデバイス エージェントとの通信を行うデスクトップ アプリケーションを作成するには

  1. Visual Studio で、[ファイル] メニューの [開く] をポイントし、[プロジェクト/ソリューション] をクリックします。

    [プロジェクトを開く] ダイアログ ボックスが表示されます。

  2. DataExchange.sln ソリューションを探してクリックし、[開く] をクリックします。

    ソリューション エクスプローラに DeviceAgent アプリケーションが表示されます。

  3. [ファイル] メニューの [追加] をポイントし、[新しいプロジェクト] をクリックします。

    [新しいプロジェクト] ダイアログ ボックスが表示されます。

  4. (Visual C#) [Visual C#] を展開し、[Windows] をクリックします。

    (Visual Basic) [Visual Basic] を展開し、[Windows] をクリックします。

  5. テンプレート ペインの [コンソール アプリケーション] をクリックします。

  6. プロジェクトに「DesktopSide」という名前を付け、[OK] をクリックします。

    DeviceAgent と DesktopSide という 2 つのプロジェクトがソリューション エクスプローラに表示されます。

  7. ソリューション エクスプローラで DesktopSide プロジェクトを右クリックし、[スタートアップ プロジェクトに設定] をクリックします。

  8. (Visual C#) ソリューション エクスプローラ で DesktopSide プロジェクトの [参照設定] を右クリックし、[参照の追加] をクリックします。

    (Visual Basic) ソリューション エクスプローラで DesktopSide を右クリックし、[参照の追加] をクリックします。

    [参照の追加] ダイアログ ボックスが表示されます。

  9. [参照] タブをクリックし、drive:\Program Files\Common Files\Microsoft Shared\CoreCon\1.0\Bin, click Microsoft.Smartdevice.Connectivity.dll に移動し、[OK] をクリックします。

    DesktopSide プロジェクトに Microsoft.Smartdevice.Connectivity への参照が追加されます。

  10. DesktopSide プロジェクトの Program.cs (C#) または Module1.vb (Visual Basic) がまだ開かれていない場合は、ソリューション エクスプローラでファイルをダブルクリックして、コード エディタで開きます。

  11. ファイルの先頭にカーソルを置きます。

  12. 次のコードを挿入します。

    using Microsoft.SmartDevice.Connectivity;
    using System.Collections.ObjectModel;
    
    Imports Microsoft.SmartDevice.Connectivity
    Imports System.Collections.ObjectModel
    
  13. Main メソッドの中にカーソルを移動します。

  14. 次のコードを挿入します。

    // Change the locale ID to correspond to your installation of Visual Studio.
    DatastoreManager dsmgr = new DatastoreManager(1033);
    Platform platform = GetPlatformByName("Windows Mobile 5.0 Smartphone SDK", dsmgr);
    Device emulator = platform.GetDevice(platform.GetDefaultDeviceId());
    emulator.Connect();
    // Add the GUID of your package below.
    RemoteAgent ra = emulator.GetRemoteAgent(new ObjectId(""));
    ra.Start("command line argument");
    DevicePacketStream ps = ra.CreatePacketStream(new ObjectId("A92866CA-AE83-4848-9438-501D8DB3CF25"));
    Packet packet;
    packet = new Packet();
    while (ps.IsConnected())
    {
        if (ps.IsPacketAvailable())
        {
            packet = ps.Read();
            while (!packet.IsEndOfPacket())
            {
                switch (packet.ReadDataType())
                {
                    case DataType.Int32Type:
                        Console.WriteLine("Int32Type:  " + packet.ReadInt32().ToString());
                        break;
                    case DataType.StringType:
                        Console.WriteLine("String:  " + packet.ReadString());
                        break;
                    default:
                        break;
                }
            }
            break;
        }
    }
    Console.Read();
    
    ' Change the locale ID to correspond to your installation of Visual Studio.
    Dim dsmgr As New DatastoreManager(1033)
    Dim platform As Platform = GetPlatformByName("Windows Mobile 5.0 Smartphone SDK", dsmgr)
    Dim emulator As Device = platform.GetDevice(platform.GetDefaultDeviceId())
    emulator.Connect()
    ' Add the GUID of your package below.
    Dim ra As RemoteAgent = emulator.GetRemoteAgent(New ObjectId(""))
    ra.Start("command line argument")
    Dim ps As DevicePacketStream = ra.CreatePacketStream(New ObjectId("A92866CA-AE83-4848-9438-501D8DB3CF25"))
    Dim packet As Packet
    packet = New Packet()
    While ps.IsConnected()
        If ps.IsPacketAvailable() Then
            packet = ps.Read()
            While Not packet.IsEndOfPacket()
                Select Case packet.ReadDataType()
                    Case DataType.Int32Type
                        Console.WriteLine("Int32Type:  " + packet.ReadInt32().ToString())
                    Case DataType.StringType
                        Console.WriteLine("String:  " + packet.ReadString())
                    Case Else
                End Select
            End While
            Exit While
        End If
    End While
    Console.Read()
    

    このコードでは、Windows Mobile 5.0 エミュレータに接続し、デバイスにリモート エージェントを配置します。次に、デバイスとの接続を確立し、パケット データを読み込みます。デバイスから読み取られた情報は、コンソールに表示されます。

  15. パッケージの ID を emulator.GetRemoteAgent(new ObjectId("")) に追加します。

    たとえば、emulator.GetRemoteAgent(new ObjectId("F85E57BA-5AE9-4FF7-8433-6AB7D991D034")) のように指定します。

  16. Main メソッドの下に、次のヘルパー メソッドを貼り付けます。

    // Return a platform if the supplied name can be found in the datastore.  
    // Return null pointer if platform cannot be found.
    private static Platform GetPlatformByName(string p, DatastoreManager dsmgr)
    {
        // Get all platforms in the datastore.
        Collection<Platform> platforms = dsmgr.GetPlatforms();
    
        // Find the platform whose name matches the parameter.
        foreach (Platform platform in platforms)
        {
            if (platform.Name == p) return platform;
        }
        return null;
    }
    
    ' Return a platform if the supplied name can be found in the datastore.  
    ' Return null pointer if platform cannot be found.
    Private Function GetPlatformByName(ByVal p As String, ByVal dsmgr As DatastoreManager) As Platform 
        ' Get all platforms in the datastore.
        Dim platforms As Collection(Of Platform) = dsmgr.GetPlatforms()
    
        ' Find the platform whose name matches the parameter.
        Dim platform As Platform
        For Each platform In  platforms
            If platform.Name = p Then
                Return platform
            End If
        Next platform
        Return Nothing
    
    End Function 'GetPlatformByName
    
  17. F5 キーを押して、DesktopSide プロジェクトをデバッグします。

    エミュレータが起動されていない場合は、DesktopSide がエミュレータに接続し、エミュレータを起動します。さらに、パッケージを配置し、DeviceAgent アプリケーションを起動します。DesktopSide と DeviceAgent の間でパケット情報が交換され、ユーザーに表示されます。

参照

概念

スマート デバイス接続 API を使用したデバイスの制御

アドオン パッケージの概要

その他の技術情報

スマート デバイス接続 API リファレンス

Smart Device Connectivity API Samples