IWMDMDeviceSession::BeginSession メソッド (mswmdm.h)
BeginSession メソッドは、デバイス セッションを開始します。
構文
HRESULT BeginSession(
[in] WMDM_SESSION_TYPE type,
[in] BYTE *pCtx,
[in] DWORD dwSizeCtx
);
パラメーター
[in] type
開始するセッションの種類を説明する WMDM_SESSION_TYPE 。 これは、WMDM_SESSION_NONEを除くすべての値のビットごとの OR です。 EndSession では、同じ型 (または型の組み合わせ) を指定する必要があります。
[in] pCtx
アプリケーションとサービス プロバイダー間のプライベート通信用の呼び出し元によって割り当てられたセッション コンテキスト バッファーへのオプションのポインター。 基になるサービス プロバイダーに関する知識を持つアプリケーションでは、このバッファーを使用してコンテキスト固有のデータを渡すことができます。 Windows Media デバイス マネージャー では、このコンテキストでは何も行われません。 呼び出し元は、このバッファーを解放する役割を担います。
[in] dwSizeCtx
コンテキスト バッファーのサイズ (バイト単位)。 サイズが 0 の場合、 pCtx は無視されます。 サイズが 0 以外の場合、 pCtx は有効なポインターである必要があります。
戻り値
このメソッドは HRESULT を返します。 Windows Media デバイス マネージャーのすべてのインターフェイス メソッドは、次のいずれかのエラー コード クラスを返すことができます。
- 標準 COM エラー コード
- HRESULT 値に変換された Windows エラー コード
- Windows Media デバイス マネージャーエラー コード
注釈
セッションに複数の操作をバンドルしても、すべてのアクションが延期され、グループで実行されるわけではありません。すべてのアクション ( Insert の呼び出しなど) は、引き続き呼び出しとして同期的に実行されます。 セッションを使用すると、Windows Media デバイス マネージャー コンポーネント (セキュリティで保護されたコンテンツ プロバイダーやサービス プロバイダーなど) がセッションごとに 1 回だけ一部の操作を実行できるようになり、パフォーマンスが向上します。 たとえば、デバイスへのファイル転送中に、セキュリティで保護されたコンテンツ プロバイダーは、ファイル転送ごとに 1 回ではなく、セッションの開始時にデバイス証明書を 1 回取得できます。
アプリケーションは、一連の操作を実行する前に Windows Media デバイス マネージャー デバイス オブジェクトで BeginSession を呼び出し、完了したら EndSession を呼び出すことができます。
アプリケーションは通常、複数のファイル転送または削除中に BeginSession を呼び出します。 これに応じて、Windows Media デバイス マネージャーは、セキュリティで保護されたコンテンツ プロバイダーとサービス プロバイダーで BeginSession または EndSession を呼び出します。 応答として、セキュリティで保護されたコンテンツ プロバイダーとサービス プロバイダーは、セッションごとに 1 回の操作を実行できます。 これらのコンポーネントのいずれかでセッションを開く際に失敗した場合、Windows Media デバイス マネージャーは コンポーネントから返されたエラーを返します。
セッションは、デバイスごとに実装されます。 異なるデバイス上のセッションは相互に干渉しません。
セッションには次の制限が適用されます。
- 特定のデバイスに対して一度にアクティブにできるセッションは 1 つだけです。 デバイスで複数のセッションを開こうとすると、エラーが発生します。
-
セッションの種類を組み合わせることができます。 BeginSession と EndSession の間に同じフラグ セットを指定する必要があります。 したがって、セッションの一部のみを終了することはできません。
たとえば、 BeginSession が で呼び出された場合
WMDM_SESSION_TRANSFER_TO_DEVICE |WMDM_SESSION_DELETE
次に、EndSession も で呼び出す必要があります
WMDM_SESSION_TRANSFER_TO_DEVICE |WMDM_SESSION_DELETE
それ以外の場合、Windows Media デバイス マネージャーはE_INVALIDARGを返します。
- Windows Media デバイス マネージャー セッションは、単に最適化のためのブラケット メカニズムであり、デバイスのロックや所有権に関する影響はありません。 サービス プロバイダーまたは下位レベルのデバイス ドライバーでは、さまざまな Windows Media デバイス マネージャー アプリケーションによって発生する可能性があるデバイス アクセスを同期する必要があります。
例
次の C++ コードは、セッションを使用してデバイスで Insert3 呼び出しをバンドルする方法を示しています。 このコードは、ベクターに格納されている多数のファイルをループ処理し、デバイスに送信します。
// Get the session interface.
CComQIPtr<IWMDMDeviceSession> pSession(pDevice);
if (pDevice == NULL)
{
// TODO: Display a message that the application couldn't get an
// IWMDMDeviceSession interface.
return E_NOINTERFACE;
}
// Start the session. We don't use a custom buffer.
hr = pSession->BeginSession(WMDM_SESSION_TRANSFER_TO_DEVICE, NULL, NULL);
if (hr != S_OK)
{
// TODO: Display a message indicating that the session failed to start.
return hr;
}
else
{
// TODO: Display a message that the session started.
}
// Insert files. These calls happen synchronously.
UINT flags = WMDM_MODE_BLOCK | WMDM_STORAGECONTROL_INSERTINTO | WMDM_FILE_CREATE_OVERWRITE | WMDM_CONTENT_FILE;
CComPtr<IWMDMStorage> pNewStorage;
for(int i = 0; i < sourceFiles.size(); i++)
{
hr = pStorageControl3->Insert3(
flags,
WMDM_FILE_ATTR_FOLDER,
sourceFiles[i],
NULL, // Use default name.
NULL, // Don't specify IWMDMOperation.
NULL, // Don't specify IWMDMProgress.
NULL, // Don't specify metadata.
NULL, // Nothing to send to the SCP.
&pNewStorage);
if (pNewStorage != NULL)
pNewStorage.Release();
CHECK_HR(hr, "Sent file " << sourceFiles[i] << " to the device.", "Couldn't send file " << sourceFiles[i] << " to the device");
}
// Close the session.
hr = pSession->EndSession(WMDM_SESSION_TRANSFER_TO_DEVICE, NULL, NULL);
CHECK_HR(hr,"Closed the session.","Couldn't close the session.");
要件
要件 | 値 |
---|---|
対象プラットフォーム | Windows |
ヘッダー | mswmdm.h |
Library | Mssachlp.lib |