建立連線
一旦使用者選取裝置,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的兩個 CLSID。 CLSID_PortableDevice 會傳回不會匯總自由執行緒封送處理器的 IPortableDevice 指標; CLSID_PortableDeviceFTM 是傳回 IPortableDevice 指標的新 CLSID,可匯總自由執行緒封送處理器。 這兩個指標都支援相同的功能,否則為 。
在單一執行緒 Apartments 中的應用程式應該使用 CLSID_PortableDeviceFTM ,因為這樣可消除介面指標封送處理的額外負荷。 舊 版應用程式仍支援CLSID_PortableDevice。
相關主題