다음을 통해 공유


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 장치 관리자 오류 코드
가능한 오류 코드의 광범위한 목록은 오류 코드를 참조하세요.

설명

여러 작업을 세션에 묶어도 모든 작업이 연기되고 그룹에서 수행되는 것은 아닙니다. 모든 작업(예: 삽입 호출)은 호출된 대로 동기적으로 수행됩니다. 대신 세션을 사용하면 Windows Media 장치 관리자 구성 요소(예: 보안 콘텐츠 공급자 및 서비스 공급자)가 세션당 한 번만 일부 작업을 수행할 수 있으므로 성능이 향상됩니다. 예를 들어 디바이스로 파일을 전송하는 동안 보안 콘텐츠 공급자는 모든 파일 전송에 대해 한 번이 아니라 세션 시작 시 디바이스 인증서를 한 번 획득할 수 있습니다.

애플리케이션은 작업이 완료되면 일련의 작업 및 EndSession을 수행하기 전에 Windows Media 장치 관리자 디바이스 개체에서 BeginSession을 호출할 수 있습니다.

애플리케이션은 일반적으로 여러 파일 전송 또는 삭제 중에 BeginSession 을 호출합니다. 이에 대한 응답으로 Windows Media 장치 관리자 보안 콘텐츠 공급자 및 서비스 공급자에서 BeginSession 또는 EndSession을 호출합니다. 이에 대한 응답으로 보안 콘텐츠 공급자와 서비스 공급자는 세션당 한 번 작업을 수행할 수 있습니다. 이러한 구성 요소에서 세션을 열지 못하면 Windows Media 장치 관리자 구성 요소에서 반환된 오류를 반환합니다.

세션은 디바이스별로 구현됩니다. 다른 디바이스의 세션은 서로 간섭하지 않습니다.

세션에 적용되는 제한 사항은 다음과 같습니다.

  1. 특정 디바이스에 대해 한 번에 하나의 세션만 활성화할 수 있습니다. 디바이스에서 둘 이상의 세션을 열려고 하면 오류가 발생합니다.
  2. 세션 유형을 결합할 수 있습니다. BeginSessionEndSession 중에 동일한 플래그 집합을 지정해야 합니다. 따라서 세션의 일부만 종료할 수 없습니다.

    예를 들어 BeginSession 이 와 함께 호출되는 경우

    WMDM_SESSION_TRANSFER_TO_DEVICE | WMDM_SESSION_DELETE

    그런 다음 EndSession을 로 호출해야 합니다.

    WMDM_SESSION_TRANSFER_TO_DEVICE | WMDM_SESSION_DELETE

    그렇지 않으면 Windows Media 장치 관리자 E_INVALIDARG 반환합니다.

  3. 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
라이브러리 Mssachlp.lib

추가 정보

IWMDMDeviceSession 인터페이스

IWMDMDeviceSession::EndSession

WMDM_SESSION_TYPE