WPDデバイスのファイル、フォルダ一覧を取得する - C#

WPDデバイスのファイル、フォルダ一覧を取得するコードを紹介します。

事前準備

こちらの記事を参照して、PortableDeviceApi のCOMオブジェクトをプロジェクトの参照に追加しておきます。

プログラム

Windows Formアプリケーションを作成します。

UI

下図のUIを作成します。フォームにコンボボックスとListViewを1つずつ配置します。

コード

下記のコードを記述します。フォームのLoadイベント以外にコンボボックスのSelectedIndexChangedイベントと、リストビューのDoubleClickイベントを実装します。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using PortableDeviceApiLib;

namespace WpdDemo
{
  public partial class FormMain : Form
  {
    public const uint WPD_OBJECT_ID = 2;
    public const uint WPD_OBJECT_PARENT_ID = 3;
    public const uint WPD_OBJECT_NAME = 4;
    public const uint WPD_OBJECT_CONTENT_TYPE = 7;
    public const uint WPD_OBJECT_SIZE = 11;
    public const uint WPD_OBJECT_ORIGINAL_FILE_NAME = 12;
    public const uint WPD_OBJECT_DATE_CREATED = 18;
    public const uint WPD_OBJECT_DATE_MODIFIED = 19;
            
    public const uint WPD_FUNCTIONAL_OBJECT_CATEGORY = 2;
    public const uint WPD_CLIENT_NAME = 2;
    public const uint WPD_CLIENT_MAJOR_VERSION = 3;
    public const uint WPD_CLIENT_MINOR_VERSION = 4;
    public const uint WPD_CLIENT_REVISION = 5;
    public const uint WPD_RESOURCE_DEFAULT = 0;
    public const uint WPD_STORAGE_FREE_SPACE_IN_BYTES = 5;

    private PortableDeviceManager deviceManager;

    class WPDDevice
    {
      public string DeviceID;
      public string DeviceName;
      public PortableDeviceClass DeviceClass;

      public override string ToString()
      {
        return string.Format("WPDデバイス名:{0}\r\n", DeviceName);
      }
    }

    public enum ObjectKind { FOLDER, FILE};

    public class PortableDeviceObject
    {
      public string Id { get; set; }
      public string Name { get; set; }
      public ObjectKind kind { get; set; }
    }

    public FormMain()
    {
      InitializeComponent();
    }

    private void FormMain_Load(object sender, EventArgs e)
    {
      init();
    }

    private void init()
    {
      deviceManager = new PortableDeviceManager();

      deviceManager.RefreshDeviceList();
      uint count = 0;
      deviceManager.GetDevices(null, ref count);

      string[] devicesIDs = new string[count];
      WPDDevice[] wpdDevice = new WPDDevice[count];

      deviceManager.GetDevices(devicesIDs, ref count);
      for (int i = 0; i < count; i++) {
        wpdDevice[i] = new WPDDevice();
        wpdDevice[i].DeviceID = devicesIDs[i];
      }

      IPortableDeviceValues clientInfo = (IPortableDeviceValues)new PortableDeviceTypesLib.PortableDeviceValuesClass();

      for (int i = 0; i < count; i++) {
        wpdDevice[i].DeviceClass = new PortableDeviceClass();
        wpdDevice[i].DeviceClass.Open(wpdDevice[i].DeviceID, clientInfo);

        IPortableDeviceContent content;
        wpdDevice[i].DeviceClass.Content(out content);
        
        IPortableDeviceProperties properties;
        content.Properties(out properties);

        IPortableDeviceValues propertyValues;
        properties.GetValues("DEVICE", null, out propertyValues);

        //wpdDevice[i].DeviceClass.Close();

        string name;
        _tagpropertykey property = new _tagpropertykey();
        property.fmtid = new Guid(0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C);
        property.pid = 4;
        try {
          propertyValues.GetStringValue(property, out name);
          wpdDevice[i].DeviceName = name;
        }
        catch (System.Runtime.InteropServices.COMException) {
          wpdDevice[i].DeviceName = "なし";
        }

        comboBox_device.Items.Add(wpdDevice[i]);
      }
    }

    private void comboBox_device_SelectedIndexChanged(object sender, EventArgs e)
    {
      DeviceChanged();
    }

    private void DeviceChanged()
    {
      WPDDevice device = (WPDDevice)comboBox_device.SelectedItem;

      IPortableDeviceContent content;
      device.DeviceClass.Content(out content);

      IPortableDeviceProperties properties;
      content.Properties(out properties);

      IEnumPortableDeviceObjectIDs objectIDs;
      string FolderID= "DEVICE";
      content.EnumObjects(0, FolderID, null, out objectIDs);

      listView1.Items.Clear();

      string objectID;
      uint fetched = 0;

      while (true) {
        objectIDs.Next(1, out objectID, ref fetched);
        if (fetched <= 0) break;

        PortableDeviceObject currentObject = WrapObject(properties, objectID);

        ListViewItem li = listView1.Items.Add(currentObject.Name);
        switch (currentObject.kind) {
          case ObjectKind.FILE:
            li.SubItems.Add("ファイル");
            break;
          case ObjectKind.FOLDER:
            li.SubItems.Add("フォルダ");
            break;
        }
        li.SubItems.Add(currentObject.Id);
      }
    }


    private void listView1_DoubleClick(object sender, EventArgs e)
    {
      string FolderID = listView1.Items[listView1.SelectedItems[0].Index].SubItems[2].Text;
      WPDDevice device = (WPDDevice)comboBox_device.SelectedItem;

      IPortableDeviceContent content;
      device.DeviceClass.Content(out content);

      IPortableDeviceProperties properties;
      content.Properties(out properties);

      IEnumPortableDeviceObjectIDs objectIDs;
      content.EnumObjects(0, FolderID, null, out objectIDs);

      listView1.Items.Clear();

      string objectID;
      uint fetched = 0;

      while (true) {
        objectIDs.Next(1, out objectID, ref fetched);
        if (fetched <= 0) break;

        PortableDeviceObject currentObject = WrapObject(properties, objectID);

        ListViewItem li = listView1.Items.Add(currentObject.Name);
        switch (currentObject.kind) {
          case ObjectKind.FILE:
            li.SubItems.Add("ファイル");
            break;
          case ObjectKind.FOLDER:
            li.SubItems.Add("フォルダ");
            break;
        }
        li.SubItems.Add(currentObject.Id);
      }
    }

    public static PortableDeviceObject WrapObject(IPortableDeviceProperties properties, string objectID)
    {
      IPortableDeviceKeyCollection keys;
      properties.GetSupportedProperties(objectID, out keys);

      IPortableDeviceValues values;
      properties.GetValues(objectID, keys, out values);

      // Get the name of the object
      string name;
      _tagpropertykey property = new _tagpropertykey();
      property.fmtid = new Guid(0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C);
      property.pid = WPD_OBJECT_NAME;

      try {
        values.GetStringValue(property, out name);
      }
      catch (System.Runtime.InteropServices.COMException exc) {
        name = "(non name)";
      }

      // Get the original name of the object
      string OriginalName;
      property = new _tagpropertykey();
      property.fmtid = new Guid(0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C);
      property.pid = WPD_OBJECT_ORIGINAL_FILE_NAME;
      try {
        values.GetStringValue(property, out OriginalName);
      }
      catch (Exception e) {
        OriginalName = "";
      }

      // Get the type of the object
      Guid contentType;
      property = new _tagpropertykey();
      property.fmtid = new Guid(0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C);
      property.pid = WPD_OBJECT_CONTENT_TYPE;
      try {
        values.GetGuidValue(property, out contentType);
      }
      catch (System.Runtime.InteropServices.COMException exc) {
        PortableDeviceObject obj = new PortableDeviceObject();
        obj.Id = null;
        obj.Name = name;
        obj.kind = ObjectKind.FOLDER;
        return obj;
      }

      Guid folderType = new Guid(0x27E2E392, 0xA111, 0x48E0, 0xAB, 0x0C, 0xE1, 0x77, 0x05, 0xA0, 0x5F, 0x85);
      Guid functionalType = new Guid(0x99ED0160, 0x17FF, 0x4C44, 0x9D, 0x98, 0x1D, 0x7A, 0x6F, 0x94, 0x19, 0x21);

      if (contentType == folderType || contentType == functionalType) {
        PortableDeviceObject fobj = new PortableDeviceObject();
        fobj.Id = objectID;
        fobj.Name = name;
        fobj.kind = ObjectKind.FOLDER;
        return fobj;
      }

      if (OriginalName.CompareTo("") != 0) {
        name = OriginalName;
      }

      PortableDeviceObject robj = new PortableDeviceObject();
      robj.Id = objectID;
      robj.Name = name;
      robj.kind = ObjectKind.FILE;
      return robj;
    }
  }
}

解説

デバイスの接続部

デバイスの接続部のコード init メソッド部分についてはこちらの記事を参照してください。
違いは接続した後、ファイルやフォルダを取得するためデバイスをCloseしない部分が異なります。また、デバイスID、デバイス名、PortableDeviceClass をまとめて保存できるようWPDDeviceクラスを用意してメンバ変数に値を格納する動作にしています。接続されているWPDデバイスはコンボボックスに追加します。
コンボボックスへの値の表示はWPDDeviceクラスにToStringメソッドを実装して実現しています。詳しい動作はこちらの記事を参照してください。

コンボボックスが変更された場合

コンボボックスの選択内容が変更された場合はDeviceChanged メソッドを呼び出します。
DeviceChanged メソッドの前半部分はPortableDeviceClass のContentメソッドを呼び出し、IPortableDeviceContent コンテンツを取得し、その後IPortableDeviceContent オブジェクトのPropertiesメソッドを呼び出しIPortableDeviceProperties プロパティを取得します。
フォルダの一覧はIPortableDeviceContent オブジェクトのEnumObjectsにより取得できます。EnumObjectsの第一引数は使われないため0を、第二引数には取得するフォルダのパスを与えます。コンボボックスが選択された直後のため、ルートディレクトリのファイル、フォルダの一覧を取得します。ルートディレクトリを取得する場合は"DEVICE"の文字列を与えます。第三引数は使われないため、nullを与えます。第四引数に取得したオブジェクトの結果が代入されます。IEnumPortableDeviceObjectIDs 型の変数を与えます。

  private void DeviceChanged()
  {
    WPDDevice device = (WPDDevice)comboBox_device.SelectedItem;

    IPortableDeviceContent content;
    device.DeviceClass.Content(out content);

    IPortableDeviceProperties properties;
    content.Properties(out properties);

    IEnumPortableDeviceObjectIDs objectIDs;
    string FolderID = "DEVICE";
    content.EnumObjects(0, FolderID, null, out objectIDs);

EnumObjects メソッドにより取得した、IEnumPortableDeviceObjectIDs の各値を読み出します。IEnumPortableDeviceObjectIDs オブジェクトのNext メソッドを呼び出しオブジェクトの個々の要素にアクセスします。Nextメソッドの第一引数にはリクエストするオブジェクト数を与えます。今回は1つずつ読み出しますので1を与えます。第二引数には取得したオブジェクトのIDが戻ります。第三引数には取得できたオブジェクトの数が戻ります。
Nextメソッドにより取得したオブジェクトのIDからファイル、フォルダの名前や種類を取得します。取得部分はWrapObject メソッドで実行します。取得した情報はPortableDeviceObjectクラスのメンバ変数に格納しています。PortableDeviceObjectクラスのメンバ変数を参照してリストビューに項目(ファイル/フォルダ名、ファイル/フォルダの種別、オブジェクトID)を追加しています。
通常は Next メソッドの戻り値を確認することで要素がこれ以上存在しないかを確認しますが、今回利用するC#のタイプライブラリでは、Nextメソッドの戻り値が無いため、fetchedの値が0以下であった場合にこれ以上要素が無いと判断してループを抜けます。
    listView1.Items.Clear();

    string objectID;
    uint fetched = 0;

    while (true) {
      objectIDs.Next(1, out objectID, ref fetched);
      if (fetched <= 0) break;

      PortableDeviceObject currentObject = WrapObject(properties, objectID);

      ListViewItem li = listView1.Items.Add(currentObject.Name);
      switch (currentObject.kind) {
        case ObjectKind.FILE:
          li.SubItems.Add("ファイル");
          break;
        case ObjectKind.FOLDER:
          li.SubItems.Add("フォルダ");
          break;
      }
      li.SubItems.Add(currentObject.Id);
    }
  }

リストビューがダブルクリックされた場合

リストビューがダブルクリックされた場合は、そのときに選択していた要素の子要素を取得してリストビューに表示します。具体的にはフォルダ内のファイルを表示する動作です。
前半部分は先のコンボボックスの場合と同じ処理です。IPortableDeviceContent, IPortableDeviceProperties を取得し、EnumObjectsで要素の一覧を取得します。EnumObjectsに与えるオブジェクトIDは選択されたリストビューの要素の値を利用します。EnumObjectsでダブルクリック時に選択されている要素の子オブジェクトが取得されます。
  private void listView1_DoubleClick(object sender, EventArgs e)
  {
    string FolderID = listView1.Items[listView1.SelectedItems[0].Index].SubItems[2].Text;
    WPDDevice device = (WPDDevice)comboBox_device.SelectedItem;

    IPortableDeviceContent content;
    device.DeviceClass.Content(out content);

    IPortableDeviceProperties properties;
    content.Properties(out properties);

    IEnumPortableDeviceObjectIDs objectIDs;
    content.EnumObjects(0, FolderID, null, out objectIDs);

後半部分はコンボボックスの場合とほぼ同じ処理です。IEnumPortableDeviceObjectIDs オブジェクトのNext メソッドを呼び出しオブジェクトを取得してリストビューに表示します。
    listView1.Items.Clear();

    string objectID;
    uint fetched = 0;

    while (true) {
      objectIDs.Next(1, out objectID, ref fetched);
      if (fetched <= 0) break;

      PortableDeviceObject currentObject = WrapObject(properties, objectID);

      ListViewItem li = listView1.Items.Add(currentObject.Name);
      switch (currentObject.kind) {
        case ObjectKind.FILE:
          li.SubItems.Add("ファイル");
          break;
        case ObjectKind.FOLDER:
          li.SubItems.Add("フォルダ");
          break;
      }
      li.SubItems.Add(currentObject.Id);
    }
  }

オブジェクトのIDからファイル、フォルダの名前や種類を取得する

IEnumPortableDeviceObjectIDs オブジェクトのNext メソッドで取得したオブジェクトのIDからオブジェクト名や種別を取得するコードが下記になります。
IPortableDeviceProperties オブジェクトのGetSupportedPropertieメソッドを呼び出し IPortableDeviceKeyCollection を取得します。続いて、IPortableDeviceProperties オブジェクトのGetValues メソッドを呼び出しIPortableDeviceValues オブジェクトを取得します。GetValues メソッドの第一引数に取得したいオブジェクトのID、第二引数にIPortableDeviceKeyCollection を与えます。
オブジェクトの情報の取得には _tgpropertykey オブジェクトを利用します。_tagpropertykey オブジェクトを作成し、fmtidメンバにGUIDを設定します。GUIDの値は 0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C を利用します。pidには取得する情報に応じた値を設定します。オブジェクトの名前を取得するため、WPD_OBJECT_NAME を与えます。
IPortableDeviceValues オブジェクトの GetStringValue メソッドを呼び出し値を取得します。第一引にIPortableDeviceProperties オブジェクトを与え、第二引数に取得した値を格納するstring変数を与えます。
同様の処理を繰り返しオブジェクトのオリジナル名、種別を取得します。
public static PortableDeviceObject WrapObject(IPortableDeviceProperties properties, string objectID)
  {
    IPortableDeviceKeyCollection keys;
    properties.GetSupportedProperties(objectID, out keys);

    IPortableDeviceValues values;
    properties.GetValues(objectID, keys, out values);

    // Get the name of the object
    string name;
    _tagpropertykey property = new _tagpropertykey();
    property.fmtid = new Guid(0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C);
    property.pid = WPD_OBJECT_NAME;

    try {
      values.GetStringValue(property, out name);
    }
    catch (System.Runtime.InteropServices.COMException exc) {
      name = "(non name)";
    }

    // Get the original name of the object
    string OriginalName;
    property = new _tagpropertykey();
    property.fmtid = new Guid(0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C);
    property.pid = WPD_OBJECT_ORIGINAL_FILE_NAME;
    try {
      values.GetStringValue(property_n, out OriginalName);
    }
    catch (Exception e) {
      OriginalName = "";
    }

    // Get the type of the object
    Guid contentType;
    property = new _tagpropertykey();
    property.fmtid = new Guid(0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C);
    property.pid = WPD_OBJECT_CONTENT_TYPE;
    try {
      values.GetGuidValue(property, out contentType);
    }
    catch (System.Runtime.InteropServices.COMException exc) {
      PortableDeviceObject obj = new PortableDeviceObject();
      obj.Id = null;
      obj.Name = name;
      obj.kind = ObjectKind.FOLDER;
      return obj;
    }

取得した値を判定しフォルダかファイル化を判別します。また、PortableDeviceObject クラスのメンバ変数に代入してメソッドの戻り値とします。
    Guid folderType = new Guid(0x27E2E392, 0xA111, 0x48E0, 0xAB, 0x0C, 0xE1, 0x77, 0x05, 0xA0, 0x5F, 0x85);
    Guid functionalType = new Guid(0x99ED0160, 0x17FF, 0x4C44, 0x9D, 0x98, 0x1D, 0x7A, 0x6F, 0x94, 0x19, 0x21);

    if (contentType == folderType || contentType == functionalType) {
      PortableDeviceObject fobj = new PortableDeviceObject();
      fobj.Id = objectID;
      fobj.Name = name;
      fobj.kind = ObjectKind.FOLDER;
      return fobj;
    }

    if (OriginalName.CompareTo("") != 0) {
      name = OriginalName;
    }

    PortableDeviceObject robj = new PortableDeviceObject();
    robj.Id = objectID;
    robj.Name = name;
    robj.kind = ObjectKind.FILE;
    return robj;
  }

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


コンボボックスを開くと接続されているWPDデバイスが表示されます。接続するWPDデバイスを選択します。


コンボボックスで選択をすると、選択したWPDデバイスのルートディレクトリのファイル、フォルダ一覧が表示されます。このデバイスでは「内部ストレージ」というフォルダが一つあることがわかります。


[内部ストレージ]の項目をダブルクリックします。内部ストレージフォルダ内のファイル、フォルダの一覧が表示されます。


[Pictures]の項目をダブルクリックします。下図の画面が表示されます。


[Screenshots]の項目をダブルクリックします。下図の画面が表示されます。スクリーンショットの画像ファイルが保存されており、一覧が表示できます。

参考

オブジェクトの値を取得するためのGUIDとPIDの組み合わせは下記となります。
名称GUIDPID取得する値
WPD_OBJECT_ID0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C2オブジェクトのID
WPD_OBJECT_PARENT_ID0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C3親オブジェクトのID
WPD_OBJECT_NAME0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C4オブジェクトの名称
WPD_OBJECT_CONTENT_TYPE0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C7オブジェクトのコンテンツタイプ
WPD_OBJECT_SIZE0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C11オブジェクトのサイズ
WPD_OBJECT_ORIGINAL_FILE_NAME0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C12オブジェクトのオリジナルファイル名
WPD_RESOURCE_DEFAULT0xE81E79BE, 0x34F0, 0x41BF, 0xB5, 0x3F, 0xF1, 0xA0, 0x6A, 0xE8, 0x78, 0x420オブジェクトのリソース
WPD_DEVICE_FRIENDLY_NAME0x26D4979A, 0xE643, 0x4626, 0x9E, 0x2B, 0x73, 0x6D, 0xC0, 0xC9, 0x2F, 0xDC12オブジェクトのフレンドり名

参考

フォルダ、コンテンツ形式を判断するためのGUIDです。

主要なもの

GUID
WPD_CONTENT_TYPE_FOLDER0x27E2E392, 0xA111, 0x48E0, 0xAB, 0x0C, 0xE1, 0x77, 0x05, 0xA0, 0x5F, 0x85
WPD_CONTENT_TYPE_FUNCTIONAL_OBJECT0x99ED0160, 0x17FF, 0x4C44, 0x9D, 0x98, 0x1D, 0x7A, 0x6F, 0x94, 0x19, 0x21
WPD_CONTENT_TYPE_GENERIC_FILE0x0085E0A6, 0x8D34, 0x45D7, 0xBC, 0x5C, 0x44, 0x7E, 0x59, 0xC7, 0x3D, 0x48
WPD_FUNCTIONAL_CATEGORY_STORAGE0x23F05BBC, 0x15DE, 0x4C2A, 0xA5, 0x5B, 0xA9, 0xAF, 0x5C, 0xE4, 0x12, 0xEF

すべて

GUID
GUID_DEVINTERFACE_WPD0x6AC27878, 0xA6FA, 0x4155, 0xBA, 0x85, 0xF9, 0x8F, 0x49, 0x1D, 0x4F, 0x33
GUID_DEVINTERFACE_WPD_PRIVATE0xBA0C718F, 0x4DED, 0x49B7, 0xBD, 0xD3, 0xFA, 0xBE, 0x28, 0x66, 0x12, 0x11
WPD_EVENT_NOTIFICATION0x2BA2E40A, 0x6B4C, 0x4295, 0xBB, 0x43, 0x26, 0x32, 0x2B, 0x99, 0xAE, 0xB2
WPD_EVENT_OBJECT_ADDED0xA726DA95, 0xE207, 0x4B02, 0x8D, 0x44, 0xBE, 0xF2, 0xE8, 0x6C, 0xBF, 0xFC
WPD_EVENT_OBJECT_REMOVED0xBE82AB88, 0xA52C, 0x4823, 0x96, 0xE5, 0xD0, 0x27, 0x26, 0x71, 0xFC, 0x38
WPD_EVENT_OBJECT_UPDATED0x1445A759, 0x2E01, 0x485D, 0x9F, 0x27, 0xFF, 0x07, 0xDA, 0xE6, 0x97, 0xAB
WPD_EVENT_DEVICE_RESET0x7755CF53, 0xC1ED, 0x44F3, 0xB5, 0xA2, 0x45, 0x1E, 0x2C, 0x37, 0x6B, 0x27
WPD_EVENT_DEVICE_CAPABILITIES_UPDATED0x36885AA1, 0xCD54, 0x4DAA, 0xB3, 0xD0, 0xAF, 0xB3, 0xE0, 0x3F, 0x59, 0x99
WPD_EVENT_STORAGE_FORMAT0x3782616B, 0x22BC, 0x4474, 0xA2, 0x51, 0x30, 0x70, 0xF8, 0xD3, 0x88, 0x57
WPD_EVENT_OBJECT_TRANSFER_REQUESTED0x8D16A0A1, 0xF2C6, 0x41DA, 0x8F, 0x19, 0x5E, 0x53, 0x72, 0x1A, 0xDB, 0xF2
WPD_EVENT_DEVICE_REMOVED0xE4CBCA1B, 0x6918, 0x48B9, 0x85, 0xEE, 0x02, 0xBE, 0x7C, 0x85, 0x0A, 0xF9
WPD_CONTENT_TYPE_FUNCTIONAL_OBJECT0x99ED0160, 0x17FF, 0x4C44, 0x9D, 0x98, 0x1D, 0x7A, 0x6F, 0x94, 0x19, 0x21
WPD_CONTENT_TYPE_FOLDER0x27E2E392, 0xA111, 0x48E0, 0xAB, 0x0C, 0xE1, 0x77, 0x05, 0xA0, 0x5F, 0x85
WPD_CONTENT_TYPE_IMAGE0xef2107d5, 0xa52a, 0x4243, 0xa2, 0x6b, 0x62, 0xd4, 0x17, 0x6d, 0x76, 0x03
WPD_CONTENT_TYPE_DOCUMENT0x680ADF52, 0x950A, 0x4041, 0x9B, 0x41, 0x65, 0xE3, 0x93, 0x64, 0x81, 0x55
WPD_CONTENT_TYPE_CONTACT0xEABA8313, 0x4525, 0x4707, 0x9F, 0x0E, 0x87, 0xC6, 0x80, 0x8E, 0x94, 0x35
WPD_CONTENT_TYPE_CONTACT_GROUP0x346B8932, 0x4C36, 0x40D8, 0x94, 0x15, 0x18, 0x28, 0x29, 0x1F, 0x9D, 0xE9
WPD_CONTENT_TYPE_AUDIO0x4AD2C85E, 0x5E2D, 0x45E5, 0x88, 0x64, 0x4F, 0x22, 0x9E, 0x3C, 0x6C, 0xF0
WPD_CONTENT_TYPE_VIDEO0x9261B03C, 0x3D78, 0x4519, 0x85, 0xE3, 0x02, 0xC5, 0xE1, 0xF5, 0x0B, 0xB9
WPD_CONTENT_TYPE_PLAYLIST0x1A33F7E4, 0xAF13, 0x48F5, 0x99, 0x4E, 0x77, 0x36, 0x9D, 0xFE, 0x04, 0xA3
WPD_CONTENT_TYPE_MIXED_CONTENT_ALBUM0x00F0C3AC, 0xA593, 0x49AC, 0x92, 0x19, 0x24, 0xAB, 0xCA, 0x5A, 0x25, 0x63
WPD_CONTENT_TYPE_AUDIO_ALBUM0xAA18737E, 0x5009, 0x48FA, 0xAE, 0x21, 0x85, 0xF2, 0x43, 0x83, 0xB4, 0xE6
WPD_CONTENT_TYPE_IMAGE_ALBUM0x75793148, 0x15F5, 0x4A30, 0xA8, 0x13, 0x54, 0xED, 0x8A, 0x37, 0xE2, 0x26
WPD_CONTENT_TYPE_VIDEO_ALBUM0x012B0DB7, 0xD4C1, 0x45D6, 0xB0, 0x81, 0x94, 0xB8, 0x77, 0x79, 0x61, 0x4F
WPD_CONTENT_TYPE_MEMO0x9CD20ECF, 0x3B50, 0x414F, 0xA6, 0x41, 0xE4, 0x73, 0xFF, 0xE4, 0x57, 0x51
WPD_CONTENT_TYPE_EMAIL0x8038044A, 0x7E51, 0x4F8F, 0x88, 0x3D, 0x1D, 0x06, 0x23, 0xD1, 0x45, 0x33
WPD_CONTENT_TYPE_APPOINTMENT0x0FED060E, 0x8793, 0x4B1E, 0x90, 0xC9, 0x48, 0xAC, 0x38, 0x9A, 0xC6, 0x31
WPD_CONTENT_TYPE_TASK0x63252F2C, 0x887F, 0x4CB6, 0xB1, 0xAC, 0xD2, 0x98, 0x55, 0xDC, 0xEF, 0x6C
WPD_CONTENT_TYPE_PROGRAM0xD269F96A, 0x247C, 0x4BFF, 0x98, 0xFB, 0x97, 0xF3, 0xC4, 0x92, 0x20, 0xE6
WPD_CONTENT_TYPE_GENERIC_FILE0x0085E0A6, 0x8D34, 0x45D7, 0xBC, 0x5C, 0x44, 0x7E, 0x59, 0xC7, 0x3D, 0x48
WPD_CONTENT_TYPE_CALENDAR0xA1FD5967, 0x6023, 0x49A0, 0x9D, 0xF1, 0xF8, 0x06, 0x0B, 0xE7, 0x51, 0xB0
WPD_CONTENT_TYPE_GENERIC_MESSAGE0xE80EAAF8, 0xB2DB, 0x4133, 0xB6, 0x7E, 0x1B, 0xEF, 0x4B, 0x4A, 0x6E, 0x5F
WPD_CONTENT_TYPE_NETWORK_ASSOCIATION0x031DA7EE, 0x18C8, 0x4205, 0x84, 0x7E, 0x89, 0xA1, 0x12, 0x61, 0xD0, 0xF3
WPD_CONTENT_TYPE_CERTIFICATE0xDC3876E8, 0xA948, 0x4060, 0x90, 0x50, 0xCB, 0xD7, 0x7E, 0x8A, 0x3D, 0x87
WPD_CONTENT_TYPE_WIRELESS_PROFILE0x0BAC070A, 0x9F5F, 0x4DA4, 0xA8, 0xF6, 0x3D, 0xE4, 0x4D, 0x68, 0xFD, 0x6C
WPD_CONTENT_TYPE_MEDIA_CAST0x5E88B3CC, 0x3E65, 0x4E62, 0xBF, 0xFF, 0x22, 0x94, 0x95, 0x25, 0x3A, 0xB0
WPD_CONTENT_TYPE_SECTION0x821089F5, 0x1D91, 0x4DC9, 0xBE, 0x3C, 0xBB, 0xB1, 0xB3, 0x5B, 0x18, 0xCE
WPD_CONTENT_TYPE_UNSPECIFIED0x28D8D31E, 0x249C, 0x454E, 0xAA, 0xBC, 0x34, 0x88, 0x31, 0x68, 0xE6, 0x34
WPD_CONTENT_TYPE_ALL0x80E170D2, 0x1055, 0x4A3E, 0xB9, 0x52, 0x82, 0xCC, 0x4F, 0x8A, 0x86, 0x89
WPD_FUNCTIONAL_CATEGORY_DEVICE0x08EA466B, 0xE3A4, 0x4336, 0xA1, 0xF3, 0xA4, 0x4D, 0x2B, 0x5C, 0x43, 0x8C
WPD_FUNCTIONAL_CATEGORY_STORAGE0x23F05BBC, 0x15DE, 0x4C2A, 0xA5, 0x5B, 0xA9, 0xAF, 0x5C, 0xE4, 0x12, 0xEF
WPD_FUNCTIONAL_CATEGORY_STILL_IMAGE_CAPTURE0x613CA327, 0xAB93, 0x4900, 0xB4, 0xFA, 0x89, 0x5B, 0xB5, 0x87, 0x4B, 0x79
WPD_FUNCTIONAL_CATEGORY_AUDIO_CAPTURE0x3F2A1919, 0xC7C2, 0x4A00, 0x85, 0x5D, 0xF5, 0x7C, 0xF0, 0x6D, 0xEB, 0xBB
WPD_FUNCTIONAL_CATEGORY_VIDEO_CAPTURE0xE23E5F6B, 0x7243, 0x43AA, 0x8D, 0xF1, 0x0E, 0xB3, 0xD9, 0x68, 0xA9, 0x18
WPD_FUNCTIONAL_CATEGORY_SMS0x0044A0B1, 0xC1E9, 0x4AFD, 0xB3, 0x58, 0xA6, 0x2C, 0x61, 0x17, 0xC9, 0xCF
WPD_FUNCTIONAL_CATEGORY_RENDERING_INFORMATION0x08600BA4, 0xA7BA, 0x4A01, 0xAB, 0x0E, 0x00, 0x65, 0xD0, 0xA3, 0x56, 0xD3
WPD_FUNCTIONAL_CATEGORY_NETWORK_CONFIGURATION0x48F4DB72, 0x7C6A, 0x4AB0, 0x9E, 0x1A, 0x47, 0x0E, 0x3C, 0xDB, 0xF2, 0x6A
WPD_FUNCTIONAL_CATEGORY_ALL0x2D8A6512, 0xA74C, 0x448E, 0xBA, 0x8A, 0xF4, 0xAC, 0x07, 0xC4, 0x93, 0x99
WPD_OBJECT_FORMAT_PROPERTIES_ONLY0x30010000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_UNSPECIFIED0x30000000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_SCRIPT0x30020000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_EXECUTABLE0x30030000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_TEXT0x30040000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_HTML0x30050000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_DPOF0x30060000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_AIFF0x30070000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_WAVE0x30080000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_MP30x30090000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_AVI0x300A0000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_MPEG0x300B0000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_ASF0x300C0000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_EXIF0x38010000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_TIFFEP0x38020000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_FLASHPIX0x38030000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_BMP0x38040000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_CIFF0x38050000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_GIF0x38070000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_JFIF0x38080000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_PCD0x38090000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_PICT0x380A0000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_PNG0x380B0000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_TIFF0x380D0000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_TIFFIT0x380E0000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_JP20x380F0000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_JPX0x38100000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_WINDOWSIMAGEFORMAT0xB8810000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_WMA0xB9010000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_WMV0xB9810000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_WPLPLAYLIST0xBA100000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_M3UPLAYLIST0xBA110000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_MPLPLAYLIST0xBA120000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_ASXPLAYLIST0xBA130000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_PLSPLAYLIST0xBA140000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_ABSTRACT_CONTACT_GROUP0xBA060000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_ABSTRACT_MEDIA_CAST0xBA0B0000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_VCALENDAR10xBE020000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_VCARD20xBB820000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_VCARD30xBB830000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_ICON0x077232ED, 0x102C, 0x4638, 0x9C, 0x22, 0x83, 0xF1, 0x42, 0xBF, 0xC8, 0x22
WPD_OBJECT_FORMAT_XML0xBA820000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_AAC0xB9030000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_AUDIBLE0xB9040000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_FLAC0xB9060000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_OGG0xB9020000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_MP40xB9820000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_MP20xB9830000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_MICROSOFT_WORD0xBA830000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_MHT_COMPILED_HTML0xBA840000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_MICROSOFT_EXCEL0xBA850000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_MICROSOFT_POWERPOINT0xBA860000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_NETWORK_ASSOCIATION0xB1020000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_X509V3CERTIFICATE0xB1030000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_MICROSOFT_WFC0xB1040000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_3GP0xB9840000, 0xAE6C, 0x4804, 0x98, 0xBA, 0xC5, 0x7B, 0x46, 0x96, 0x5F, 0xE7
WPD_OBJECT_FORMAT_ALL0xC1F62EB2, 0x4BB3, 0x479C, 0x9C, 0xFA, 0x05, 0xB5, 0xF3, 0xA5, 0x7B, 0x22

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-07
作成日: 2018-08-13
iPentec all rights reserverd.