Esempio di codice per ottenere un oggetto Istanza di funzione
L'esempio di codice seguente contiene la dichiarazione di una classe di esempio (CWSDDevice) che contiene due membri di classe rilevanti per ottenere l'oggetto Istanza di funzione corrente:
CWSDDevice::m_pFunctionDiscovery
CWSDDevice::m_pFunctionInstance
L'esempio di codice mostra anche i metodi per inizializzare questi membri e metodi per leggere le proprietà del dispositivo dall'archivio delle proprietà dell'istanza di funzione corrente. Il metodo CWSDDevice::InitializeConnection illustra la procedura descritta in Recupero di un oggetto istanza di funzione per ottenere l'oggetto Istanza di funzione corrente che rappresenta l'istanza del dispositivo del dispositivo dello scanner di servizi Web corrente.
/**************************************************************************\
* Sample CWSDDevice class that encapsulates the device communication interface
\**************************************************************************/
class CWSDDevice
{
public:
CWSDDevice();
~CWSDDevice();
HRESULT
InitializeConnection(
__in LPCWSTR wszDevicePath);
HRESULT
UnInitializeConnection();
HRESULT
OpenPropertyStore(
__out IPropertyStore **ppPropertyStore);
HRESULT
ReadDeviceProperty(
__in_opt IPropertyStore *pPropertyStore,
__in const PROPERTYKEY *pPropertyKey,
__out BSTR *pbstrPropertyValue);
private:
//
// Flag indicating successful initialization was performed:
//
BOOL m_bInitialized;
//
// Function Discovery object
//
IFunctionDiscovery *m_pFunctionDiscovery;
//
// Function Instance object (which represents the current device instance)
//
IFunctionInstance *m_pFunctionInstance;
};
/**************************************************************************\
* CWSDDevice::InitializeConnection
*
* Initializes the connection to the web services scanner through Function Discovery
*
* Arguments:
*
* wszDevicePath - unique PNPX ID identifier for the WS scanner,
* returned by IStiDeviceControl::GetMyDevicePortName
*
* Return Value:
*
* S_OK if successful, an error HRESULT otherwise
*
\**************************************************************************/
HRESULT InitializeConnection(
__in LPCWSTR wszDevicePath)
{
HRESULT hr = S_OK;
IFunctionInstanceCollectionQuery *pfiCollectionQuery = NULL;
IFunctionInstanceCollection *pfiCollection = NULL;
PROPVARIANT PropVar = {0};
if (m_bInitialized)
{
//
// Initialization was performed once. Treat this is as a
// re-initialization request: un-initialize and initialize again:
//
hr = UnInitialize();
if (FAILED(hr))
{
WIAS_ERROR((g_hInst, "Failed to re-initialize device interface, hr = 0x%08X", hr));
}
}
if (!wszDevicePath)
{
hr = E_INVALIDARG;
WIAS_ERROR((g_hInst, "Failed to initialize device interface, invalid device path argument, hr = 0x%08X", hr));
}
if (SUCCEEDED(hr))
{
PropVariantInit(&PropVar);
PropVar.vt = VT_LPWSTR;
PropVar.pwszVal = (LPWSTR)wszDevicePath;
}
if (SUCCEEDED(hr))
{
//
// Create the Function Discovery object
//
hr = CoCreateInstance(__uuidof(FunctionDiscovery),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IFunctionDiscovery),
(void**)&m_pFunctionDiscovery);
if ((SUCCEEDED(hr)) && (!m_pFunctionDiscovery))
{
hr = E_POINTER;
WIAS_ERROR((g_hInst, "CoCreateInstance(IFunctionDiscovery) returned a NULL m_pFunctionDiscovery, hr = 0x%08X", hr));
}
if (FAILED(hr))
{
WIAS_ERROR((g_hInst, "CoCreateInstance for IFunctionDiscovery failed, hr = 0x%08X", hr));
}
}
if (SUCCEEDED(hr))
{
//
// Query the Function Discovery object for a collection of
// Function Instances that are related to this device path
//
hr = m_pFunctionDiscovery->CreateInstanceCollectionQuery(FCTN_CATEGORY_PNP,
NULL,
FALSE,
NULL,
&pfiCollectionQuery);
if ((SUCCEEDED(hr)) && (!pfiCollectionQuery))
{
WIAS_ERROR((g_hInst,
"IFunctionDiscovery::CreateInstanceCollectionQuery(%ws) returned a NULL IFunctionInstanceCollectionQuery* with hr = 0x%08X",
FCTN_CATEGORY_PNP, hr));
hr = E_POINTER;
}
if (FAILED(hr))
{
WIAS_ERROR((g_hInst, "IFunctionDiscovery::CreateInstanceCollectionQuery(%ws) failed, hr = 0x%08X", FCTN_CATEGORY_PNP, hr));
}
}
if (SUCCEEDED(hr))
{
//
// Pass in the device path (which contains a PnP-X ID) as a query constraint to the new collection query
//
hr = pfiCollectionQuery->AddPropertyConstraint(PKEY_PNPX_ID, &PropVar, QC_EQUALS);
if (FAILED(hr))
{
WIAS_ERROR((g_hInst, "IFunctionInstanceCollectionQuery::AddPropertyConstraint(PKEY_PNPX_ID, %ws) failed, hr = 0x%08X",
wszDevicePath, hr));
}
}
if (SUCCEEDED(hr))
{
//
// Execute the query to obtain the unique Function Instance object that identifies our device that is described by wszDevicePath
//
hr = pfiCollectionQuery->Execute(&pfiCollection);
if ((SUCCEEDED(hr)) && (!pfiCollection))
{
hr = E_POINTER;
WIAS_ERROR((g_hInst,
"IFunctionInstanceCollectionQuery::Execute returned a NULL IFunctionInstanceCollection* for %ws, hr = 0x%08X",
wszDevicePath, hr));
}
if (FAILED(hr))
{
WIAS_ERROR((g_hInst, "IFunctionInstanceCollectionQuery::Execute for DevicePath %ws failed, hr = 0x%08X",
wszDevicePath, hr));
}
}
if (SUCCEEDED(hr))
{
//
// Retrieve the unique Function Instance object that identifies our device
//
// Note that after the IFunctionDiscovery::CreateInstanceCollectionQuery constraint
// the collection must contain a single element, accessible by pfiCollection->Item(0).
//
// Without the query constraint, we must search for the Function Instance that corresponds
// to our wszDevicePath in the entire collection, using pfiCollection->Count and pfiCollection->Item...
//
// See the IFunctionInstanceCollection interface that is defined in FunctionDiscoveryAPI.idl
//
// interface IFunctionInstanceCollection : IUnknown
// {
// HRESULT GetCount(
// [out, retval] DWORD * pdwCount);
//
// HRESULT Item(
// [in] DWORD dwIndex,
// [out, retval] IFunctionInstance ** ppFunctionInstance);
// };
//
//
hr = pfiCollection->Item(0, &m_pFunctionInstance);
if ((SUCCEEDED(hr)) && (!m_pFunctionInstance))
{
WIAS_ERROR((g_hInst, "IFunctionInstanceCollection.Item(0) returned a NULL IFunctionInstance* for %ws with hr = 0x%08X",
wszDevicePath, hr));
hr = E_POINTER;
}
if (FAILED(hr))
{
WIAS_ERROR((g_hInst, "IFunctionInstanceCollection.Item(0) for %ws failed, hr = 0x%08X", wszDevicePath, hr));
}
}
if (pfiCollection)
{
pfiCollection->Release();
pfiCollection = NULL;
}
if (pfiCollectionQuery)
{
pfiCollectionQuery->Release();
pfiCollectionQuery = NULL;
}
if (SUCCEEDED(hr))
{
WIAS_TRACE((g_hInst, "Device interface successfully initialized", hr));
}
if (SUCCEEDED(hr))
{
m_bInitialized = TRUE;
}
else
{
UnInitialize();
}
return hr;
}
/**************************************************************************\
* CWSDDevice::UnInitializeConnection
*
* Uninitializes the connection to the web services scanner device
* through Function Discovery.
*
* Arguments:
*
* none
*
* Return Value:
*
* S_OK if successful, an error HRESULT otherwise
*
\**************************************************************************/
HRESULT CWSDDevice::UnInitializeConnection()
{
HRESULT hr = S_OK;
WIAS_TRACE((g_hInst, "Shutting down the current device connection, if any.."));
//
// Release Function Discovery COM interfaces:
//
if (m_pFunctionInstance)
{
m_pFunctionInstance->Release();
m_pFunctionInstance = NULL;
}
if (m_pFunctionDiscovery)
{
m_pFunctionDiscovery->Release();
m_pFunctionDiscovery = NULL;
}
m_bInitialized = FALSE;
return hr;
}
/**************************************************************************\
* CWSDDevice::CWSDDevice
*
* Constructor for the CWSDDevice class that encapsulates the communication
* interface to the web services-compliant scanner image acquisition device
*
* Arguments:
*
* None
*
* Return Value:
*
* None
*
\**************************************************************************/
CWSDDevice::CWSDDevice()
{
m_pFunctionDiscovery = NULL;
m_pFunctionInstance = NULL;
m_bInitialized = FALSE;
return;
}
/**************************************************************************\
* CWSDDevice::~CWSDDevice
*
* Destructor for the CWSDDevice class that encapsulates the communication
* interface to the web services-compliant scanner image acquisition device
*
* Arguments:
*
* None
*
* Return Value:
*
* None
*
\**************************************************************************/
CWSDDevice::~CWSDDevice()
{
UnInitializeConnection();
return;
};