Metodo IPortableDevice::Open (portabledeviceapi.h)
Il metodo Open apre una connessione tra l'applicazione e il dispositivo.
Sintassi
HRESULT Open(
[in] LPCWSTR pszPnPDeviceID,
[in] IPortableDeviceValues *pClientInfo
);
Parametri
[in] pszPnPDeviceID
Puntatore a una stringa con terminazione Null contenente la stringa ID Plug and Play per il dispositivo. È possibile ottenere questa stringa chiamando IPortableDeviceManager::GetDevices.
[in] pClientInfo
Puntatore a un'interfaccia IPortableDeviceValues che contiene informazioni che identificano l'applicazione nel dispositivo. Questa interfaccia contiene coppie PROPERTYKEY/valore che tentano di identificare un'applicazione in modo univoco. Anche se è necessaria la presenza di un'interfaccia CoCreated, l'applicazione non è necessaria per inviare coppie chiave/valore. Tuttavia, l'invio di dati potrebbe migliorare le prestazioni. Le coppie chiave/valore tipiche includono il nome dell'applicazione, la versione principale e secondaria e il numero di build.
Vedere le proprietà che iniziano con "WPD_CLIENT_" nella sezione Proprietà .
Valore restituito
Il metodo restituisce un valore HRESULT. I valori possibili includono, ma non sono limitati a, quelli indicati nella tabella seguente.
Codice restituito | Descrizione |
---|---|
|
Il metodo è riuscito. |
|
La connessione del dispositivo è già stata aperta. |
|
Almeno uno degli argomenti è un puntatore NULL. |
Commenti
Prima di poter chiamare qualsiasi metodo su di esso, è necessario aprire un dispositivo. Si noti che i metodi IPortableDeviceManager non richiedono di aprire un dispositivo prima di chiamare metodi. Tuttavia, in genere non è necessario chiamare Close.
Gli amministratori possono limitare l'accesso dei dispositivi portatili ai computer in esecuzione in una rete. Ad esempio, un amministratore può limitare l'accesso in sola lettura a tutti gli utenti guest, mentre agli utenti autenticati viene concesso l'accesso in lettura/scrittura.
A causa di questi problemi di sicurezza, se l'applicazione non eseguirà operazioni di scrittura, deve chiamare il metodo Open e richiedere l'accesso in sola lettura specificando GENERIC_READ per la proprietà WPD_CLIENT_DESIRED_ACCESS fornita nel parametro pClientInfo .
Se l'applicazione richiede operazioni di scrittura, deve chiamare il metodo Open , come illustrato nel codice di esempio seguente. La prima volta, deve richiedere l'accesso in lettura/scrittura passando la proprietà di WPD_CLIENT_DESIRED_ACCESS predefinita nel parametro pClientInfo . Se la prima chiamata ha esito negativo e restituisce E_ACCESSDENIED, l'applicazione deve chiamare il metodo Open una seconda volta e richiedere l'accesso in sola lettura specificando GENERIC_READ per la proprietà WPD_CLIENT_DESIRED_ACCESS fornita nel parametro pClientInfo .
Le applicazioni che risiedono in apartment a thread singolo devono usare CLSID_PortableDeviceFTM, in quanto ciò elimina il sovraccarico del marshalling del puntatore di interfaccia. CLSID_PortableDevice è ancora supportato per le applicazioni legacy.
Esempio
#define CLIENT_NAME L"My WPD Application"
#define CLIENT_MAJOR_VER 1
#define CLIENT_MINOR_VER 0
#define CLIENT_REVISION 0
HRESULT OpenDevice(LPCWSTR wszPnPDeviceID, IPortableDevice** ppDevice)
{
HRESULT hr = S_OK;
IPortableDeviceValues* pClientInformation = NULL;
IPortableDevice* pDevice = NULL;
if ((wszPnPDeviceID == NULL) || (ppDevice == NULL))
{
hr = E_INVALIDARG;
return hr;
}
// CoCreate an IPortableDeviceValues interface to hold the client information.
hr = CoCreateInstance(CLSID_PortableDeviceValues,
NULL,
CLSCTX_INPROC_SERVER,
IID_IPortableDeviceValues,
(VOID**) &pClientInformation);
if (SUCCEEDED(hr))
{
HRESULT ClientInfoHR = S_OK;
// Attempt to set all properties for client information. If we fail to set
// any of the properties below it is OK. Failing to set a property in the
// client information isn't a fatal error.
ClientInfoHR = pClientInformation->SetStringValue(WPD_CLIENT_NAME, CLIENT_NAME);
if (FAILED(ClientInfoHR))
{
// Failed to set WPD_CLIENT_NAME
}
ClientInfoHR = pClientInformation->SetUnsignedIntegerValue(WPD_CLIENT_MAJOR_VERSION, CLIENT_MAJOR_VER);
if (FAILED(ClientInfoHR))
{
// Failed to set WPD_CLIENT_MAJOR_VERSION
}
ClientInfoHR = pClientInformation->SetUnsignedIntegerValue(WPD_CLIENT_MINOR_VERSION, CLIENT_MINOR_VER);
if (FAILED(ClientInfoHR))
{
// Failed to set WPD_CLIENT_MINOR_VERSION
}
ClientInfoHR = pClientInformation->SetUnsignedIntegerValue(WPD_CLIENT_REVISION, CLIENT_REVISION);
if (FAILED(ClientInfoHR))
{
// Failed to set WPD_CLIENT_REVISION
}
}
else
{
// Failed to CoCreateInstance CLSID_PortableDeviceValues for client information
}
ClientInfoHR = pClientInformation->SetUnsignedIntegerValue(WPD_CLIENT_SECURITY_QUALITY_OF_SERVICE, SECURITY_IMPERSONATION);
if (FAILED(ClientInfoHR))
{
// Failed to set WPD_CLIENT_SECURITY_QUALITY_OF_SERVICE
}
if (SUCCEEDED(hr))
{
// CoCreate an IPortableDevice interface
hr = CoCreateInstance(CLSID_PortableDeviceFTM,
NULL,
CLSCTX_INPROC_SERVER,
IID_IPortableDevice,
(VOID**) &pDevice);
if (SUCCEEDED(hr))
{
// Attempt to open the device using the PnPDeviceID string given
// to this function and the newly created client information.
// Note that we're attempting to open the device the first
// time using the default (read/write) access. If this fails
// with E_ACCESSDENIED, we'll attempt to open a second time
// with read-only access.
hr = pDevice->Open(wszPnPDeviceID, pClientInformation);
if (hr == E_ACCESSDENIED)
{
// Attempt to open for read-only access
pClientInformation->SetUnsignedIntegerValue(
WPD_CLIENT_DESIRED_ACCESS,
GENERIC_READ);
hr = pDevice->Open(wszPnPDeviceID, pClientInformation);
}
if (SUCCEEDED(hr))
{
// The device successfully opened, obtain an instance of the Device into
// ppDevice so the caller can be returned an opened IPortableDevice.
hr = pDevice->QueryInterface(IID_IPortableDevice, (VOID**)ppDevice);
if (FAILED(hr))
{
// Failed to QueryInterface the opened IPortableDevice
}
}
}
else
{
// Failed to CoCreateInstance CLSID_PortableDevice
}
}
// Release the IPortableDevice when finished
if (pDevice != NULL)
{
pDevice->Release();
pDevice = NULL;
}
// Release the IPortableDeviceValues that contains the client information when finished
if (pClientInformation != NULL)
{
pClientInformation->Release();
pClientInformation = NULL;
}
return hr;
}
Requisiti
Requisito | Valore |
---|---|
Piattaforma di destinazione | Windows |
Intestazione | portabledeviceapi.h |
Libreria | PortableDeviceGUIDs.lib |