IPortableDeviceServiceManager::GetDeviceServices 方法 (portabledeviceapi.h)
GetDeviceServices 方法會擷取與指定裝置相關聯的服務清單。
語法
HRESULT GetDeviceServices(
[in] LPCWSTR pszPnPDeviceID,
[in] REFGUID guidServiceCategory,
[in, out] LPWSTR *pServices,
[in, out] DWORD *pcServices
);
參數
[in] pszPnPDeviceID
裝置的 隨插即用 (PnP) 識別碼。
[in] guidServiceCategory
指定要擷取之服務類別之全域唯一標識碼的參考 (GUID) 。 如果參考的標識碼 GUID_DEVINTERFACE_WPD_SERVICE,此方法會擷取裝置支援的所有服務。
[in, out] pServices
使用者配置的字串指標數位。 當方法傳回時,陣列會包含擷取的 PnP 服務標識碼。
[in, out] pcServices
pServices 參數所指定數位中的項目數目。 這個值代表將擷取的服務標識碼數目上限。 當方法傳回時,此參數會包含實際擷取的標識碼數目。
傳回值
方法會傳回 HRESULT。 可能的值包括 (但不限於) 下表中的這些值。
傳回碼 | 描述 |
---|---|
|
此方法已成功。 |
|
pServices 參數所參考的陣列太小,無法包含所有服務。 |
|
pcServices 參數為 NULL。 |
備註
如果此方法成功,應用程式應該呼叫 FreePortableDevicePnPIDs 函式,以釋放 pServices 參數所參考的數位。
應用程式可以藉由呼叫 IPortableDeviceManager::GetDevices 方法來擷取裝置的 PnP 識別碼。
使用單個線程 Apartments 的應用程式應該使用 CLSID_PortableDeviceServiceFTM ,因為這樣可消除介面指標封送處理的額外負荷。 舊 版應用程式仍支援CLSID_PortableDeviceService。
範例
下列範例示範如何擷取所有裝置的服務清單。
#include "stdafx.h"
#include "atlbase.h"
#include "portabledeviceapi.h"
#include "portabledevice.h"
HRESULT GetServiceName( LPCWSTR pszPnpServiceID, LPWSTR* ppszServiceName);
HRESULT EnumerateServicesForDevice(
IPortableDeviceServiceManager* pPortableDeviceServiceManager,
LPCWSTR pszPnpDeviceID);
int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hr = S_OK;
DWORD cPnPDeviceIDs = 0;
LPWSTR* pPnpDeviceIDs = NULL;
CComPtr<IPortableDeviceManager> pPortableDeviceManager;
CComPtr<IPortableDeviceServiceManager> pPortableDeviceServiceManager;
// Initialize COM for COINIT_MULTITHREADED
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
// CoCreate the IPortableDeviceManager interface to enumerate
// portable devices and to get information about them.
if (hr == S_OK)
{
hr = CoCreateInstance(CLSID_PortableDeviceManager,
NULL,
CLSCTX_INPROC_SERVER,
IID_IPortableDeviceManager,
(VOID**) &pPortableDeviceManager);
}
if (hr == S_OK)
{
// Get the PortableDeviceServiceManager interface
// by calling QueryInterface from IPortableDeviceManager
hr = pPortableDeviceManager->QueryInterface
(IID_IPortableDeviceServiceManager,
(VOID**) &pPortableDeviceServiceManager);
}
// Get the number of devices on the system
if (hr == S_OK)
{
hr = pPortableDeviceManager->GetDevices(NULL, &cPnPDeviceIDs);
}
// If we have at least 1 device,
// continue to query the list of services for each device
if ((hr == S_OK) && (cPnPDeviceIDs > 0))
{
pPnpDeviceIDs = new LPWSTR[cPnPDeviceIDs];
if (pPnpDeviceIDs != NULL)
{
hr = pPortableDeviceManager->GetDevices
(pPnpDeviceIDs, &cPnPDeviceIDs);
if (SUCCEEDED(hr))
{
for (DWORD dwIndex = 0; dwIndex < cPnPDeviceIDs; dwIndex++)
{
hr = EnumerateServicesForDevice
(pPortableDeviceServiceManager, pPnpDeviceIDs[dwIndex]);
}
}
// Free all returned PnPDeviceID strings
FreePortableDevicePnPIDs(pPnpDeviceIDs, cPnPDeviceIDs);
// Delete the array of LPWSTR pointers
delete [] pPnpDeviceIDs;
pPnpDeviceIDs = NULL;
}
}
return 0;
}
HRESULT EnumerateServicesForDevice(
IPortableDeviceServiceManager* pPortableDeviceServiceManager,
LPCWSTR pszPnpDeviceID)
{
HRESULT hr = S_OK;
DWORD cPnpServiceIDs = 0;
LPWSTR* pPnpServiceIDs = NULL;
if (pPortableDeviceServiceManager == NULL)
{
return E_POINTER;
}
// Get the number of services for the device
if (hr == S_OK)
{
hr = pPortableDeviceServiceManager->GetDeviceServices(
pszPnpDeviceID,
GUID_DEVINTERFACE_WPD_SERVICE, NULL, &cPnpServiceIDs);
}
// If we have at least 1, continue to gather information about
// each service and populate the device information array.
if ((hr == S_OK) && (cPnpServiceIDs > 0))
{
pPnpServiceIDs = new LPWSTR[cPnpServiceIDs];
if (pPnpServiceIDs != NULL)
{
// Get a list of all services on the given device.
// To query a give type of service (e.g. the Contacts Service),
// a service GUID can be provided here instead of
// GUID_DEVINTERFACE_WPD_SERVICE which returns all services
DWORD dwIndex = 0;
hr = pPortableDeviceServiceManager->GetDeviceServices
(pszPnpDeviceID, GUID_DEVINTERFACE_WPD_SERVICE,
pPnpServiceIDs, &cPnpServiceIDs);
if (SUCCEEDED(hr))
{
// For each service found, read the name property
for (dwIndex = 0; dwIndex < cPnpServiceIDs && SUCCEEDED(hr);
dwIndex++)
{
LPWSTR pszServiceName = NULL;
hr = GetServiceName(pPnpServiceIDs[dwIndex],
&pszServiceName);
CoTaskMemFree(pszServiceName);
}
}
FreePortableDevicePnPIDs(pPnpServiceIDs, cPnpServiceIDs);
// Delete the array of LPWSTR pointers
delete [] pPnpServiceIDs;
pPnpServiceIDs = NULL;
}
}
}
HRESULT GetServiceName( LPCWSTR pszPnpServiceID,
LPWSTR* ppszServiceName)
{
HRESULT hr = S_OK;
LPWSTR pszServiceID = NULL;
LPWSTR pszServiceObjectID = NULL;
CComPtr<IPortableDeviceValues> pClientInfo;
CComPtr<IPortableDeviceValues> pPropertyValues;
CComPtr<IPortableDeviceService> pService;
CComPtr<IPortableDeviceContent2> pContent;
CComPtr<IPortableDeviceProperties>pProperties;
CComPtr<IPortableDeviceKeyCollection> pPropertiesToRead;
hr = CoCreateInstance(CLSID_PortableDeviceServiceFTM,
NULL,
CLSCTX_INPROC_SERVER,
IID_IPortableDeviceService,
(VOID**) &pService);
if (hr == S_OK)
{
// CoCreate an IPortableDeviceValues interface
// to hold the client information.
hr = CoCreateInstance(CLSID_PortableDeviceValues,
NULL,
CLSCTX_INPROC_SERVER,
IID_IPortableDeviceValues,
(VOID**) & pClientInfo);
if ((hr == S_OK) && (pClientInfo!= NULL))
{
hr = pClientInfo->SetStringValue
(WPD_CLIENT_NAME, L"Service Sample Application");
if (hr == S_OK)
{
hr = pClientInfo->SetUnsignedIntegerValue(
WPD_CLIENT_MAJOR_VERSION, 1);
}
if (hr == S_OK)
{
hr = pClientInfo->SetUnsignedIntegerValue(
WPD_CLIENT_MINOR_VERSION, 0);
}
if (hr == S_OK)
{
hr = pClientInfo->SetUnsignedIntegerValue(
WPD_CLIENT_REVISION, 0);
}
if (hr == S_OK)
{
hr = pClientInfo->SetUnsignedIntegerValue(
WPD_CLIENT_SECURITY_QUALITY_OF_SERVICE,
SECURITY_IMPERSONATION);
}
if (hr == S_OK)
{
// Open a connection to the service
hr = pService->Open(pszPnpServiceID,
pClientInfo);
}
if (hr == S_OK)
{
hr = pService->GetServiceObjectID(&pszServiceID);
}
if (hr == S_OK)
{
hr = pService->Content(&pContent);
}
if (hr == S_OK)
{
hr = pContent->Properties(&pProperties);
}
// Create a IPortableDeviceKeyCollection
// containing the single PROPERTYKEY
if (hr == S_OK)
{
hr = CoCreateInstance(CLSID_PortableDeviceKeyCollection,
NULL,
CLSCTX_INPROC_SERVER,
IID_IPortableDeviceKeyCollection,
(VOID**) &pPropertiesToRead);
}
// Add our property key
if (hr == S_OK)
{
hr = pPropertiesToRead->Add(WPD_OBJECT_NAME);
}
if (hr == S_OK)
{
hr = pProperties->GetValues(
pszServiceID,
pPropertiesToRead, &pPropertyValues);
}
if (hr == S_OK)
{
hr = pPropertyValues->GetStringValue(
WPD_OBJECT_NAME, ppszServiceName);
}
CoTaskMemFree(pszServiceObjectID);
return hr;
}
}
}
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows 7 [傳統型應用程式 |UWP 應用程式] |
最低支援的伺服器 | 都不支援 |
目標平台 | Windows |
標頭 | portabledeviceapi.h |
另請參閱