列舉 WPD) (裝置
大部分應用程式完成的第一項工作是連線到電腦的裝置列舉。 IPortableDeviceManager介面支援這項工作,以及擷取裝置資訊 (,例如製造商、易記名稱和描述) 。
DeviceEnumeration.cpp 模組中的 EnumerateAllDevices 函式包含可示範擷取已連線裝置計數的程式碼,一旦擷取計數,就會擷取每個連線裝置的裝置特定資訊。
EnumerateAllDevices 函式會完成四個主要工作:
- 建立可攜式裝置管理員物件。
- 擷取已連線裝置的計數。
- 擷取已連線裝置) 的裝置資訊 (。
- 釋放擷取裝置資訊時所使用的記憶體。
下列各節將詳細說明這四項工作。
裝置列舉程式的第一個步驟是建立可攜式裝置管理員物件。 這是藉由呼叫 CoCreateInstance 函式,並傳遞類別識別碼 (CLSID) 物件、指定程式碼將執行的內容、指定 IPortableDeviceManager 介面的參考識別碼,然後提供接收 IPortableDeviceManager 介面指標的指標變數。
HRESULT hr = CoCreateInstance(CLSID_PortableDeviceManager,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pPortableDeviceManager));
if (FAILED(hr))
{
printf("! Failed to CoCreateInstance CLSID_PortableDeviceManager, hr = 0x%lx\n",hr);
}
一旦您取得 IPortableDeviceManager 介面指標,就可以開始在此介面上呼叫方法。 EnumerateAllDevices 函式中呼叫的第一個方法是 IPortableDeviceManager::GetDevices。 呼叫此方法時,第一個引數設定為 Null時,會傳回已連線裝置的計數。
if (SUCCEEDED(hr))
{
hr = pPortableDeviceManager->GetDevices(NULL, &cPnPDeviceIDs);
if (FAILED(hr))
{
printf("! Failed to get number of devices on the system, hr = 0x%lx\n",hr);
}
}
// Report the number of devices found. NOTE: we will report 0, if an error
// occured.
printf("\n%d Windows Portable Device(s) found on the system\n\n", cPnPDeviceIDs);
擷取連線裝置計數之後,您可以使用此值來擷取每個連線裝置的裝置資訊。 此程式一開始會傳遞字串指標陣列做為第一個引數,以及此陣列可保留為第二個引數的專案計數, (此計數至少應等於可用裝置數目) 。
這個方法所傳回的字串是連線裝置隨插即用名稱。 接著,這些名稱會傳遞至 IPortableDeviceManager 介面上的其他方法,以擷取裝置特定資訊,例如易記名稱、製造商的名稱和裝置描述。 (當應用程式呼叫 IPortableDevice::Open 方法..) 時,也會使用這些名稱來開啟裝置的連線
if (SUCCEEDED(hr) && (cPnPDeviceIDs > 0))
{
pPnpDeviceIDs = new (std::nothrow) PWSTR[cPnPDeviceIDs];
if (pPnpDeviceIDs != NULL)
{
DWORD dwIndex = 0;
hr = pPortableDeviceManager->GetDevices(pPnpDeviceIDs, &cPnPDeviceIDs);
if (SUCCEEDED(hr))
{
// For each device found, display the devices friendly name,
// manufacturer, and description strings.
for (dwIndex = 0; dwIndex < cPnPDeviceIDs; dwIndex++)
{
printf("[%d] ", dwIndex);
DisplayFriendlyName(pPortableDeviceManager, pPnpDeviceIDs[dwIndex]);
printf(" ");
DisplayManufacturer(pPortableDeviceManager, pPnpDeviceIDs[dwIndex]);
printf(" ");
DisplayDescription(pPortableDeviceManager, pPnpDeviceIDs[dwIndex]);
}
}
else
{
printf("! Failed to get the device list from the system, hr = 0x%lx\n",hr);
}
擷取裝置資訊之後,您必須釋放與字串指標陣列所指向之字串相關聯的記憶體。 您也需要刪除此陣列。
for (dwIndex = 0; dwIndex < cPnPDeviceIDs; dwIndex++)
{
CoTaskMemFree(pPnpDeviceIDs[dwIndex]);
pPnpDeviceIDs[dwIndex] = NULL;
}
// Delete the array of PWSTR pointers
delete [] pPnpDeviceIDs;
pPnpDeviceIDs = NULL;
相關主題