Établissement d’une connexion
Une fois que l’utilisateur sélectionne un appareil, la fonction ChooseDevice appelle à son tour la méthode IPortableDevice::Open pour établir une connexion entre l’application et l’appareil. La méthode IPortableDevice::Open prend deux arguments :
- Pointeur vers une chaîne terminée par null qui spécifie le nom Plug-and-Play de l’appareil. (Cette chaîne est récupérée en appelant la méthode IPortableDeviceManager::GetDevices .)
- Pointeur vers une interface IPortableDeviceValues qui spécifie les informations client pour l’application.
// 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);
}
Pour Windows 7, IPortableDevice prend en charge deux CLSID pour CoCreateInstance. CLSID_PortableDevice retourne un pointeur IPortableDevice qui n’agrége pas le marshaler à thread libre ; CLSID_PortableDeviceFTM est un nouveau CLSID qui retourne un pointeur IPortableDevice qui agrège le marshaler à thread libre. Sinon, les deux pointeurs prennent en charge les mêmes fonctionnalités.
Les applications qui vivent dans les appartements à thread unique doivent utiliser CLSID_PortableDeviceFTM car cela élimine la surcharge liée au marshaling des pointeurs d’interface. CLSID_PortableDevice est toujours pris en charge pour les applications héritées.
Rubriques connexes