共用方式為


列舉 WPD) (裝置

大部分應用程式完成的第一項工作是連線到電腦的裝置列舉。 IPortableDeviceManager介面支援這項工作,以及擷取裝置資訊 (,例如製造商、易記名稱和描述) 。

DeviceEnumeration.cpp 模組中的 EnumerateAllDevices 函式包含可示範擷取已連線裝置計數的程式碼,一旦擷取計數,就會擷取每個連線裝置的裝置特定資訊。

EnumerateAllDevices 函式會完成四個主要工作:

  1. 建立可攜式裝置管理員物件。
  2. 擷取已連線裝置的計數。
  3. 擷取已連線裝置) 的裝置資訊 (。
  4. 釋放擷取裝置資訊時所使用的記憶體。

下列各節將詳細說明這四項工作。

裝置列舉程式的第一個步驟是建立可攜式裝置管理員物件。 這是藉由呼叫 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;

IPortableDeviceManager 介面

程式設計指南