Bagikan melalui


Menghitung perangkat (WPD)

Tugas pertama yang diselesaikan oleh sebagian besar aplikasi adalah enumerasi perangkat yang terhubung ke komputer. Tugas ini, dan pengambilan informasi perangkat (seperti produsen, nama yang mudah diingat, dan deskripsi), didukung oleh antarmuka IPortableDeviceManager .

Fungsi EnumerateAllDevices dalam modul DeviceEnumeration.cpp berisi kode yang menunjukkan pengambilan jumlah perangkat yang terhubung dan, setelah hitungan diambil, pengambilan informasi khusus perangkat untuk setiap perangkat yang terhubung.

Fungsi EnumerateAllDevices menyelesaikan empat tugas utama:

  1. Membuat objek manajer perangkat portabel.
  2. Mengambil hitungan perangkat yang terhubung.
  3. Mengambil informasi perangkat (untuk perangkat yang terhubung).
  4. Membebaskan memori yang digunakan saat mengambil informasi perangkat.

Masing-masing dari keempat tugas ini dijelaskan secara lebih rinci di bagian berikut.

Langkah pertama dalam proses enumerasi perangkat adalah pembuatan objek manajer perangkat portabel. Ini dilakukan dengan memanggil fungsi CoCreateInstance dan meneruskan pengidentifikasi kelas (CLSID) untuk objek , menentukan konteks di mana kode akan berjalan, menentukan pengidentifikasi referensi untuk antarmuka IPortableDeviceManager, dan kemudian menyediakan variabel pointer yang menerima penunjuk antarmuka 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);
}

Setelah Anda mendapatkan penunjuk antarmuka IPortableDeviceManager , Anda dapat mulai memanggil metode pada antarmuka ini. Metode pertama yang disebut dalam fungsi EnumerateAllDevices adalah IPortableDeviceManager::GetDevices. Ketika metode ini dipanggil dengan argumen pertama yang diatur ke NULL, metode ini mengembalikan jumlah perangkat yang terhubung.

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);

Setelah mengambil jumlah perangkat yang terhubung, Anda dapat menggunakan nilai ini untuk mengambil informasi perangkat untuk setiap perangkat yang terhubung. Proses ini dimulai dengan meneruskan array penunjuk string sebagai argumen pertama dan hitungan jumlah elemen yang dapat ditahan array ini sebagai argumen kedua (jumlah ini setidaknya harus sama dengan jumlah perangkat yang tersedia).

String yang dikembalikan oleh metode ini adalah nama Plug and Play dari perangkat yang terhubung. Nama-nama ini, pada gilirannya, diteruskan ke metode lain pada antarmuka IPortableDeviceManager untuk mengambil informasi khusus perangkat seperti nama yang mudah diingat, nama produsen, dan deskripsi perangkat. (Nama-nama ini juga digunakan untuk membuka koneksi ke perangkat ketika aplikasi memanggil metode 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);
        }

Setelah Anda mengambil informasi perangkat, Anda harus membebaskan memori yang terkait dengan string yang ditujukkan oleh array penunjuk string. Anda juga perlu menghapus array ini.

for (dwIndex = 0; dwIndex < cPnPDeviceIDs; dwIndex++)
{
    CoTaskMemFree(pPnpDeviceIDs[dwIndex]);
    pPnpDeviceIDs[dwIndex] = NULL;
}

// Delete the array of PWSTR pointers
delete [] pPnpDeviceIDs;
pPnpDeviceIDs = NULL;

Antarmuka IPortableDeviceManager

Panduan Pemrograman