建立连接
用户选择设备后,ChooseDevice 函数依次调用 IPortableDevice::Open 方法以在应用程序与设备之间建立连接。 IPortableDevice::Open 方法采用两个参数:
- 指向以 null 结尾的字符串的指针,该字符串指定设备的即插即用名称。 (此字符串是通过调用 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 支持 CoCreateInstance 的两个 CLSD。 CLSID_PortableDevice 返回不聚合自由线程封送处理程序的 IPortableDevice 指针; CLSID_PortableDeviceFTM 是一个新的 CLSID,它返回聚合自由线程封送处理程序的 IPortableDevice 指针。 否则,这两个指针都支持相同的功能。
位于单线程单元中的应用程序应使用 CLSID_PortableDeviceFTM ,因为这样可以消除接口指针封送的开销。 旧 版应用程序仍支持CLSID_PortableDevice。
相关主题