IPortableDeviceConnector
COM公式ドキュメント
ペアリング済みの MTP/Bluetooth デバイスに対する接続管理およびプロパティ取得のためのメソッドを定義します。
メソッド 6
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
MTP/Bluetooth デバイスに非同期の接続要求を送信します。
| pCallback | IConnectionRequestCallback* | in | 要求の完了時に通知を受け取りたい場合は、IConnectionRequestCallback インターフェイスへのポインター。それ以外の場合は NULL。同一の IPortableDeviceConnector オブジェクトを使用して複数の要求を同時に送信する場合は、コールバックオブジェクトの異なるインスタンスを使用する必要があります。 |
戻り値
このメソッドは HRESULT を返します。戻り値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 |
解説(Remarks)
このメソッドは接続要求をキューに登録し、直ちに制御を返します。デバイスが既に接続されている場合、接続要求は何も行いません。
要求の完了時に通知を受け取るには、アプリケーションは IConnectionRequestCallback インターフェイスへのポインターを指定する必要があります。
以前にペアリングした MTP/Bluetooth デバイスが通信範囲内にある場合、アプリケーションはこのメソッドを呼び出すことで、そのデバイス用の Windows Portable Devices (WPD) クラスドライバースタックをインスタンス化し、WPD API を使用してデバイスと通信できるようになります。
MTP/Bluetooth デバイスに非同期の切断要求を送信します。
| pCallback | IConnectionRequestCallback* | in | IConnectionRequestCallback インターフェイスへのポインター。 |
戻り値
このメソッドは HRESULT を返します。戻り値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 |
解説(Remarks)
このメソッドは切断要求をキューに登録し、直ちに制御を返します。
要求の完了時に通知を受け取るには、アプリケーションは IConnectionRequestCallback インターフェイスへのポインターを指定する必要があります。この処理により MTP/Bluetooth リンクが切断され、そのデバイス用の Windows Portable Devices (WPD) クラスドライバースタックが削除されます。
切断が完了すると、WPD API はこのデバイスを列挙しなくなります。
MTP/Bluetooth デバイスの接続要求または切断要求のうち、保留中のものをキャンセルします。
| pCallback | IConnectionRequestCallback* | in | IConnectionRequestCallback インターフェイスへのポインター。この値に NULL を指定することはできません。 |
戻り値
このメソッドは HRESULT を返します。戻り値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
|
pCallback パラメーターが保留中の接続要求または切断要求に対応していないか、このメソッドが既に呼び出されています。 |
指定された MTP/Bluetooth バス列挙子デバイスのプロパティを取得します。
| pPropertyKey | DEVPROPKEY* | in | 要求するプロパティのプロパティキーへのポインター。 |
| pPropertyType | DEVPROPTYPE* | out | プロパティの型へのポインター。 |
| ppData | BYTE** | out | プロパティデータへのポインターのアドレス。 |
| pcbData | DWORD* | out | プロパティデータのサイズ (バイト単位) へのポインター。 |
戻り値
このメソッドは HRESULT を返します。戻り値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
|
指定されたプロパティキーはサポートされていません。 |
解説(Remarks)
このメソッドで取得されるプロパティは、デバイスノードに設定されているものです。プロパティキーの例としては、デバイスが現在接続されているかどうかを示す DEVPKEY_MTPBTH_IsConnected があります。
pPropertyType パラメーターに指定できる値は、統合デバイスプロパティモデルのシステム定義基本データ型です。これらのデータ型名は DEVPROP_TYPE_ というプレフィックスで始まります。
ppData パラメーターで指定されたプロパティデータが不要になったら、アプリケーションは CoTaskMemAlloc を呼び出してこのデータを解放する必要があります。
例
次の例は、ペアリング済みの MTP/Bluetooth デバイスについて DEVPKEY_MTPBTH_IsConnected プロパティを読み取る方法を示しています。
#include <devpkey.h>
#include <PortableDeviceConnectAPI.h>
HRESULT IsDeviceConnected(
__in IPortableDeviceConnector* pDevice,
__out BOOL* pIsConnected)
{
DEVPROPTYPE typeGet;
BYTE* pDataGet;
UINT32 cbDataGet;
*pbIsConnected = FALSE;
HRESULT hr = pDevice ->GetProperty(&DEVPKEY_MTPBTH_IsConnected,
&typeGet,
&pDataGet,
&cbDataGet);
if (SUCCEEDED(hr))
{
DEVPROP_BOOLEAN bIsConnected = *((DEVPROP_BOOLEAN*)pDataGet);
if (bIsConnected == DEVPROP_TRUE)
{
* pIsConnected = TRUE;
}
// Release memory allocated by GetProperty
CoTaskMemFree(pDataGet);
}
return hr;
}
MTP/Bluetooth バス列挙子デバイスに指定されたプロパティを設定します。
| pPropertyKey | DEVPROPKEY* | in | 指定するプロパティのプロパティキーへのポインター。 |
| PropertyType | DEVPROPTYPE | in | プロパティの型。 |
| pData | BYTE* | in | プロパティデータへのポインター。 |
| cbData | DWORD | in | プロパティデータのサイズ (バイト単位)。 |
戻り値
このメソッドは HRESULT を返します。戻り値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
|
指定されたプロパティキーはサポートされていません。 |
解説(Remarks)
このメソッドを呼び出す前に、アプリケーションは管理者ユーザー権限を持っていることを確認する必要があります。
コネクターのプラグ アンド プレイ (PnP) デバイス識別子を取得します。
| ppwszPnPID | LPWSTR* | out | PnP デバイス識別子。 |
戻り値
このメソッドは HRESULT を返します。戻り値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 |
解説(Remarks)
このメソッドで取得される識別子は、ペアリング済みの MTP/Bluetooth デバイスに対する接続および切断の IOCTL 要求を受け取る MTP/Bluetooth バス列挙子デバイスノードのハンドルに対応します。アプリケーションはこの識別子を SetupAPI の関数と組み合わせて使用し、デバイスノードにアクセスできます。
ppwszPnPID パラメーターで指定された識別子が不要になったら、アプリケーションは CoTaskMemAlloc 関数を呼び出してこの識別子を解放する必要があります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IPortableDeviceConnector "{625E2DF8-6392-4CF0-9AD1-3CFA5F17775C}" #usecom global IPortableDeviceConnector IID_IPortableDeviceConnector "{}" #comfunc global IPortableDeviceConnector_Connect 3 sptr #comfunc global IPortableDeviceConnector_Disconnect 4 sptr #comfunc global IPortableDeviceConnector_Cancel 5 sptr #comfunc global IPortableDeviceConnector_GetProperty 6 var,var,var,var #comfunc global IPortableDeviceConnector_SetProperty 7 var,int,var,int #comfunc global IPortableDeviceConnector_GetPnPID 8 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IPortableDeviceConnector "{625E2DF8-6392-4CF0-9AD1-3CFA5F17775C}" #usecom global IPortableDeviceConnector IID_IPortableDeviceConnector "{}" #comfunc global IPortableDeviceConnector_Connect 3 sptr #comfunc global IPortableDeviceConnector_Disconnect 4 sptr #comfunc global IPortableDeviceConnector_Cancel 5 sptr #comfunc global IPortableDeviceConnector_GetProperty 6 sptr,sptr,sptr,sptr #comfunc global IPortableDeviceConnector_SetProperty 7 sptr,int,sptr,int #comfunc global IPortableDeviceConnector_GetPnPID 8 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。