Search code examples
c++windowswinapidevice-driverdevice-manager

IPortableDeviceManager::GetDevices returning 0 Devices


I'm currently writing a simple application to retrieve a list of the PnP devices of my computer. To do this, I'm making use of the Windows PortableDeviceApi Library.

So far I have the following code:

#include <iostream>
#include <PortableDeviceApi.h>
#include <wrl.h>

inline void getDeviceHWIDs() {

    // Initialize
    CoInitialize(nullptr);

    // create portable device manager object
    Microsoft::WRL::ComPtr<IPortableDeviceManager> device_manager;
    HRESULT hr = CoCreateInstance(CLSID_PortableDeviceManager,
        nullptr,
        CLSCTX_INPROC_SERVER,
        IID_PPV_ARGS(&device_manager));

    if (FAILED(hr)) {
        std::cout << "! Failed to CoCreateInstance CLSID_PortableDeviceManager, hr = " << std::hex << hr << std::endl;
    }

    // obtain amount of devices
    DWORD pnp_device_id_count = 0;
    if (SUCCEEDED(hr)) {
        hr = device_manager->GetDevices(nullptr, &pnp_device_id_count);

        if (FAILED(hr)) {
            std::cout << "! Failed to get number of devices on the system, hr = " << std::hex << hr << std::endl;
        }
    }

    std::cout << "Devices found: " << pnp_device_id_count << std::endl; 

    // Uninitialize
    CoUninitialize();
}

The code compiles and runs successfully, however pnp_device_id_count is returning 0, indicating that there are no PnP devices connected to my computer. This is obviously an incorrect result, since Get-PnpDevice in PowerShell returns a large list of devices.

Any help would be much appreciated, as I'm a bit stumped over this ':(

Thank you :)


Solution

  • This is expected, Windows Portable Devices provides only a way to communicate with music players, storage devices, mobile phones, cameras, and many other types of connected devices.

    It will not enumerate all devices on your system. Connect an IPhone and you will see pnp_device_id_count become 1.

    To enumerate all devices you can use WinRT's Windows.Devices.Enumeration Namespace or the ancient Setup API.

    Here is a (C# but you can do the same with C++) sample for using WinRT's one https://github.com/smourier/DeviceExplorer and a C++ sample for using Setup API: https://www.codeproject.com/Articles/14412/Enumerating-windows-device