Estabelecer uma conexão
Depois que o usuário seleciona um dispositivo, a função ChooseDevice, por sua vez, chama o método IPortableDevice::Open para estabelecer uma conexão entre o aplicativo e o dispositivo. O método IPortableDevice::Open usa dois argumentos:
- Um ponteiro para uma cadeia de caracteres terminada em nulo que especifica o nome Plug and Play do dispositivo. (Essa cadeia de caracteres é recuperada chamando o método IPortableDeviceManager::GetDevices .)
- Um ponteiro para uma interface IPortableDeviceValues que especifica as informações do cliente para o aplicativo.
// 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);
}
Para o Windows 7, IPortableDevice dá suporte a dois CLSIDs para CoCreateInstance. CLSID_PortableDevice retorna um ponteiro IPortableDevice que não agrega o marshaler de thread livre; CLSID_PortableDeviceFTM é um novo CLSID que retorna um ponteiro IPortableDevice que agrega o marshaler de thread livre. Caso contrário, ambos os ponteiros dão suporte à mesma funcionalidade.
Os aplicativos que residem em single threaded apartments devem usar CLSID_PortableDeviceFTM , pois isso elimina a sobrecarga do marshaling de ponteiro de interface. CLSID_PortableDevice ainda tem suporte para aplicativos herdados.
Tópicos relacionados