Instantiating the WPD Automation Factory Interface

WPD Automation can be instantiated from C++/COM by CoCreating IPortableDeviceDispatchFactory and calling IPortableDeviceDispatchFactory::GetDeviceDispatch, supplying a Device Plug and Play (PnP) identifier. The DevicePnPId is a string that represents a WPD device, and is returned by the IPortableDeviceManager::GetDevices method in the WPD C++/COM API.

The following example shows how to instantiate and return a WPD Automation Device object. The code can be wrapped in an IDispatch method for an ActiveX object that is accessible from JScript.

IFACEMETHODIMP CMyDeviceFactory::GetFirstDeviceObject(IDispatch** ppDeviceObject)
    ComPtr<IPortableDeviceManager> spDeviceManager;

    HRESULT hr = CoCreateInstance(CLSID_PortableDeviceManager, 

    if (SUCCEEDED(hr))
        // For simplicity, the following code sample retrieves the first 
        // device, if available.

        LPWSTR pszDevicePnPID = NULL;
        DWORD cDevices = 1;
        hr = spDeviceManager->GetDevices(pszDevicePnPID, &cDevices);

        if (SUCCEEDED(hr) && cDevices > 0)
            CComPtr<IPortableDeviceDispatchFactory> spDeviceDispatchFactory;
            hr = CoCreateInstance(CLSID_PortableDeviceDispatchFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&spDeviceDispatchFactory));

            if (SUCCEEDED(hr))
                hr = spDeviceDispatchFactory->GetDeviceDispatch(pszDevicePnPID, ppDeviceObject);


    return hr;

The following example shows how to instantiate a Device object from JScript by calling CMyDeviceFactory through IDispatch.

var deviceFactory = new ActiveXObject("MyControl.MyDeviceFactory");

// Get the first device object from the device factory
var deviceObject = deviceFactory.GetFirstDeviceObject();

Related topics

About the Device Object
Best Practices for Writing WPD Automation Scripts
IPortableDeviceDispatchFactory Interface
Using WPD Automation
Windows Portable Devices Programming Reference



Community Additions