Метод 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. Допустимые значения включают, но не ограничиваются, значения, приведенные в следующей таблице.
Код возврата | Описание |
---|---|
|
Метод выполнен успешно. |
|
Подключение устройства уже открыто. |
|
По крайней мере один из аргументов был указателем 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 |