Herstellen einer Verbindung
Sobald der Benutzer ein Gerät ausgewählt hat, ruft die ChooseDevice-Funktion wiederum die IPortableDevice::Open-Methode auf, um eine Verbindung zwischen der Anwendung und dem Gerät herzustellen. Die IPortableDevice::Open-Methode verwendet zwei Argumente:
- Ein Zeiger auf eine NULL-Zeichenfolge, die den Plug & Play Namen des Geräts angibt. (Diese Zeichenfolge wird durch Aufrufen der IPortableDeviceManager::GetDevices-Methode abgerufen.)
- Ein Zeiger auf eine IPortableDeviceValues-Schnittstelle , die Clientinformationen für die Anwendung angibt.
// 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);
}
Für Windows 7 unterstützt IPortableDevice zwei CLSIDs für CoCreateInstance. CLSID_PortableDevice gibt einen IPortableDevice-Zeiger zurück, der den Freethread-Marshaller nicht aggregiert. CLSID_PortableDeviceFTM ist eine neue CLSID, die einen IPortableDevice-Zeiger zurückgibt, der den Freethread-Marshaller aggregiert. Beide Zeiger unterstützen andernfalls dieselbe Funktionalität.
Anwendungen, die in Single Threaded Apartments leben, sollten CLSID_PortableDeviceFTM verwenden, da dadurch der Mehraufwand für das Marshallen von Schnittstellenzeigern entfällt. CLSID_PortableDevice wird weiterhin für Legacyanwendungen unterstützt.
Zugehörige Themen