Установление подключения
После выбора устройства функция ChooseDevice, в свою очередь, вызывает метод IPortableDevice::Open , чтобы установить соединение между приложением и устройством. Метод IPortableDevice::Open принимает два аргумента:
- Указатель на строку, завершающуюся значением NULL, указывающую Plug and Play имя устройства. (Эта строка извлекается путем вызова метода IPortableDeviceManager::GetDevices .)
- Указатель на интерфейс IPortableDeviceValues , указывающий сведения о клиенте для приложения.
// CoCreate the IPortableDevice interface and call Open() with
// the chosen PnPDeviceID string.
hr = CoCreateInstance(CLSID_PortableDeviceFTM,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(ppDevice));
if (SUCCEEDED(hr))
{
hr = (*ppDevice)->Open(pPnpDeviceIDs[uiCurrentDevice], pClientInformation);
if (FAILED(hr))
{
if (hr == E_ACCESSDENIED)
{
printf("Failed to Open the device for Read Write access, will open it for Read-only access instead\n");
pClientInformation->SetUnsignedIntegerValue(WPD_CLIENT_DESIRED_ACCESS, GENERIC_READ);
hr = (*ppDevice)->Open(pPnpDeviceIDs[uiCurrentDevice], pClientInformation);
if (FAILED(hr))
{
printf("! Failed to Open the device, hr = 0x%lx\n",hr);
// Release the IPortableDevice interface, because we cannot proceed
// with an unopen device.
(*ppDevice)->Release();
*ppDevice = NULL;
}
}
else
{
printf("! Failed to Open the device, hr = 0x%lx\n",hr);
// Release the IPortableDevice interface, because we cannot proceed
// with an unopen device.
(*ppDevice)->Release();
*ppDevice = NULL;
}
}
}
else
{
printf("! Failed to CoCreateInstance CLSID_PortableDeviceFTM, hr = 0x%lx\n",hr);
}
Для Windows 7 IPortableDevice поддерживает два clSID для CoCreateInstance. CLSID_PortableDevice возвращает указатель IPortableDevice , который не агрегирует маршалер без потоков; CLSID_PortableDeviceFTM — это новый идентификатор CLSID, который возвращает указатель IPortableDevice , который объединяет свободный поток маршалер. Оба указателя поддерживают одинаковые функции в противном случае.
Приложения, которые живут в однопоточных квартирах, должны использовать CLSID_PortableDeviceFTM , так как это устраняет затраты на маршалинг указателя интерфейса. CLSID_PortableDevice по-прежнему поддерживается для устаревших приложений.
Связанные темы