Поделиться через


Метод IPortableDevice::Open (portabledeviceapi.h)

Метод Open открывает подключение между приложением и устройством.

Синтаксис

HRESULT Open(
  [in] LPCWSTR               pszPnPDeviceID,
  [in] IPortableDeviceValues *pClientInfo
);

Параметры

[in] pszPnPDeviceID

Указатель на строку, завершающуюся значением NULL, которая содержит строку идентификатора Plug and Play для устройства. Эту строку можно получить, вызвав IPortableDeviceManager::GetDevices.

[in] pClientInfo

Указатель на интерфейс IPortableDeviceValues , содержащий сведения, определяющие приложение для устройства. Этот интерфейс содержит пары PROPERTYKEY/value, которые пытаются идентифицировать приложение уникальным образом. Хотя наличие интерфейса CoCreated является обязательным, приложение не обязано отправлять пары "ключ-значение". Однако отправка данных может повысить производительность. Типичные пары "ключ-значение" включают имя приложения, основную и дополнительную версию, а также номер сборки.

В разделе Свойства см. свойства, начинающиеся с WPD_CLIENT_.

Возвращаемое значение

Метод возвращает HRESULT. Допустимые значения включают, но не ограничиваются, значения, приведенные в следующей таблице.

Код возврата Описание
S_OK
Метод выполнен успешно.
E_WPD_DEVICE_ALREADY_OPENED
Подключение устройства уже открыто.
E_POINTER
По крайней мере один из аргументов был указателем NULL.

Комментарии

Перед вызовом каких-либо методов на нем необходимо открыть устройство. (Обратите внимание, что для методов IPortableDeviceManager не требуется открывать устройство перед вызовом каких-либо методов.) Однако обычно не требуется вызывать close.

Администраторы могут ограничить доступ переносимых устройств к компьютерам, работающим в сети. Например, администратор может ограничить доступ для всех гостевых пользователей только для чтения, в то время как прошедшие проверку подлинности пользователи получают доступ на чтение и запись.

Из-за этих проблем безопасности, если приложение не будет выполнять операции записи, оно должно вызвать метод Open и запросить доступ только для чтения, указав GENERIC_READ для свойства WPD_CLIENT_DESIRED_ACCESS, которое оно предоставляет в параметре pClientInfo .

Если приложению требуются операции записи, оно должно вызвать метод Open , как показано в следующем примере кода. В первый раз он должен запросить доступ на чтение и запись, передав свойство WPD_CLIENT_DESIRED_ACCESS по умолчанию в параметре pClientInfo . Если первый вызов завершается сбоем и возвращает E_ACCESSDENIED, приложение должно вызвать метод Open во второй раз и запросить доступ только для чтения, указав GENERIC_READ для свойства WPD_CLIENT_DESIRED_ACCESS, которое оно предоставляет в параметре pClientInfo .

Приложения, которые находятся в однопотоковых квартирах, должны использовать CLSID_PortableDeviceFTM, так как это позволяет избежать дополнительных затрат на маршалинг указателей интерфейса. CLSID_PortableDevice по-прежнему поддерживается для устаревших приложений.

Примеры


#define CLIENT_NAME         L"My WPD Application"
#define CLIENT_MAJOR_VER    1
#define CLIENT_MINOR_VER    0
#define CLIENT_REVISION     0

HRESULT OpenDevice(LPCWSTR wszPnPDeviceID, IPortableDevice** ppDevice)
{
    HRESULT                hr                 = S_OK;
    IPortableDeviceValues* pClientInformation = NULL;
    IPortableDevice*       pDevice            = NULL;

    if ((wszPnPDeviceID == NULL) || (ppDevice == NULL))
    {
        hr = E_INVALIDARG;
        return hr;
    }

    // CoCreate an IPortableDeviceValues interface to hold the client information.
    hr = CoCreateInstance(CLSID_PortableDeviceValues,
                          NULL,
                          CLSCTX_INPROC_SERVER,
                          IID_IPortableDeviceValues,
                          (VOID**) &pClientInformation);
    if (SUCCEEDED(hr))
    {
        HRESULT ClientInfoHR = S_OK;

        // Attempt to set all properties for client information. If we fail to set
        // any of the properties below it is OK. Failing to set a property in the
        // client information isn't a fatal error.
        ClientInfoHR = pClientInformation->SetStringValue(WPD_CLIENT_NAME, CLIENT_NAME);
        if (FAILED(ClientInfoHR))
        {
           // Failed to set WPD_CLIENT_NAME
        }

        ClientInfoHR = pClientInformation->SetUnsignedIntegerValue(WPD_CLIENT_MAJOR_VERSION, CLIENT_MAJOR_VER);
        if (FAILED(ClientInfoHR))
        {
            // Failed to set WPD_CLIENT_MAJOR_VERSION
        }

        ClientInfoHR = pClientInformation->SetUnsignedIntegerValue(WPD_CLIENT_MINOR_VERSION, CLIENT_MINOR_VER);
        if (FAILED(ClientInfoHR))
        {
            // Failed to set WPD_CLIENT_MINOR_VERSION
        }

        ClientInfoHR = pClientInformation->SetUnsignedIntegerValue(WPD_CLIENT_REVISION, CLIENT_REVISION);
        if (FAILED(ClientInfoHR))
        {
            // Failed to set WPD_CLIENT_REVISION
        }
    }
    else
    {
        // Failed to CoCreateInstance CLSID_PortableDeviceValues for client information
    }

        ClientInfoHR = pClientInformation->SetUnsignedIntegerValue(WPD_CLIENT_SECURITY_QUALITY_OF_SERVICE, SECURITY_IMPERSONATION);
        if (FAILED(ClientInfoHR))
        {
            // Failed to set WPD_CLIENT_SECURITY_QUALITY_OF_SERVICE
        }

    if (SUCCEEDED(hr))
    {
        // CoCreate an IPortableDevice interface
        hr = CoCreateInstance(CLSID_PortableDeviceFTM,
                              NULL,
                              CLSCTX_INPROC_SERVER,
                              IID_IPortableDevice,
                              (VOID**) &pDevice);

        if (SUCCEEDED(hr))
        {
            // Attempt to open the device using the PnPDeviceID string given
            // to this function and the newly created client information.
            // Note that we're attempting to open the device the first 
            // time using the default (read/write) access. If this fails
            // with E_ACCESSDENIED, we'll attempt to open a second time
            // with read-only access.
            hr = pDevice->Open(wszPnPDeviceID, pClientInformation);
            if (hr == E_ACCESSDENIED)
            {
                 // Attempt to open for read-only access
                 pClientInformation->SetUnsignedIntegerValue(
                       WPD_CLIENT_DESIRED_ACCESS,
                       GENERIC_READ);
                 hr = pDevice->Open(wszPnPDeviceID, pClientInformation);
            }
            if (SUCCEEDED(hr))
            {
                // The device successfully opened, obtain an instance of the Device into
                // ppDevice so the caller can be returned an opened IPortableDevice.
                hr = pDevice->QueryInterface(IID_IPortableDevice, (VOID**)ppDevice);
                if (FAILED(hr))
                {
                    // Failed to QueryInterface the opened IPortableDevice
                }
            }
        }
        else
        {
            // Failed to CoCreateInstance CLSID_PortableDevice
        }
    }

    // Release the IPortableDevice when finished
    if (pDevice != NULL)
    {
        pDevice->Release();
        pDevice = NULL;
    }

    // Release the IPortableDeviceValues that contains the client information when finished
    if (pClientInformation != NULL)
    {
        pClientInformation->Release();
        pClientInformation = NULL;
    }

    return hr;
}

Требования

Требование Значение
Целевая платформа Windows
Header portabledeviceapi.h
Библиотека PortableDeviceGUIDs.lib

См. также раздел

Установление подключения

Интерфейс IPortableDevice

IPortableDevice::Close