/*** Autogenerated by WIDL 9.8 from include/portabledeviceapi.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __portabledeviceapi_h__
#define __portabledeviceapi_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef __IPortableDeviceManager_FWD_DEFINED__
#define __IPortableDeviceManager_FWD_DEFINED__
typedef interface IPortableDeviceManager IPortableDeviceManager;
#ifdef __cplusplus
interface IPortableDeviceManager;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDevice_FWD_DEFINED__
#define __IPortableDevice_FWD_DEFINED__
typedef interface IPortableDevice IPortableDevice;
#ifdef __cplusplus
interface IPortableDevice;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceContent_FWD_DEFINED__
#define __IPortableDeviceContent_FWD_DEFINED__
typedef interface IPortableDeviceContent IPortableDeviceContent;
#ifdef __cplusplus
interface IPortableDeviceContent;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceContent2_FWD_DEFINED__
#define __IPortableDeviceContent2_FWD_DEFINED__
typedef interface IPortableDeviceContent2 IPortableDeviceContent2;
#ifdef __cplusplus
interface IPortableDeviceContent2;
#endif /* __cplusplus */
#endif

#ifndef __IEnumPortableDeviceObjectIDs_FWD_DEFINED__
#define __IEnumPortableDeviceObjectIDs_FWD_DEFINED__
typedef interface IEnumPortableDeviceObjectIDs IEnumPortableDeviceObjectIDs;
#ifdef __cplusplus
interface IEnumPortableDeviceObjectIDs;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceProperties_FWD_DEFINED__
#define __IPortableDeviceProperties_FWD_DEFINED__
typedef interface IPortableDeviceProperties IPortableDeviceProperties;
#ifdef __cplusplus
interface IPortableDeviceProperties;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceResources_FWD_DEFINED__
#define __IPortableDeviceResources_FWD_DEFINED__
typedef interface IPortableDeviceResources IPortableDeviceResources;
#ifdef __cplusplus
interface IPortableDeviceResources;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceCapabilities_FWD_DEFINED__
#define __IPortableDeviceCapabilities_FWD_DEFINED__
typedef interface IPortableDeviceCapabilities IPortableDeviceCapabilities;
#ifdef __cplusplus
interface IPortableDeviceCapabilities;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceEventCallback_FWD_DEFINED__
#define __IPortableDeviceEventCallback_FWD_DEFINED__
typedef interface IPortableDeviceEventCallback IPortableDeviceEventCallback;
#ifdef __cplusplus
interface IPortableDeviceEventCallback;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceDataStream_FWD_DEFINED__
#define __IPortableDeviceDataStream_FWD_DEFINED__
typedef interface IPortableDeviceDataStream IPortableDeviceDataStream;
#ifdef __cplusplus
interface IPortableDeviceDataStream;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceUnitsStream_FWD_DEFINED__
#define __IPortableDeviceUnitsStream_FWD_DEFINED__
typedef interface IPortableDeviceUnitsStream IPortableDeviceUnitsStream;
#ifdef __cplusplus
interface IPortableDeviceUnitsStream;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDevicePropertiesBulk_FWD_DEFINED__
#define __IPortableDevicePropertiesBulk_FWD_DEFINED__
typedef interface IPortableDevicePropertiesBulk IPortableDevicePropertiesBulk;
#ifdef __cplusplus
interface IPortableDevicePropertiesBulk;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDevicePropertiesBulkCallback_FWD_DEFINED__
#define __IPortableDevicePropertiesBulkCallback_FWD_DEFINED__
typedef interface IPortableDevicePropertiesBulkCallback IPortableDevicePropertiesBulkCallback;
#ifdef __cplusplus
interface IPortableDevicePropertiesBulkCallback;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceServiceManager_FWD_DEFINED__
#define __IPortableDeviceServiceManager_FWD_DEFINED__
typedef interface IPortableDeviceServiceManager IPortableDeviceServiceManager;
#ifdef __cplusplus
interface IPortableDeviceServiceManager;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceService_FWD_DEFINED__
#define __IPortableDeviceService_FWD_DEFINED__
typedef interface IPortableDeviceService IPortableDeviceService;
#ifdef __cplusplus
interface IPortableDeviceService;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceServiceCapabilities_FWD_DEFINED__
#define __IPortableDeviceServiceCapabilities_FWD_DEFINED__
typedef interface IPortableDeviceServiceCapabilities IPortableDeviceServiceCapabilities;
#ifdef __cplusplus
interface IPortableDeviceServiceCapabilities;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceServiceMethods_FWD_DEFINED__
#define __IPortableDeviceServiceMethods_FWD_DEFINED__
typedef interface IPortableDeviceServiceMethods IPortableDeviceServiceMethods;
#ifdef __cplusplus
interface IPortableDeviceServiceMethods;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceServiceMethodCallback_FWD_DEFINED__
#define __IPortableDeviceServiceMethodCallback_FWD_DEFINED__
typedef interface IPortableDeviceServiceMethodCallback IPortableDeviceServiceMethodCallback;
#ifdef __cplusplus
interface IPortableDeviceServiceMethodCallback;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceServiceActivation_FWD_DEFINED__
#define __IPortableDeviceServiceActivation_FWD_DEFINED__
typedef interface IPortableDeviceServiceActivation IPortableDeviceServiceActivation;
#ifdef __cplusplus
interface IPortableDeviceServiceActivation;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceServiceOpenCallback_FWD_DEFINED__
#define __IPortableDeviceServiceOpenCallback_FWD_DEFINED__
typedef interface IPortableDeviceServiceOpenCallback IPortableDeviceServiceOpenCallback;
#ifdef __cplusplus
interface IPortableDeviceServiceOpenCallback;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceDispatchFactory_FWD_DEFINED__
#define __IPortableDeviceDispatchFactory_FWD_DEFINED__
typedef interface IPortableDeviceDispatchFactory IPortableDeviceDispatchFactory;
#ifdef __cplusplus
interface IPortableDeviceDispatchFactory;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceWebControl_FWD_DEFINED__
#define __IPortableDeviceWebControl_FWD_DEFINED__
typedef interface IPortableDeviceWebControl IPortableDeviceWebControl;
#ifdef __cplusplus
interface IPortableDeviceWebControl;
#endif /* __cplusplus */
#endif

#ifndef __PortableDevice_FWD_DEFINED__
#define __PortableDevice_FWD_DEFINED__
#ifdef __cplusplus
typedef class PortableDevice PortableDevice;
#else
typedef struct PortableDevice PortableDevice;
#endif /* defined __cplusplus */
#endif /* defined __PortableDevice_FWD_DEFINED__ */

#ifndef __PortableDeviceManager_FWD_DEFINED__
#define __PortableDeviceManager_FWD_DEFINED__
#ifdef __cplusplus
typedef class PortableDeviceManager PortableDeviceManager;
#else
typedef struct PortableDeviceManager PortableDeviceManager;
#endif /* defined __cplusplus */
#endif /* defined __PortableDeviceManager_FWD_DEFINED__ */

#ifndef __PortableDeviceService_FWD_DEFINED__
#define __PortableDeviceService_FWD_DEFINED__
#ifdef __cplusplus
typedef class PortableDeviceService PortableDeviceService;
#else
typedef struct PortableDeviceService PortableDeviceService;
#endif /* defined __cplusplus */
#endif /* defined __PortableDeviceService_FWD_DEFINED__ */

#ifndef __PortableDeviceDispatchFactory_FWD_DEFINED__
#define __PortableDeviceDispatchFactory_FWD_DEFINED__
#ifdef __cplusplus
typedef class PortableDeviceDispatchFactory PortableDeviceDispatchFactory;
#else
typedef struct PortableDeviceDispatchFactory PortableDeviceDispatchFactory;
#endif /* defined __cplusplus */
#endif /* defined __PortableDeviceDispatchFactory_FWD_DEFINED__ */

#ifndef __PortableDeviceFTM_FWD_DEFINED__
#define __PortableDeviceFTM_FWD_DEFINED__
#ifdef __cplusplus
typedef class PortableDeviceFTM PortableDeviceFTM;
#else
typedef struct PortableDeviceFTM PortableDeviceFTM;
#endif /* defined __cplusplus */
#endif /* defined __PortableDeviceFTM_FWD_DEFINED__ */

#ifndef __PortableDeviceServiceFTM_FWD_DEFINED__
#define __PortableDeviceServiceFTM_FWD_DEFINED__
#ifdef __cplusplus
typedef class PortableDeviceServiceFTM PortableDeviceServiceFTM;
#else
typedef struct PortableDeviceServiceFTM PortableDeviceServiceFTM;
#endif /* defined __cplusplus */
#endif /* defined __PortableDeviceServiceFTM_FWD_DEFINED__ */

#ifndef __PortableDeviceWebControl_FWD_DEFINED__
#define __PortableDeviceWebControl_FWD_DEFINED__
#ifdef __cplusplus
typedef class PortableDeviceWebControl PortableDeviceWebControl;
#else
typedef struct PortableDeviceWebControl PortableDeviceWebControl;
#endif /* defined __cplusplus */
#endif /* defined __PortableDeviceWebControl_FWD_DEFINED__ */

/* Headers for imported files */

#include <propidl.h>
#include <wtypes.h>
#include <portabledevicetypes.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __IPortableDeviceManager_FWD_DEFINED__
#define __IPortableDeviceManager_FWD_DEFINED__
typedef interface IPortableDeviceManager IPortableDeviceManager;
#ifdef __cplusplus
interface IPortableDeviceManager;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDevice_FWD_DEFINED__
#define __IPortableDevice_FWD_DEFINED__
typedef interface IPortableDevice IPortableDevice;
#ifdef __cplusplus
interface IPortableDevice;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceContent_FWD_DEFINED__
#define __IPortableDeviceContent_FWD_DEFINED__
typedef interface IPortableDeviceContent IPortableDeviceContent;
#ifdef __cplusplus
interface IPortableDeviceContent;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceContent2_FWD_DEFINED__
#define __IPortableDeviceContent2_FWD_DEFINED__
typedef interface IPortableDeviceContent2 IPortableDeviceContent2;
#ifdef __cplusplus
interface IPortableDeviceContent2;
#endif /* __cplusplus */
#endif

#ifndef __IEnumPortableDeviceObjectIDs_FWD_DEFINED__
#define __IEnumPortableDeviceObjectIDs_FWD_DEFINED__
typedef interface IEnumPortableDeviceObjectIDs IEnumPortableDeviceObjectIDs;
#ifdef __cplusplus
interface IEnumPortableDeviceObjectIDs;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceProperties_FWD_DEFINED__
#define __IPortableDeviceProperties_FWD_DEFINED__
typedef interface IPortableDeviceProperties IPortableDeviceProperties;
#ifdef __cplusplus
interface IPortableDeviceProperties;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceResources_FWD_DEFINED__
#define __IPortableDeviceResources_FWD_DEFINED__
typedef interface IPortableDeviceResources IPortableDeviceResources;
#ifdef __cplusplus
interface IPortableDeviceResources;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceCapabilities_FWD_DEFINED__
#define __IPortableDeviceCapabilities_FWD_DEFINED__
typedef interface IPortableDeviceCapabilities IPortableDeviceCapabilities;
#ifdef __cplusplus
interface IPortableDeviceCapabilities;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceEventCallback_FWD_DEFINED__
#define __IPortableDeviceEventCallback_FWD_DEFINED__
typedef interface IPortableDeviceEventCallback IPortableDeviceEventCallback;
#ifdef __cplusplus
interface IPortableDeviceEventCallback;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceDataStream_FWD_DEFINED__
#define __IPortableDeviceDataStream_FWD_DEFINED__
typedef interface IPortableDeviceDataStream IPortableDeviceDataStream;
#ifdef __cplusplus
interface IPortableDeviceDataStream;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDevicePropertiesBulk_FWD_DEFINED__
#define __IPortableDevicePropertiesBulk_FWD_DEFINED__
typedef interface IPortableDevicePropertiesBulk IPortableDevicePropertiesBulk;
#ifdef __cplusplus
interface IPortableDevicePropertiesBulk;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDevicePropertiesBulkCallback_FWD_DEFINED__
#define __IPortableDevicePropertiesBulkCallback_FWD_DEFINED__
typedef interface IPortableDevicePropertiesBulkCallback IPortableDevicePropertiesBulkCallback;
#ifdef __cplusplus
interface IPortableDevicePropertiesBulkCallback;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceServiceManager_FWD_DEFINED__
#define __IPortableDeviceServiceManager_FWD_DEFINED__
typedef interface IPortableDeviceServiceManager IPortableDeviceServiceManager;
#ifdef __cplusplus
interface IPortableDeviceServiceManager;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceService_FWD_DEFINED__
#define __IPortableDeviceService_FWD_DEFINED__
typedef interface IPortableDeviceService IPortableDeviceService;
#ifdef __cplusplus
interface IPortableDeviceService;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceServiceCapabilities_FWD_DEFINED__
#define __IPortableDeviceServiceCapabilities_FWD_DEFINED__
typedef interface IPortableDeviceServiceCapabilities IPortableDeviceServiceCapabilities;
#ifdef __cplusplus
interface IPortableDeviceServiceCapabilities;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceServiceMethods_FWD_DEFINED__
#define __IPortableDeviceServiceMethods_FWD_DEFINED__
typedef interface IPortableDeviceServiceMethods IPortableDeviceServiceMethods;
#ifdef __cplusplus
interface IPortableDeviceServiceMethods;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceServiceMethodCallback_FWD_DEFINED__
#define __IPortableDeviceServiceMethodCallback_FWD_DEFINED__
typedef interface IPortableDeviceServiceMethodCallback IPortableDeviceServiceMethodCallback;
#ifdef __cplusplus
interface IPortableDeviceServiceMethodCallback;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceDispatchFactory_FWD_DEFINED__
#define __IPortableDeviceDispatchFactory_FWD_DEFINED__
typedef interface IPortableDeviceDispatchFactory IPortableDeviceDispatchFactory;
#ifdef __cplusplus
interface IPortableDeviceDispatchFactory;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceServiceActivation_FWD_DEFINED__
#define __IPortableDeviceServiceActivation_FWD_DEFINED__
typedef interface IPortableDeviceServiceActivation IPortableDeviceServiceActivation;
#ifdef __cplusplus
interface IPortableDeviceServiceActivation;
#endif /* __cplusplus */
#endif

#ifndef __IPortableDeviceServiceOpenCallback_FWD_DEFINED__
#define __IPortableDeviceServiceOpenCallback_FWD_DEFINED__
typedef interface IPortableDeviceServiceOpenCallback IPortableDeviceServiceOpenCallback;
#ifdef __cplusplus
interface IPortableDeviceServiceOpenCallback;
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IPortableDeviceManager interface
 */
#ifndef __IPortableDeviceManager_INTERFACE_DEFINED__
#define __IPortableDeviceManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPortableDeviceManager, 0xa1567595, 0x4c2f, 0x4574, 0xa6,0xfa, 0xec,0xef,0x91,0x7b,0x9a,0x40);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a1567595-4c2f-4574-a6fa-ecef917b9a40")
IPortableDeviceManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDevices(
        LPWSTR *device_ids,
        DWORD *device_ids_count) = 0;

    virtual HRESULT STDMETHODCALLTYPE RefreshDeviceList(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeviceFriendlyName(
        LPCWSTR device_id,
        WCHAR *device_friendly_name,
        DWORD *device_friendly_name_size) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeviceDescription(
        LPCWSTR device_id,
        WCHAR *device_description,
        DWORD *device_description_size) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeviceManufacturer(
        LPCWSTR device_id,
        WCHAR *device_manufacturer,
        DWORD *device_manufacturer_size) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeviceProperty(
        LPCWSTR device_id,
        LPCWSTR device_property_name,
        BYTE *data,
        DWORD *data_size,
        DWORD *type) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPrivateDevices(
        LPWSTR *device_ids,
        DWORD *device_ids_count) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPortableDeviceManager, 0xa1567595, 0x4c2f, 0x4574, 0xa6,0xfa, 0xec,0xef,0x91,0x7b,0x9a,0x40)
#endif
#else
typedef struct IPortableDeviceManagerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPortableDeviceManager *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPortableDeviceManager *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPortableDeviceManager *This);

    /*** IPortableDeviceManager methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDevices)(
        IPortableDeviceManager *This,
        LPWSTR *device_ids,
        DWORD *device_ids_count);

    HRESULT (STDMETHODCALLTYPE *RefreshDeviceList)(
        IPortableDeviceManager *This);

    HRESULT (STDMETHODCALLTYPE *GetDeviceFriendlyName)(
        IPortableDeviceManager *This,
        LPCWSTR device_id,
        WCHAR *device_friendly_name,
        DWORD *device_friendly_name_size);

    HRESULT (STDMETHODCALLTYPE *GetDeviceDescription)(
        IPortableDeviceManager *This,
        LPCWSTR device_id,
        WCHAR *device_description,
        DWORD *device_description_size);

    HRESULT (STDMETHODCALLTYPE *GetDeviceManufacturer)(
        IPortableDeviceManager *This,
        LPCWSTR device_id,
        WCHAR *device_manufacturer,
        DWORD *device_manufacturer_size);

    HRESULT (STDMETHODCALLTYPE *GetDeviceProperty)(
        IPortableDeviceManager *This,
        LPCWSTR device_id,
        LPCWSTR device_property_name,
        BYTE *data,
        DWORD *data_size,
        DWORD *type);

    HRESULT (STDMETHODCALLTYPE *GetPrivateDevices)(
        IPortableDeviceManager *This,
        LPWSTR *device_ids,
        DWORD *device_ids_count);

    END_INTERFACE
} IPortableDeviceManagerVtbl;

interface IPortableDeviceManager {
    CONST_VTBL IPortableDeviceManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPortableDeviceManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPortableDeviceManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPortableDeviceManager_Release(This) (This)->lpVtbl->Release(This)
/*** IPortableDeviceManager methods ***/
#define IPortableDeviceManager_GetDevices(This,device_ids,device_ids_count) (This)->lpVtbl->GetDevices(This,device_ids,device_ids_count)
#define IPortableDeviceManager_RefreshDeviceList(This) (This)->lpVtbl->RefreshDeviceList(This)
#define IPortableDeviceManager_GetDeviceFriendlyName(This,device_id,device_friendly_name,device_friendly_name_size) (This)->lpVtbl->GetDeviceFriendlyName(This,device_id,device_friendly_name,device_friendly_name_size)
#define IPortableDeviceManager_GetDeviceDescription(This,device_id,device_description,device_description_size) (This)->lpVtbl->GetDeviceDescription(This,device_id,device_description,device_description_size)
#define IPortableDeviceManager_GetDeviceManufacturer(This,device_id,device_manufacturer,device_manufacturer_size) (This)->lpVtbl->GetDeviceManufacturer(This,device_id,device_manufacturer,device_manufacturer_size)
#define IPortableDeviceManager_GetDeviceProperty(This,device_id,device_property_name,data,data_size,type) (This)->lpVtbl->GetDeviceProperty(This,device_id,device_property_name,data,data_size,type)
#define IPortableDeviceManager_GetPrivateDevices(This,device_ids,device_ids_count) (This)->lpVtbl->GetPrivateDevices(This,device_ids,device_ids_count)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceManager_QueryInterface(IPortableDeviceManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPortableDeviceManager_AddRef(IPortableDeviceManager* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPortableDeviceManager_Release(IPortableDeviceManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IPortableDeviceManager methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceManager_GetDevices(IPortableDeviceManager* This,LPWSTR *device_ids,DWORD *device_ids_count) {
    return This->lpVtbl->GetDevices(This,device_ids,device_ids_count);
}
static __WIDL_INLINE HRESULT IPortableDeviceManager_RefreshDeviceList(IPortableDeviceManager* This) {
    return This->lpVtbl->RefreshDeviceList(This);
}
static __WIDL_INLINE HRESULT IPortableDeviceManager_GetDeviceFriendlyName(IPortableDeviceManager* This,LPCWSTR device_id,WCHAR *device_friendly_name,DWORD *device_friendly_name_size) {
    return This->lpVtbl->GetDeviceFriendlyName(This,device_id,device_friendly_name,device_friendly_name_size);
}
static __WIDL_INLINE HRESULT IPortableDeviceManager_GetDeviceDescription(IPortableDeviceManager* This,LPCWSTR device_id,WCHAR *device_description,DWORD *device_description_size) {
    return This->lpVtbl->GetDeviceDescription(This,device_id,device_description,device_description_size);
}
static __WIDL_INLINE HRESULT IPortableDeviceManager_GetDeviceManufacturer(IPortableDeviceManager* This,LPCWSTR device_id,WCHAR *device_manufacturer,DWORD *device_manufacturer_size) {
    return This->lpVtbl->GetDeviceManufacturer(This,device_id,device_manufacturer,device_manufacturer_size);
}
static __WIDL_INLINE HRESULT IPortableDeviceManager_GetDeviceProperty(IPortableDeviceManager* This,LPCWSTR device_id,LPCWSTR device_property_name,BYTE *data,DWORD *data_size,DWORD *type) {
    return This->lpVtbl->GetDeviceProperty(This,device_id,device_property_name,data,data_size,type);
}
static __WIDL_INLINE HRESULT IPortableDeviceManager_GetPrivateDevices(IPortableDeviceManager* This,LPWSTR *device_ids,DWORD *device_ids_count) {
    return This->lpVtbl->GetPrivateDevices(This,device_ids,device_ids_count);
}
#endif
#endif

#endif


#endif  /* __IPortableDeviceManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPortableDevice interface
 */
#ifndef __IPortableDevice_INTERFACE_DEFINED__
#define __IPortableDevice_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPortableDevice, 0x625e2df8, 0x6392, 0x4cf0, 0x9a,0xd1, 0x3c,0xfa,0x5f,0x17,0x77,0x5c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("625e2df8-6392-4cf0-9ad1-3cfa5f17775c")
IPortableDevice : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Open(
        LPCWSTR device_id,
        IPortableDeviceValues *client_info) = 0;

    virtual HRESULT STDMETHODCALLTYPE SendCommand(
        const DWORD flags,
        IPortableDeviceValues *parameters,
        IPortableDeviceValues **results) = 0;

    virtual HRESULT STDMETHODCALLTYPE Content(
        IPortableDeviceContent **content) = 0;

    virtual HRESULT STDMETHODCALLTYPE Capabilities(
        IPortableDeviceCapabilities **capabilities) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Close(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Advise(
        const DWORD flags,
        IPortableDeviceEventCallback *callback,
        IPortableDeviceValues *parameters,
        LPWSTR *cookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unadvise(
        LPCWSTR cookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPnPDeviceID(
        LPWSTR *device_id) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPortableDevice, 0x625e2df8, 0x6392, 0x4cf0, 0x9a,0xd1, 0x3c,0xfa,0x5f,0x17,0x77,0x5c)
#endif
#else
typedef struct IPortableDeviceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPortableDevice *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPortableDevice *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPortableDevice *This);

    /*** IPortableDevice methods ***/
    HRESULT (STDMETHODCALLTYPE *Open)(
        IPortableDevice *This,
        LPCWSTR device_id,
        IPortableDeviceValues *client_info);

    HRESULT (STDMETHODCALLTYPE *SendCommand)(
        IPortableDevice *This,
        const DWORD flags,
        IPortableDeviceValues *parameters,
        IPortableDeviceValues **results);

    HRESULT (STDMETHODCALLTYPE *Content)(
        IPortableDevice *This,
        IPortableDeviceContent **content);

    HRESULT (STDMETHODCALLTYPE *Capabilities)(
        IPortableDevice *This,
        IPortableDeviceCapabilities **capabilities);

    HRESULT (STDMETHODCALLTYPE *Cancel)(
        IPortableDevice *This);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IPortableDevice *This);

    HRESULT (STDMETHODCALLTYPE *Advise)(
        IPortableDevice *This,
        const DWORD flags,
        IPortableDeviceEventCallback *callback,
        IPortableDeviceValues *parameters,
        LPWSTR *cookie);

    HRESULT (STDMETHODCALLTYPE *Unadvise)(
        IPortableDevice *This,
        LPCWSTR cookie);

    HRESULT (STDMETHODCALLTYPE *GetPnPDeviceID)(
        IPortableDevice *This,
        LPWSTR *device_id);

    END_INTERFACE
} IPortableDeviceVtbl;

interface IPortableDevice {
    CONST_VTBL IPortableDeviceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPortableDevice_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPortableDevice_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPortableDevice_Release(This) (This)->lpVtbl->Release(This)
/*** IPortableDevice methods ***/
#define IPortableDevice_Open(This,device_id,client_info) (This)->lpVtbl->Open(This,device_id,client_info)
#define IPortableDevice_SendCommand(This,flags,parameters,results) (This)->lpVtbl->SendCommand(This,flags,parameters,results)
#define IPortableDevice_Content(This,content) (This)->lpVtbl->Content(This,content)
#define IPortableDevice_Capabilities(This,capabilities) (This)->lpVtbl->Capabilities(This,capabilities)
#define IPortableDevice_Cancel(This) (This)->lpVtbl->Cancel(This)
#define IPortableDevice_Close(This) (This)->lpVtbl->Close(This)
#define IPortableDevice_Advise(This,flags,callback,parameters,cookie) (This)->lpVtbl->Advise(This,flags,callback,parameters,cookie)
#define IPortableDevice_Unadvise(This,cookie) (This)->lpVtbl->Unadvise(This,cookie)
#define IPortableDevice_GetPnPDeviceID(This,device_id) (This)->lpVtbl->GetPnPDeviceID(This,device_id)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPortableDevice_QueryInterface(IPortableDevice* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPortableDevice_AddRef(IPortableDevice* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPortableDevice_Release(IPortableDevice* This) {
    return This->lpVtbl->Release(This);
}
/*** IPortableDevice methods ***/
static __WIDL_INLINE HRESULT IPortableDevice_Open(IPortableDevice* This,LPCWSTR device_id,IPortableDeviceValues *client_info) {
    return This->lpVtbl->Open(This,device_id,client_info);
}
static __WIDL_INLINE HRESULT IPortableDevice_SendCommand(IPortableDevice* This,const DWORD flags,IPortableDeviceValues *parameters,IPortableDeviceValues **results) {
    return This->lpVtbl->SendCommand(This,flags,parameters,results);
}
static __WIDL_INLINE HRESULT IPortableDevice_Content(IPortableDevice* This,IPortableDeviceContent **content) {
    return This->lpVtbl->Content(This,content);
}
static __WIDL_INLINE HRESULT IPortableDevice_Capabilities(IPortableDevice* This,IPortableDeviceCapabilities **capabilities) {
    return This->lpVtbl->Capabilities(This,capabilities);
}
static __WIDL_INLINE HRESULT IPortableDevice_Cancel(IPortableDevice* This) {
    return This->lpVtbl->Cancel(This);
}
static __WIDL_INLINE HRESULT IPortableDevice_Close(IPortableDevice* This) {
    return This->lpVtbl->Close(This);
}
static __WIDL_INLINE HRESULT IPortableDevice_Advise(IPortableDevice* This,const DWORD flags,IPortableDeviceEventCallback *callback,IPortableDeviceValues *parameters,LPWSTR *cookie) {
    return This->lpVtbl->Advise(This,flags,callback,parameters,cookie);
}
static __WIDL_INLINE HRESULT IPortableDevice_Unadvise(IPortableDevice* This,LPCWSTR cookie) {
    return This->lpVtbl->Unadvise(This,cookie);
}
static __WIDL_INLINE HRESULT IPortableDevice_GetPnPDeviceID(IPortableDevice* This,LPWSTR *device_id) {
    return This->lpVtbl->GetPnPDeviceID(This,device_id);
}
#endif
#endif

#endif


#endif  /* __IPortableDevice_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPortableDeviceContent interface
 */
#ifndef __IPortableDeviceContent_INTERFACE_DEFINED__
#define __IPortableDeviceContent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPortableDeviceContent, 0x6a96ed84, 0x7c73, 0x4480, 0x99,0x38, 0xbf,0x5a,0xf4,0x77,0xd4,0x26);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6a96ed84-7c73-4480-9938-bf5af477d426")
IPortableDeviceContent : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE EnumObjects(
        const DWORD flags,
        LPCWSTR parent_object_id,
        IPortableDeviceValues *filter,
        IEnumPortableDeviceObjectIDs **enum_device_object) = 0;

    virtual HRESULT STDMETHODCALLTYPE Properties(
        IPortableDeviceProperties **device_properties) = 0;

    virtual HRESULT STDMETHODCALLTYPE Transfer(
        IPortableDeviceResources **resources) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateObjectWithPropertiesOnly(
        IPortableDeviceValues *values,
        LPWSTR *object_id) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateObjectWithPropertiesAndData(
        IPortableDeviceValues *values,
        IStream **data,
        DWORD *optimal_write_buffer_size,
        LPWSTR *cookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE Delete(
        const DWORD options,
        IPortableDevicePropVariantCollection *object_ids,
        IPortableDevicePropVariantCollection **results) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetObjectIDsFromPersistentUniqueIDs(
        IPortableDevicePropVariantCollection *persistent_unique_ids,
        IPortableDevicePropVariantCollection **object_ids) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Move(
        IPortableDevicePropVariantCollection *object_ids,
        LPCWSTR destination_folder_object_id,
        IPortableDevicePropVariantCollection **results) = 0;

    virtual HRESULT STDMETHODCALLTYPE Copy(
        IPortableDevicePropVariantCollection *object_ids,
        LPCWSTR destination_folder_object_id,
        IPortableDevicePropVariantCollection **results) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPortableDeviceContent, 0x6a96ed84, 0x7c73, 0x4480, 0x99,0x38, 0xbf,0x5a,0xf4,0x77,0xd4,0x26)
#endif
#else
typedef struct IPortableDeviceContentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPortableDeviceContent *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPortableDeviceContent *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPortableDeviceContent *This);

    /*** IPortableDeviceContent methods ***/
    HRESULT (STDMETHODCALLTYPE *EnumObjects)(
        IPortableDeviceContent *This,
        const DWORD flags,
        LPCWSTR parent_object_id,
        IPortableDeviceValues *filter,
        IEnumPortableDeviceObjectIDs **enum_device_object);

    HRESULT (STDMETHODCALLTYPE *Properties)(
        IPortableDeviceContent *This,
        IPortableDeviceProperties **device_properties);

    HRESULT (STDMETHODCALLTYPE *Transfer)(
        IPortableDeviceContent *This,
        IPortableDeviceResources **resources);

    HRESULT (STDMETHODCALLTYPE *CreateObjectWithPropertiesOnly)(
        IPortableDeviceContent *This,
        IPortableDeviceValues *values,
        LPWSTR *object_id);

    HRESULT (STDMETHODCALLTYPE *CreateObjectWithPropertiesAndData)(
        IPortableDeviceContent *This,
        IPortableDeviceValues *values,
        IStream **data,
        DWORD *optimal_write_buffer_size,
        LPWSTR *cookie);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IPortableDeviceContent *This,
        const DWORD options,
        IPortableDevicePropVariantCollection *object_ids,
        IPortableDevicePropVariantCollection **results);

    HRESULT (STDMETHODCALLTYPE *GetObjectIDsFromPersistentUniqueIDs)(
        IPortableDeviceContent *This,
        IPortableDevicePropVariantCollection *persistent_unique_ids,
        IPortableDevicePropVariantCollection **object_ids);

    HRESULT (STDMETHODCALLTYPE *Cancel)(
        IPortableDeviceContent *This);

    HRESULT (STDMETHODCALLTYPE *Move)(
        IPortableDeviceContent *This,
        IPortableDevicePropVariantCollection *object_ids,
        LPCWSTR destination_folder_object_id,
        IPortableDevicePropVariantCollection **results);

    HRESULT (STDMETHODCALLTYPE *Copy)(
        IPortableDeviceContent *This,
        IPortableDevicePropVariantCollection *object_ids,
        LPCWSTR destination_folder_object_id,
        IPortableDevicePropVariantCollection **results);

    END_INTERFACE
} IPortableDeviceContentVtbl;

interface IPortableDeviceContent {
    CONST_VTBL IPortableDeviceContentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPortableDeviceContent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPortableDeviceContent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPortableDeviceContent_Release(This) (This)->lpVtbl->Release(This)
/*** IPortableDeviceContent methods ***/
#define IPortableDeviceContent_EnumObjects(This,flags,parent_object_id,filter,enum_device_object) (This)->lpVtbl->EnumObjects(This,flags,parent_object_id,filter,enum_device_object)
#define IPortableDeviceContent_Properties(This,device_properties) (This)->lpVtbl->Properties(This,device_properties)
#define IPortableDeviceContent_Transfer(This,resources) (This)->lpVtbl->Transfer(This,resources)
#define IPortableDeviceContent_CreateObjectWithPropertiesOnly(This,values,object_id) (This)->lpVtbl->CreateObjectWithPropertiesOnly(This,values,object_id)
#define IPortableDeviceContent_CreateObjectWithPropertiesAndData(This,values,data,optimal_write_buffer_size,cookie) (This)->lpVtbl->CreateObjectWithPropertiesAndData(This,values,data,optimal_write_buffer_size,cookie)
#define IPortableDeviceContent_Delete(This,options,object_ids,results) (This)->lpVtbl->Delete(This,options,object_ids,results)
#define IPortableDeviceContent_GetObjectIDsFromPersistentUniqueIDs(This,persistent_unique_ids,object_ids) (This)->lpVtbl->GetObjectIDsFromPersistentUniqueIDs(This,persistent_unique_ids,object_ids)
#define IPortableDeviceContent_Cancel(This) (This)->lpVtbl->Cancel(This)
#define IPortableDeviceContent_Move(This,object_ids,destination_folder_object_id,results) (This)->lpVtbl->Move(This,object_ids,destination_folder_object_id,results)
#define IPortableDeviceContent_Copy(This,object_ids,destination_folder_object_id,results) (This)->lpVtbl->Copy(This,object_ids,destination_folder_object_id,results)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceContent_QueryInterface(IPortableDeviceContent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPortableDeviceContent_AddRef(IPortableDeviceContent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPortableDeviceContent_Release(IPortableDeviceContent* This) {
    return This->lpVtbl->Release(This);
}
/*** IPortableDeviceContent methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceContent_EnumObjects(IPortableDeviceContent* This,const DWORD flags,LPCWSTR parent_object_id,IPortableDeviceValues *filter,IEnumPortableDeviceObjectIDs **enum_device_object) {
    return This->lpVtbl->EnumObjects(This,flags,parent_object_id,filter,enum_device_object);
}
static __WIDL_INLINE HRESULT IPortableDeviceContent_Properties(IPortableDeviceContent* This,IPortableDeviceProperties **device_properties) {
    return This->lpVtbl->Properties(This,device_properties);
}
static __WIDL_INLINE HRESULT IPortableDeviceContent_Transfer(IPortableDeviceContent* This,IPortableDeviceResources **resources) {
    return This->lpVtbl->Transfer(This,resources);
}
static __WIDL_INLINE HRESULT IPortableDeviceContent_CreateObjectWithPropertiesOnly(IPortableDeviceContent* This,IPortableDeviceValues *values,LPWSTR *object_id) {
    return This->lpVtbl->CreateObjectWithPropertiesOnly(This,values,object_id);
}
static __WIDL_INLINE HRESULT IPortableDeviceContent_CreateObjectWithPropertiesAndData(IPortableDeviceContent* This,IPortableDeviceValues *values,IStream **data,DWORD *optimal_write_buffer_size,LPWSTR *cookie) {
    return This->lpVtbl->CreateObjectWithPropertiesAndData(This,values,data,optimal_write_buffer_size,cookie);
}
static __WIDL_INLINE HRESULT IPortableDeviceContent_Delete(IPortableDeviceContent* This,const DWORD options,IPortableDevicePropVariantCollection *object_ids,IPortableDevicePropVariantCollection **results) {
    return This->lpVtbl->Delete(This,options,object_ids,results);
}
static __WIDL_INLINE HRESULT IPortableDeviceContent_GetObjectIDsFromPersistentUniqueIDs(IPortableDeviceContent* This,IPortableDevicePropVariantCollection *persistent_unique_ids,IPortableDevicePropVariantCollection **object_ids) {
    return This->lpVtbl->GetObjectIDsFromPersistentUniqueIDs(This,persistent_unique_ids,object_ids);
}
static __WIDL_INLINE HRESULT IPortableDeviceContent_Cancel(IPortableDeviceContent* This) {
    return This->lpVtbl->Cancel(This);
}
static __WIDL_INLINE HRESULT IPortableDeviceContent_Move(IPortableDeviceContent* This,IPortableDevicePropVariantCollection *object_ids,LPCWSTR destination_folder_object_id,IPortableDevicePropVariantCollection **results) {
    return This->lpVtbl->Move(This,object_ids,destination_folder_object_id,results);
}
static __WIDL_INLINE HRESULT IPortableDeviceContent_Copy(IPortableDeviceContent* This,IPortableDevicePropVariantCollection *object_ids,LPCWSTR destination_folder_object_id,IPortableDevicePropVariantCollection **results) {
    return This->lpVtbl->Copy(This,object_ids,destination_folder_object_id,results);
}
#endif
#endif

#endif


#endif  /* __IPortableDeviceContent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPortableDeviceContent2 interface
 */
#ifndef __IPortableDeviceContent2_INTERFACE_DEFINED__
#define __IPortableDeviceContent2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPortableDeviceContent2, 0x9b4add96, 0xf6bf, 0x4034, 0x87,0x08, 0xec,0xa7,0x2b,0xf1,0x05,0x54);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9b4add96-f6bf-4034-8708-eca72bf10554")
IPortableDeviceContent2 : public IPortableDeviceContent
{
    virtual HRESULT STDMETHODCALLTYPE UpdateObjectWithPropertiesAndData(
        LPCWSTR object_id,
        IPortableDeviceValues *device_properties,
        IStream **data,
        DWORD *optimal_write_buffer_size) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPortableDeviceContent2, 0x9b4add96, 0xf6bf, 0x4034, 0x87,0x08, 0xec,0xa7,0x2b,0xf1,0x05,0x54)
#endif
#else
typedef struct IPortableDeviceContent2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPortableDeviceContent2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPortableDeviceContent2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPortableDeviceContent2 *This);

    /*** IPortableDeviceContent methods ***/
    HRESULT (STDMETHODCALLTYPE *EnumObjects)(
        IPortableDeviceContent2 *This,
        const DWORD flags,
        LPCWSTR parent_object_id,
        IPortableDeviceValues *filter,
        IEnumPortableDeviceObjectIDs **enum_device_object);

    HRESULT (STDMETHODCALLTYPE *Properties)(
        IPortableDeviceContent2 *This,
        IPortableDeviceProperties **device_properties);

    HRESULT (STDMETHODCALLTYPE *Transfer)(
        IPortableDeviceContent2 *This,
        IPortableDeviceResources **resources);

    HRESULT (STDMETHODCALLTYPE *CreateObjectWithPropertiesOnly)(
        IPortableDeviceContent2 *This,
        IPortableDeviceValues *values,
        LPWSTR *object_id);

    HRESULT (STDMETHODCALLTYPE *CreateObjectWithPropertiesAndData)(
        IPortableDeviceContent2 *This,
        IPortableDeviceValues *values,
        IStream **data,
        DWORD *optimal_write_buffer_size,
        LPWSTR *cookie);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IPortableDeviceContent2 *This,
        const DWORD options,
        IPortableDevicePropVariantCollection *object_ids,
        IPortableDevicePropVariantCollection **results);

    HRESULT (STDMETHODCALLTYPE *GetObjectIDsFromPersistentUniqueIDs)(
        IPortableDeviceContent2 *This,
        IPortableDevicePropVariantCollection *persistent_unique_ids,
        IPortableDevicePropVariantCollection **object_ids);

    HRESULT (STDMETHODCALLTYPE *Cancel)(
        IPortableDeviceContent2 *This);

    HRESULT (STDMETHODCALLTYPE *Move)(
        IPortableDeviceContent2 *This,
        IPortableDevicePropVariantCollection *object_ids,
        LPCWSTR destination_folder_object_id,
        IPortableDevicePropVariantCollection **results);

    HRESULT (STDMETHODCALLTYPE *Copy)(
        IPortableDeviceContent2 *This,
        IPortableDevicePropVariantCollection *object_ids,
        LPCWSTR destination_folder_object_id,
        IPortableDevicePropVariantCollection **results);

    /*** IPortableDeviceContent2 methods ***/
    HRESULT (STDMETHODCALLTYPE *UpdateObjectWithPropertiesAndData)(
        IPortableDeviceContent2 *This,
        LPCWSTR object_id,
        IPortableDeviceValues *device_properties,
        IStream **data,
        DWORD *optimal_write_buffer_size);

    END_INTERFACE
} IPortableDeviceContent2Vtbl;

interface IPortableDeviceContent2 {
    CONST_VTBL IPortableDeviceContent2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPortableDeviceContent2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPortableDeviceContent2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPortableDeviceContent2_Release(This) (This)->lpVtbl->Release(This)
/*** IPortableDeviceContent methods ***/
#define IPortableDeviceContent2_EnumObjects(This,flags,parent_object_id,filter,enum_device_object) (This)->lpVtbl->EnumObjects(This,flags,parent_object_id,filter,enum_device_object)
#define IPortableDeviceContent2_Properties(This,device_properties) (This)->lpVtbl->Properties(This,device_properties)
#define IPortableDeviceContent2_Transfer(This,resources) (This)->lpVtbl->Transfer(This,resources)
#define IPortableDeviceContent2_CreateObjectWithPropertiesOnly(This,values,object_id) (This)->lpVtbl->CreateObjectWithPropertiesOnly(This,values,object_id)
#define IPortableDeviceContent2_CreateObjectWithPropertiesAndData(This,values,data,optimal_write_buffer_size,cookie) (This)->lpVtbl->CreateObjectWithPropertiesAndData(This,values,data,optimal_write_buffer_size,cookie)
#define IPortableDeviceContent2_Delete(This,options,object_ids,results) (This)->lpVtbl->Delete(This,options,object_ids,results)
#define IPortableDeviceContent2_GetObjectIDsFromPersistentUniqueIDs(This,persistent_unique_ids,object_ids) (This)->lpVtbl->GetObjectIDsFromPersistentUniqueIDs(This,persistent_unique_ids,object_ids)
#define IPortableDeviceContent2_Cancel(This) (This)->lpVtbl->Cancel(This)
#define IPortableDeviceContent2_Move(This,object_ids,destination_folder_object_id,results) (This)->lpVtbl->Move(This,object_ids,destination_folder_object_id,results)
#define IPortableDeviceContent2_Copy(This,object_ids,destination_folder_object_id,results) (This)->lpVtbl->Copy(This,object_ids,destination_folder_object_id,results)
/*** IPortableDeviceContent2 methods ***/
#define IPortableDeviceContent2_UpdateObjectWithPropertiesAndData(This,object_id,device_properties,data,optimal_write_buffer_size) (This)->lpVtbl->UpdateObjectWithPropertiesAndData(This,object_id,device_properties,data,optimal_write_buffer_size)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceContent2_QueryInterface(IPortableDeviceContent2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPortableDeviceContent2_AddRef(IPortableDeviceContent2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPortableDeviceContent2_Release(IPortableDeviceContent2* This) {
    return This->lpVtbl->Release(This);
}
/*** IPortableDeviceContent methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceContent2_EnumObjects(IPortableDeviceContent2* This,const DWORD flags,LPCWSTR parent_object_id,IPortableDeviceValues *filter,IEnumPortableDeviceObjectIDs **enum_device_object) {
    return This->lpVtbl->EnumObjects(This,flags,parent_object_id,filter,enum_device_object);
}
static __WIDL_INLINE HRESULT IPortableDeviceContent2_Properties(IPortableDeviceContent2* This,IPortableDeviceProperties **device_properties) {
    return This->lpVtbl->Properties(This,device_properties);
}
static __WIDL_INLINE HRESULT IPortableDeviceContent2_Transfer(IPortableDeviceContent2* This,IPortableDeviceResources **resources) {
    return This->lpVtbl->Transfer(This,resources);
}
static __WIDL_INLINE HRESULT IPortableDeviceContent2_CreateObjectWithPropertiesOnly(IPortableDeviceContent2* This,IPortableDeviceValues *values,LPWSTR *object_id) {
    return This->lpVtbl->CreateObjectWithPropertiesOnly(This,values,object_id);
}
static __WIDL_INLINE HRESULT IPortableDeviceContent2_CreateObjectWithPropertiesAndData(IPortableDeviceContent2* This,IPortableDeviceValues *values,IStream **data,DWORD *optimal_write_buffer_size,LPWSTR *cookie) {
    return This->lpVtbl->CreateObjectWithPropertiesAndData(This,values,data,optimal_write_buffer_size,cookie);
}
static __WIDL_INLINE HRESULT IPortableDeviceContent2_Delete(IPortableDeviceContent2* This,const DWORD options,IPortableDevicePropVariantCollection *object_ids,IPortableDevicePropVariantCollection **results) {
    return This->lpVtbl->Delete(This,options,object_ids,results);
}
static __WIDL_INLINE HRESULT IPortableDeviceContent2_GetObjectIDsFromPersistentUniqueIDs(IPortableDeviceContent2* This,IPortableDevicePropVariantCollection *persistent_unique_ids,IPortableDevicePropVariantCollection **object_ids) {
    return This->lpVtbl->GetObjectIDsFromPersistentUniqueIDs(This,persistent_unique_ids,object_ids);
}
static __WIDL_INLINE HRESULT IPortableDeviceContent2_Cancel(IPortableDeviceContent2* This) {
    return This->lpVtbl->Cancel(This);
}
static __WIDL_INLINE HRESULT IPortableDeviceContent2_Move(IPortableDeviceContent2* This,IPortableDevicePropVariantCollection *object_ids,LPCWSTR destination_folder_object_id,IPortableDevicePropVariantCollection **results) {
    return This->lpVtbl->Move(This,object_ids,destination_folder_object_id,results);
}
static __WIDL_INLINE HRESULT IPortableDeviceContent2_Copy(IPortableDeviceContent2* This,IPortableDevicePropVariantCollection *object_ids,LPCWSTR destination_folder_object_id,IPortableDevicePropVariantCollection **results) {
    return This->lpVtbl->Copy(This,object_ids,destination_folder_object_id,results);
}
/*** IPortableDeviceContent2 methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceContent2_UpdateObjectWithPropertiesAndData(IPortableDeviceContent2* This,LPCWSTR object_id,IPortableDeviceValues *device_properties,IStream **data,DWORD *optimal_write_buffer_size) {
    return This->lpVtbl->UpdateObjectWithPropertiesAndData(This,object_id,device_properties,data,optimal_write_buffer_size);
}
#endif
#endif

#endif


#endif  /* __IPortableDeviceContent2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEnumPortableDeviceObjectIDs interface
 */
#ifndef __IEnumPortableDeviceObjectIDs_INTERFACE_DEFINED__
#define __IEnumPortableDeviceObjectIDs_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumPortableDeviceObjectIDs, 0x10ece955, 0xcf41, 0x4728, 0xbf,0xa0, 0x41,0xee,0xdf,0x1b,0xbf,0x19);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("10ece955-cf41-4728-bfa0-41eedf1bbf19")
IEnumPortableDeviceObjectIDs : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG objects,
        LPWSTR *obj_ids,
        ULONG *fetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG objects) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumPortableDeviceObjectIDs **enum_device_object) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumPortableDeviceObjectIDs, 0x10ece955, 0xcf41, 0x4728, 0xbf,0xa0, 0x41,0xee,0xdf,0x1b,0xbf,0x19)
#endif
#else
typedef struct IEnumPortableDeviceObjectIDsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IEnumPortableDeviceObjectIDs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IEnumPortableDeviceObjectIDs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IEnumPortableDeviceObjectIDs *This);

    /*** IEnumPortableDeviceObjectIDs methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumPortableDeviceObjectIDs *This,
        ULONG objects,
        LPWSTR *obj_ids,
        ULONG *fetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumPortableDeviceObjectIDs *This,
        ULONG objects);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumPortableDeviceObjectIDs *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumPortableDeviceObjectIDs *This,
        IEnumPortableDeviceObjectIDs **enum_device_object);

    HRESULT (STDMETHODCALLTYPE *Cancel)(
        IEnumPortableDeviceObjectIDs *This);

    END_INTERFACE
} IEnumPortableDeviceObjectIDsVtbl;

interface IEnumPortableDeviceObjectIDs {
    CONST_VTBL IEnumPortableDeviceObjectIDsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumPortableDeviceObjectIDs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumPortableDeviceObjectIDs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumPortableDeviceObjectIDs_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumPortableDeviceObjectIDs methods ***/
#define IEnumPortableDeviceObjectIDs_Next(This,objects,obj_ids,fetched) (This)->lpVtbl->Next(This,objects,obj_ids,fetched)
#define IEnumPortableDeviceObjectIDs_Skip(This,objects) (This)->lpVtbl->Skip(This,objects)
#define IEnumPortableDeviceObjectIDs_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumPortableDeviceObjectIDs_Clone(This,enum_device_object) (This)->lpVtbl->Clone(This,enum_device_object)
#define IEnumPortableDeviceObjectIDs_Cancel(This) (This)->lpVtbl->Cancel(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IEnumPortableDeviceObjectIDs_QueryInterface(IEnumPortableDeviceObjectIDs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IEnumPortableDeviceObjectIDs_AddRef(IEnumPortableDeviceObjectIDs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IEnumPortableDeviceObjectIDs_Release(IEnumPortableDeviceObjectIDs* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumPortableDeviceObjectIDs methods ***/
static __WIDL_INLINE HRESULT IEnumPortableDeviceObjectIDs_Next(IEnumPortableDeviceObjectIDs* This,ULONG objects,LPWSTR *obj_ids,ULONG *fetched) {
    return This->lpVtbl->Next(This,objects,obj_ids,fetched);
}
static __WIDL_INLINE HRESULT IEnumPortableDeviceObjectIDs_Skip(IEnumPortableDeviceObjectIDs* This,ULONG objects) {
    return This->lpVtbl->Skip(This,objects);
}
static __WIDL_INLINE HRESULT IEnumPortableDeviceObjectIDs_Reset(IEnumPortableDeviceObjectIDs* This) {
    return This->lpVtbl->Reset(This);
}
static __WIDL_INLINE HRESULT IEnumPortableDeviceObjectIDs_Clone(IEnumPortableDeviceObjectIDs* This,IEnumPortableDeviceObjectIDs **enum_device_object) {
    return This->lpVtbl->Clone(This,enum_device_object);
}
static __WIDL_INLINE HRESULT IEnumPortableDeviceObjectIDs_Cancel(IEnumPortableDeviceObjectIDs* This) {
    return This->lpVtbl->Cancel(This);
}
#endif
#endif

#endif


#endif  /* __IEnumPortableDeviceObjectIDs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPortableDeviceProperties interface
 */
#ifndef __IPortableDeviceProperties_INTERFACE_DEFINED__
#define __IPortableDeviceProperties_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPortableDeviceProperties, 0x7f6d695c, 0x03df, 0x4439, 0xa8,0x09, 0x59,0x26,0x6b,0xee,0xe3,0xa6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7f6d695c-03df-4439-a809-59266beee3a6")
IPortableDeviceProperties : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSupportedProperties(
        LPCWSTR object_id,
        IPortableDeviceKeyCollection **keys) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPropertyAttributes(
        LPCWSTR object_id,
        REFPROPERTYKEY key,
        IPortableDeviceValues **attributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetValues(
        LPCWSTR object_id,
        IPortableDeviceKeyCollection *keys,
        IPortableDeviceValues **values) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetValues(
        LPCWSTR object_id,
        IPortableDeviceValues *values,
        IPortableDeviceValues **results) = 0;

    virtual HRESULT STDMETHODCALLTYPE Delete(
        LPCWSTR object_id,
        IPortableDeviceKeyCollection *keys) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPortableDeviceProperties, 0x7f6d695c, 0x03df, 0x4439, 0xa8,0x09, 0x59,0x26,0x6b,0xee,0xe3,0xa6)
#endif
#else
typedef struct IPortableDevicePropertiesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPortableDeviceProperties *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPortableDeviceProperties *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPortableDeviceProperties *This);

    /*** IPortableDeviceProperties methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSupportedProperties)(
        IPortableDeviceProperties *This,
        LPCWSTR object_id,
        IPortableDeviceKeyCollection **keys);

    HRESULT (STDMETHODCALLTYPE *GetPropertyAttributes)(
        IPortableDeviceProperties *This,
        LPCWSTR object_id,
        REFPROPERTYKEY key,
        IPortableDeviceValues **attributes);

    HRESULT (STDMETHODCALLTYPE *GetValues)(
        IPortableDeviceProperties *This,
        LPCWSTR object_id,
        IPortableDeviceKeyCollection *keys,
        IPortableDeviceValues **values);

    HRESULT (STDMETHODCALLTYPE *SetValues)(
        IPortableDeviceProperties *This,
        LPCWSTR object_id,
        IPortableDeviceValues *values,
        IPortableDeviceValues **results);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IPortableDeviceProperties *This,
        LPCWSTR object_id,
        IPortableDeviceKeyCollection *keys);

    HRESULT (STDMETHODCALLTYPE *Cancel)(
        IPortableDeviceProperties *This);

    END_INTERFACE
} IPortableDevicePropertiesVtbl;

interface IPortableDeviceProperties {
    CONST_VTBL IPortableDevicePropertiesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPortableDeviceProperties_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPortableDeviceProperties_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPortableDeviceProperties_Release(This) (This)->lpVtbl->Release(This)
/*** IPortableDeviceProperties methods ***/
#define IPortableDeviceProperties_GetSupportedProperties(This,object_id,keys) (This)->lpVtbl->GetSupportedProperties(This,object_id,keys)
#define IPortableDeviceProperties_GetPropertyAttributes(This,object_id,key,attributes) (This)->lpVtbl->GetPropertyAttributes(This,object_id,key,attributes)
#define IPortableDeviceProperties_GetValues(This,object_id,keys,values) (This)->lpVtbl->GetValues(This,object_id,keys,values)
#define IPortableDeviceProperties_SetValues(This,object_id,values,results) (This)->lpVtbl->SetValues(This,object_id,values,results)
#define IPortableDeviceProperties_Delete(This,object_id,keys) (This)->lpVtbl->Delete(This,object_id,keys)
#define IPortableDeviceProperties_Cancel(This) (This)->lpVtbl->Cancel(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceProperties_QueryInterface(IPortableDeviceProperties* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPortableDeviceProperties_AddRef(IPortableDeviceProperties* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPortableDeviceProperties_Release(IPortableDeviceProperties* This) {
    return This->lpVtbl->Release(This);
}
/*** IPortableDeviceProperties methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceProperties_GetSupportedProperties(IPortableDeviceProperties* This,LPCWSTR object_id,IPortableDeviceKeyCollection **keys) {
    return This->lpVtbl->GetSupportedProperties(This,object_id,keys);
}
static __WIDL_INLINE HRESULT IPortableDeviceProperties_GetPropertyAttributes(IPortableDeviceProperties* This,LPCWSTR object_id,REFPROPERTYKEY key,IPortableDeviceValues **attributes) {
    return This->lpVtbl->GetPropertyAttributes(This,object_id,key,attributes);
}
static __WIDL_INLINE HRESULT IPortableDeviceProperties_GetValues(IPortableDeviceProperties* This,LPCWSTR object_id,IPortableDeviceKeyCollection *keys,IPortableDeviceValues **values) {
    return This->lpVtbl->GetValues(This,object_id,keys,values);
}
static __WIDL_INLINE HRESULT IPortableDeviceProperties_SetValues(IPortableDeviceProperties* This,LPCWSTR object_id,IPortableDeviceValues *values,IPortableDeviceValues **results) {
    return This->lpVtbl->SetValues(This,object_id,values,results);
}
static __WIDL_INLINE HRESULT IPortableDeviceProperties_Delete(IPortableDeviceProperties* This,LPCWSTR object_id,IPortableDeviceKeyCollection *keys) {
    return This->lpVtbl->Delete(This,object_id,keys);
}
static __WIDL_INLINE HRESULT IPortableDeviceProperties_Cancel(IPortableDeviceProperties* This) {
    return This->lpVtbl->Cancel(This);
}
#endif
#endif

#endif


#endif  /* __IPortableDeviceProperties_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPortableDeviceResources interface
 */
#ifndef __IPortableDeviceResources_INTERFACE_DEFINED__
#define __IPortableDeviceResources_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPortableDeviceResources, 0xfd8878ac, 0xd841, 0x4d17, 0x89,0x1c, 0xe6,0x82,0x9c,0xdb,0x69,0x34);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fd8878ac-d841-4d17-891c-e6829cdb6934")
IPortableDeviceResources : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSupportedResources(
        LPCWSTR object_id,
        IPortableDeviceKeyCollection **keys) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetResourceAttributes(
        LPCWSTR object_id,
        REFPROPERTYKEY key,
        IPortableDeviceValues **resource_attributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStream(
        LPCWSTR object_id,
        REFPROPERTYKEY key,
        const DWORD mode,
        DWORD *optimal_buffer_size,
        IStream **stream) = 0;

    virtual HRESULT STDMETHODCALLTYPE Delete(
        LPCWSTR object_id,
        IPortableDeviceKeyCollection *keys) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateResource(
        IPortableDeviceValues *resource_attributes,
        IStream **data,
        DWORD *optimal_write_buffer_size,
        LPWSTR *cookie) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPortableDeviceResources, 0xfd8878ac, 0xd841, 0x4d17, 0x89,0x1c, 0xe6,0x82,0x9c,0xdb,0x69,0x34)
#endif
#else
typedef struct IPortableDeviceResourcesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPortableDeviceResources *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPortableDeviceResources *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPortableDeviceResources *This);

    /*** IPortableDeviceResources methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSupportedResources)(
        IPortableDeviceResources *This,
        LPCWSTR object_id,
        IPortableDeviceKeyCollection **keys);

    HRESULT (STDMETHODCALLTYPE *GetResourceAttributes)(
        IPortableDeviceResources *This,
        LPCWSTR object_id,
        REFPROPERTYKEY key,
        IPortableDeviceValues **resource_attributes);

    HRESULT (STDMETHODCALLTYPE *GetStream)(
        IPortableDeviceResources *This,
        LPCWSTR object_id,
        REFPROPERTYKEY key,
        const DWORD mode,
        DWORD *optimal_buffer_size,
        IStream **stream);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IPortableDeviceResources *This,
        LPCWSTR object_id,
        IPortableDeviceKeyCollection *keys);

    HRESULT (STDMETHODCALLTYPE *Cancel)(
        IPortableDeviceResources *This);

    HRESULT (STDMETHODCALLTYPE *CreateResource)(
        IPortableDeviceResources *This,
        IPortableDeviceValues *resource_attributes,
        IStream **data,
        DWORD *optimal_write_buffer_size,
        LPWSTR *cookie);

    END_INTERFACE
} IPortableDeviceResourcesVtbl;

interface IPortableDeviceResources {
    CONST_VTBL IPortableDeviceResourcesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPortableDeviceResources_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPortableDeviceResources_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPortableDeviceResources_Release(This) (This)->lpVtbl->Release(This)
/*** IPortableDeviceResources methods ***/
#define IPortableDeviceResources_GetSupportedResources(This,object_id,keys) (This)->lpVtbl->GetSupportedResources(This,object_id,keys)
#define IPortableDeviceResources_GetResourceAttributes(This,object_id,key,resource_attributes) (This)->lpVtbl->GetResourceAttributes(This,object_id,key,resource_attributes)
#define IPortableDeviceResources_GetStream(This,object_id,key,mode,optimal_buffer_size,stream) (This)->lpVtbl->GetStream(This,object_id,key,mode,optimal_buffer_size,stream)
#define IPortableDeviceResources_Delete(This,object_id,keys) (This)->lpVtbl->Delete(This,object_id,keys)
#define IPortableDeviceResources_Cancel(This) (This)->lpVtbl->Cancel(This)
#define IPortableDeviceResources_CreateResource(This,resource_attributes,data,optimal_write_buffer_size,cookie) (This)->lpVtbl->CreateResource(This,resource_attributes,data,optimal_write_buffer_size,cookie)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceResources_QueryInterface(IPortableDeviceResources* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPortableDeviceResources_AddRef(IPortableDeviceResources* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPortableDeviceResources_Release(IPortableDeviceResources* This) {
    return This->lpVtbl->Release(This);
}
/*** IPortableDeviceResources methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceResources_GetSupportedResources(IPortableDeviceResources* This,LPCWSTR object_id,IPortableDeviceKeyCollection **keys) {
    return This->lpVtbl->GetSupportedResources(This,object_id,keys);
}
static __WIDL_INLINE HRESULT IPortableDeviceResources_GetResourceAttributes(IPortableDeviceResources* This,LPCWSTR object_id,REFPROPERTYKEY key,IPortableDeviceValues **resource_attributes) {
    return This->lpVtbl->GetResourceAttributes(This,object_id,key,resource_attributes);
}
static __WIDL_INLINE HRESULT IPortableDeviceResources_GetStream(IPortableDeviceResources* This,LPCWSTR object_id,REFPROPERTYKEY key,const DWORD mode,DWORD *optimal_buffer_size,IStream **stream) {
    return This->lpVtbl->GetStream(This,object_id,key,mode,optimal_buffer_size,stream);
}
static __WIDL_INLINE HRESULT IPortableDeviceResources_Delete(IPortableDeviceResources* This,LPCWSTR object_id,IPortableDeviceKeyCollection *keys) {
    return This->lpVtbl->Delete(This,object_id,keys);
}
static __WIDL_INLINE HRESULT IPortableDeviceResources_Cancel(IPortableDeviceResources* This) {
    return This->lpVtbl->Cancel(This);
}
static __WIDL_INLINE HRESULT IPortableDeviceResources_CreateResource(IPortableDeviceResources* This,IPortableDeviceValues *resource_attributes,IStream **data,DWORD *optimal_write_buffer_size,LPWSTR *cookie) {
    return This->lpVtbl->CreateResource(This,resource_attributes,data,optimal_write_buffer_size,cookie);
}
#endif
#endif

#endif


#endif  /* __IPortableDeviceResources_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPortableDeviceCapabilities interface
 */
#ifndef __IPortableDeviceCapabilities_INTERFACE_DEFINED__
#define __IPortableDeviceCapabilities_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPortableDeviceCapabilities, 0x2c8c6dbf, 0xe3dc, 0x4061, 0xbe,0xcc, 0x85,0x42,0xe8,0x10,0xd1,0x26);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2c8c6dbf-e3dc-4061-becc-8542e810d126")
IPortableDeviceCapabilities : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSupportedCommands(
        IPortableDeviceKeyCollection **commands) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCommandOptions(
        REFPROPERTYKEY command,
        IPortableDeviceValues **options) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFunctionalCategories(
        IPortableDevicePropVariantCollection **categories) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFunctionalObjects(
        REFGUID category,
        IPortableDevicePropVariantCollection **object_ids) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSupportedContentTypes(
        REFGUID category,
        IPortableDevicePropVariantCollection **content_types) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSupportedFormats(
        REFGUID content_type,
        IPortableDevicePropVariantCollection **formats) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSupportedFormatProperties(
        REFGUID format,
        IPortableDeviceKeyCollection **keys) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFixedPropertyAttributes(
        REFGUID format,
        REFPROPERTYKEY key,
        IPortableDeviceValues **attributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSupportedEvents(
        IPortableDevicePropVariantCollection **events_collection) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEventOptions(
        REFGUID event_id,
        IPortableDeviceValues **options) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPortableDeviceCapabilities, 0x2c8c6dbf, 0xe3dc, 0x4061, 0xbe,0xcc, 0x85,0x42,0xe8,0x10,0xd1,0x26)
#endif
#else
typedef struct IPortableDeviceCapabilitiesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPortableDeviceCapabilities *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPortableDeviceCapabilities *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPortableDeviceCapabilities *This);

    /*** IPortableDeviceCapabilities methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSupportedCommands)(
        IPortableDeviceCapabilities *This,
        IPortableDeviceKeyCollection **commands);

    HRESULT (STDMETHODCALLTYPE *GetCommandOptions)(
        IPortableDeviceCapabilities *This,
        REFPROPERTYKEY command,
        IPortableDeviceValues **options);

    HRESULT (STDMETHODCALLTYPE *GetFunctionalCategories)(
        IPortableDeviceCapabilities *This,
        IPortableDevicePropVariantCollection **categories);

    HRESULT (STDMETHODCALLTYPE *GetFunctionalObjects)(
        IPortableDeviceCapabilities *This,
        REFGUID category,
        IPortableDevicePropVariantCollection **object_ids);

    HRESULT (STDMETHODCALLTYPE *GetSupportedContentTypes)(
        IPortableDeviceCapabilities *This,
        REFGUID category,
        IPortableDevicePropVariantCollection **content_types);

    HRESULT (STDMETHODCALLTYPE *GetSupportedFormats)(
        IPortableDeviceCapabilities *This,
        REFGUID content_type,
        IPortableDevicePropVariantCollection **formats);

    HRESULT (STDMETHODCALLTYPE *GetSupportedFormatProperties)(
        IPortableDeviceCapabilities *This,
        REFGUID format,
        IPortableDeviceKeyCollection **keys);

    HRESULT (STDMETHODCALLTYPE *GetFixedPropertyAttributes)(
        IPortableDeviceCapabilities *This,
        REFGUID format,
        REFPROPERTYKEY key,
        IPortableDeviceValues **attributes);

    HRESULT (STDMETHODCALLTYPE *Cancel)(
        IPortableDeviceCapabilities *This);

    HRESULT (STDMETHODCALLTYPE *GetSupportedEvents)(
        IPortableDeviceCapabilities *This,
        IPortableDevicePropVariantCollection **events_collection);

    HRESULT (STDMETHODCALLTYPE *GetEventOptions)(
        IPortableDeviceCapabilities *This,
        REFGUID event_id,
        IPortableDeviceValues **options);

    END_INTERFACE
} IPortableDeviceCapabilitiesVtbl;

interface IPortableDeviceCapabilities {
    CONST_VTBL IPortableDeviceCapabilitiesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPortableDeviceCapabilities_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPortableDeviceCapabilities_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPortableDeviceCapabilities_Release(This) (This)->lpVtbl->Release(This)
/*** IPortableDeviceCapabilities methods ***/
#define IPortableDeviceCapabilities_GetSupportedCommands(This,commands) (This)->lpVtbl->GetSupportedCommands(This,commands)
#define IPortableDeviceCapabilities_GetCommandOptions(This,command,options) (This)->lpVtbl->GetCommandOptions(This,command,options)
#define IPortableDeviceCapabilities_GetFunctionalCategories(This,categories) (This)->lpVtbl->GetFunctionalCategories(This,categories)
#define IPortableDeviceCapabilities_GetFunctionalObjects(This,category,object_ids) (This)->lpVtbl->GetFunctionalObjects(This,category,object_ids)
#define IPortableDeviceCapabilities_GetSupportedContentTypes(This,category,content_types) (This)->lpVtbl->GetSupportedContentTypes(This,category,content_types)
#define IPortableDeviceCapabilities_GetSupportedFormats(This,content_type,formats) (This)->lpVtbl->GetSupportedFormats(This,content_type,formats)
#define IPortableDeviceCapabilities_GetSupportedFormatProperties(This,format,keys) (This)->lpVtbl->GetSupportedFormatProperties(This,format,keys)
#define IPortableDeviceCapabilities_GetFixedPropertyAttributes(This,format,key,attributes) (This)->lpVtbl->GetFixedPropertyAttributes(This,format,key,attributes)
#define IPortableDeviceCapabilities_Cancel(This) (This)->lpVtbl->Cancel(This)
#define IPortableDeviceCapabilities_GetSupportedEvents(This,events_collection) (This)->lpVtbl->GetSupportedEvents(This,events_collection)
#define IPortableDeviceCapabilities_GetEventOptions(This,event_id,options) (This)->lpVtbl->GetEventOptions(This,event_id,options)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceCapabilities_QueryInterface(IPortableDeviceCapabilities* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPortableDeviceCapabilities_AddRef(IPortableDeviceCapabilities* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPortableDeviceCapabilities_Release(IPortableDeviceCapabilities* This) {
    return This->lpVtbl->Release(This);
}
/*** IPortableDeviceCapabilities methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceCapabilities_GetSupportedCommands(IPortableDeviceCapabilities* This,IPortableDeviceKeyCollection **commands) {
    return This->lpVtbl->GetSupportedCommands(This,commands);
}
static __WIDL_INLINE HRESULT IPortableDeviceCapabilities_GetCommandOptions(IPortableDeviceCapabilities* This,REFPROPERTYKEY command,IPortableDeviceValues **options) {
    return This->lpVtbl->GetCommandOptions(This,command,options);
}
static __WIDL_INLINE HRESULT IPortableDeviceCapabilities_GetFunctionalCategories(IPortableDeviceCapabilities* This,IPortableDevicePropVariantCollection **categories) {
    return This->lpVtbl->GetFunctionalCategories(This,categories);
}
static __WIDL_INLINE HRESULT IPortableDeviceCapabilities_GetFunctionalObjects(IPortableDeviceCapabilities* This,REFGUID category,IPortableDevicePropVariantCollection **object_ids) {
    return This->lpVtbl->GetFunctionalObjects(This,category,object_ids);
}
static __WIDL_INLINE HRESULT IPortableDeviceCapabilities_GetSupportedContentTypes(IPortableDeviceCapabilities* This,REFGUID category,IPortableDevicePropVariantCollection **content_types) {
    return This->lpVtbl->GetSupportedContentTypes(This,category,content_types);
}
static __WIDL_INLINE HRESULT IPortableDeviceCapabilities_GetSupportedFormats(IPortableDeviceCapabilities* This,REFGUID content_type,IPortableDevicePropVariantCollection **formats) {
    return This->lpVtbl->GetSupportedFormats(This,content_type,formats);
}
static __WIDL_INLINE HRESULT IPortableDeviceCapabilities_GetSupportedFormatProperties(IPortableDeviceCapabilities* This,REFGUID format,IPortableDeviceKeyCollection **keys) {
    return This->lpVtbl->GetSupportedFormatProperties(This,format,keys);
}
static __WIDL_INLINE HRESULT IPortableDeviceCapabilities_GetFixedPropertyAttributes(IPortableDeviceCapabilities* This,REFGUID format,REFPROPERTYKEY key,IPortableDeviceValues **attributes) {
    return This->lpVtbl->GetFixedPropertyAttributes(This,format,key,attributes);
}
static __WIDL_INLINE HRESULT IPortableDeviceCapabilities_Cancel(IPortableDeviceCapabilities* This) {
    return This->lpVtbl->Cancel(This);
}
static __WIDL_INLINE HRESULT IPortableDeviceCapabilities_GetSupportedEvents(IPortableDeviceCapabilities* This,IPortableDevicePropVariantCollection **events_collection) {
    return This->lpVtbl->GetSupportedEvents(This,events_collection);
}
static __WIDL_INLINE HRESULT IPortableDeviceCapabilities_GetEventOptions(IPortableDeviceCapabilities* This,REFGUID event_id,IPortableDeviceValues **options) {
    return This->lpVtbl->GetEventOptions(This,event_id,options);
}
#endif
#endif

#endif


#endif  /* __IPortableDeviceCapabilities_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPortableDeviceEventCallback interface
 */
#ifndef __IPortableDeviceEventCallback_INTERFACE_DEFINED__
#define __IPortableDeviceEventCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPortableDeviceEventCallback, 0xa8792a31, 0xf385, 0x493c, 0xa8,0x93, 0x40,0xf6,0x4e,0xb4,0x5f,0x6e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a8792a31-f385-493c-a893-40f64eb45f6e")
IPortableDeviceEventCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnEvent(
        IPortableDeviceValues *event_parameters) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPortableDeviceEventCallback, 0xa8792a31, 0xf385, 0x493c, 0xa8,0x93, 0x40,0xf6,0x4e,0xb4,0x5f,0x6e)
#endif
#else
typedef struct IPortableDeviceEventCallbackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPortableDeviceEventCallback *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPortableDeviceEventCallback *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPortableDeviceEventCallback *This);

    /*** IPortableDeviceEventCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnEvent)(
        IPortableDeviceEventCallback *This,
        IPortableDeviceValues *event_parameters);

    END_INTERFACE
} IPortableDeviceEventCallbackVtbl;

interface IPortableDeviceEventCallback {
    CONST_VTBL IPortableDeviceEventCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPortableDeviceEventCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPortableDeviceEventCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPortableDeviceEventCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IPortableDeviceEventCallback methods ***/
#define IPortableDeviceEventCallback_OnEvent(This,event_parameters) (This)->lpVtbl->OnEvent(This,event_parameters)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceEventCallback_QueryInterface(IPortableDeviceEventCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPortableDeviceEventCallback_AddRef(IPortableDeviceEventCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPortableDeviceEventCallback_Release(IPortableDeviceEventCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IPortableDeviceEventCallback methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceEventCallback_OnEvent(IPortableDeviceEventCallback* This,IPortableDeviceValues *event_parameters) {
    return This->lpVtbl->OnEvent(This,event_parameters);
}
#endif
#endif

#endif


#endif  /* __IPortableDeviceEventCallback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPortableDeviceDataStream interface
 */
#ifndef __IPortableDeviceDataStream_INTERFACE_DEFINED__
#define __IPortableDeviceDataStream_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPortableDeviceDataStream, 0x88e04db3, 0x1012, 0x4d64, 0x99,0x96, 0xf7,0x03,0xa9,0x50,0xd3,0xf4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("88e04db3-1012-4d64-9996-f703a950d3f4")
IPortableDeviceDataStream : public IStream
{
    virtual HRESULT STDMETHODCALLTYPE GetObjectID(
        LPWSTR *object_id) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPortableDeviceDataStream, 0x88e04db3, 0x1012, 0x4d64, 0x99,0x96, 0xf7,0x03,0xa9,0x50,0xd3,0xf4)
#endif
#else
typedef struct IPortableDeviceDataStreamVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPortableDeviceDataStream *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPortableDeviceDataStream *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPortableDeviceDataStream *This);

    /*** ISequentialStream methods ***/
    HRESULT (STDMETHODCALLTYPE *Read)(
        IPortableDeviceDataStream *This,
        void *pv,
        ULONG cb,
        ULONG *pcbRead);

    HRESULT (STDMETHODCALLTYPE *Write)(
        IPortableDeviceDataStream *This,
        const void *pv,
        ULONG cb,
        ULONG *pcbWritten);

    /*** IStream methods ***/
    HRESULT (STDMETHODCALLTYPE *Seek)(
        IPortableDeviceDataStream *This,
        LARGE_INTEGER dlibMove,
        DWORD dwOrigin,
        ULARGE_INTEGER *plibNewPosition);

    HRESULT (STDMETHODCALLTYPE *SetSize)(
        IPortableDeviceDataStream *This,
        ULARGE_INTEGER libNewSize);

    HRESULT (STDMETHODCALLTYPE *CopyTo)(
        IPortableDeviceDataStream *This,
        IStream *pstm,
        ULARGE_INTEGER cb,
        ULARGE_INTEGER *pcbRead,
        ULARGE_INTEGER *pcbWritten);

    HRESULT (STDMETHODCALLTYPE *Commit)(
        IPortableDeviceDataStream *This,
        DWORD grfCommitFlags);

    HRESULT (STDMETHODCALLTYPE *Revert)(
        IPortableDeviceDataStream *This);

    HRESULT (STDMETHODCALLTYPE *LockRegion)(
        IPortableDeviceDataStream *This,
        ULARGE_INTEGER libOffset,
        ULARGE_INTEGER cb,
        DWORD dwLockType);

    HRESULT (STDMETHODCALLTYPE *UnlockRegion)(
        IPortableDeviceDataStream *This,
        ULARGE_INTEGER libOffset,
        ULARGE_INTEGER cb,
        DWORD dwLockType);

    HRESULT (STDMETHODCALLTYPE *Stat)(
        IPortableDeviceDataStream *This,
        STATSTG *pstatstg,
        DWORD grfStatFlag);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IPortableDeviceDataStream *This,
        IStream **ppstm);

    /*** IPortableDeviceDataStream methods ***/
    HRESULT (STDMETHODCALLTYPE *GetObjectID)(
        IPortableDeviceDataStream *This,
        LPWSTR *object_id);

    HRESULT (STDMETHODCALLTYPE *Cancel)(
        IPortableDeviceDataStream *This);

    END_INTERFACE
} IPortableDeviceDataStreamVtbl;

interface IPortableDeviceDataStream {
    CONST_VTBL IPortableDeviceDataStreamVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPortableDeviceDataStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPortableDeviceDataStream_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPortableDeviceDataStream_Release(This) (This)->lpVtbl->Release(This)
/*** ISequentialStream methods ***/
#define IPortableDeviceDataStream_Read(This,pv,cb,pcbRead) (This)->lpVtbl->Read(This,pv,cb,pcbRead)
#define IPortableDeviceDataStream_Write(This,pv,cb,pcbWritten) (This)->lpVtbl->Write(This,pv,cb,pcbWritten)
/*** IStream methods ***/
#define IPortableDeviceDataStream_Seek(This,dlibMove,dwOrigin,plibNewPosition) (This)->lpVtbl->Seek(This,dlibMove,dwOrigin,plibNewPosition)
#define IPortableDeviceDataStream_SetSize(This,libNewSize) (This)->lpVtbl->SetSize(This,libNewSize)
#define IPortableDeviceDataStream_CopyTo(This,pstm,cb,pcbRead,pcbWritten) (This)->lpVtbl->CopyTo(This,pstm,cb,pcbRead,pcbWritten)
#define IPortableDeviceDataStream_Commit(This,grfCommitFlags) (This)->lpVtbl->Commit(This,grfCommitFlags)
#define IPortableDeviceDataStream_Revert(This) (This)->lpVtbl->Revert(This)
#define IPortableDeviceDataStream_LockRegion(This,libOffset,cb,dwLockType) (This)->lpVtbl->LockRegion(This,libOffset,cb,dwLockType)
#define IPortableDeviceDataStream_UnlockRegion(This,libOffset,cb,dwLockType) (This)->lpVtbl->UnlockRegion(This,libOffset,cb,dwLockType)
#define IPortableDeviceDataStream_Stat(This,pstatstg,grfStatFlag) (This)->lpVtbl->Stat(This,pstatstg,grfStatFlag)
#define IPortableDeviceDataStream_Clone(This,ppstm) (This)->lpVtbl->Clone(This,ppstm)
/*** IPortableDeviceDataStream methods ***/
#define IPortableDeviceDataStream_GetObjectID(This,object_id) (This)->lpVtbl->GetObjectID(This,object_id)
#define IPortableDeviceDataStream_Cancel(This) (This)->lpVtbl->Cancel(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceDataStream_QueryInterface(IPortableDeviceDataStream* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPortableDeviceDataStream_AddRef(IPortableDeviceDataStream* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPortableDeviceDataStream_Release(IPortableDeviceDataStream* This) {
    return This->lpVtbl->Release(This);
}
/*** ISequentialStream methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceDataStream_Read(IPortableDeviceDataStream* This,void *pv,ULONG cb,ULONG *pcbRead) {
    return This->lpVtbl->Read(This,pv,cb,pcbRead);
}
static __WIDL_INLINE HRESULT IPortableDeviceDataStream_Write(IPortableDeviceDataStream* This,const void *pv,ULONG cb,ULONG *pcbWritten) {
    return This->lpVtbl->Write(This,pv,cb,pcbWritten);
}
/*** IStream methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceDataStream_Seek(IPortableDeviceDataStream* This,LARGE_INTEGER dlibMove,DWORD dwOrigin,ULARGE_INTEGER *plibNewPosition) {
    return This->lpVtbl->Seek(This,dlibMove,dwOrigin,plibNewPosition);
}
static __WIDL_INLINE HRESULT IPortableDeviceDataStream_SetSize(IPortableDeviceDataStream* This,ULARGE_INTEGER libNewSize) {
    return This->lpVtbl->SetSize(This,libNewSize);
}
static __WIDL_INLINE HRESULT IPortableDeviceDataStream_CopyTo(IPortableDeviceDataStream* This,IStream *pstm,ULARGE_INTEGER cb,ULARGE_INTEGER *pcbRead,ULARGE_INTEGER *pcbWritten) {
    return This->lpVtbl->CopyTo(This,pstm,cb,pcbRead,pcbWritten);
}
static __WIDL_INLINE HRESULT IPortableDeviceDataStream_Commit(IPortableDeviceDataStream* This,DWORD grfCommitFlags) {
    return This->lpVtbl->Commit(This,grfCommitFlags);
}
static __WIDL_INLINE HRESULT IPortableDeviceDataStream_Revert(IPortableDeviceDataStream* This) {
    return This->lpVtbl->Revert(This);
}
static __WIDL_INLINE HRESULT IPortableDeviceDataStream_LockRegion(IPortableDeviceDataStream* This,ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,DWORD dwLockType) {
    return This->lpVtbl->LockRegion(This,libOffset,cb,dwLockType);
}
static __WIDL_INLINE HRESULT IPortableDeviceDataStream_UnlockRegion(IPortableDeviceDataStream* This,ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,DWORD dwLockType) {
    return This->lpVtbl->UnlockRegion(This,libOffset,cb,dwLockType);
}
static __WIDL_INLINE HRESULT IPortableDeviceDataStream_Stat(IPortableDeviceDataStream* This,STATSTG *pstatstg,DWORD grfStatFlag) {
    return This->lpVtbl->Stat(This,pstatstg,grfStatFlag);
}
static __WIDL_INLINE HRESULT IPortableDeviceDataStream_Clone(IPortableDeviceDataStream* This,IStream **ppstm) {
    return This->lpVtbl->Clone(This,ppstm);
}
/*** IPortableDeviceDataStream methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceDataStream_GetObjectID(IPortableDeviceDataStream* This,LPWSTR *object_id) {
    return This->lpVtbl->GetObjectID(This,object_id);
}
static __WIDL_INLINE HRESULT IPortableDeviceDataStream_Cancel(IPortableDeviceDataStream* This) {
    return This->lpVtbl->Cancel(This);
}
#endif
#endif

#endif


#endif  /* __IPortableDeviceDataStream_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPortableDeviceUnitsStream interface
 */
#ifndef __IPortableDeviceUnitsStream_INTERFACE_DEFINED__
#define __IPortableDeviceUnitsStream_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPortableDeviceUnitsStream, 0x5e98025f, 0xbfc4, 0x47a2, 0x9a,0x5f, 0xbc,0x90,0x0a,0x50,0x7c,0x67);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5e98025f-bfc4-47a2-9a5f-bc900a507c67")
IPortableDeviceUnitsStream : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SeekInUnits(
        LARGE_INTEGER dlib_move,
        WPD_STREAM_UNITS units,
        DWORD origin,
        ULARGE_INTEGER *lib_new_position) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPortableDeviceUnitsStream, 0x5e98025f, 0xbfc4, 0x47a2, 0x9a,0x5f, 0xbc,0x90,0x0a,0x50,0x7c,0x67)
#endif
#else
typedef struct IPortableDeviceUnitsStreamVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPortableDeviceUnitsStream *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPortableDeviceUnitsStream *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPortableDeviceUnitsStream *This);

    /*** IPortableDeviceUnitsStream methods ***/
    HRESULT (STDMETHODCALLTYPE *SeekInUnits)(
        IPortableDeviceUnitsStream *This,
        LARGE_INTEGER dlib_move,
        WPD_STREAM_UNITS units,
        DWORD origin,
        ULARGE_INTEGER *lib_new_position);

    HRESULT (STDMETHODCALLTYPE *Cancel)(
        IPortableDeviceUnitsStream *This);

    END_INTERFACE
} IPortableDeviceUnitsStreamVtbl;

interface IPortableDeviceUnitsStream {
    CONST_VTBL IPortableDeviceUnitsStreamVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPortableDeviceUnitsStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPortableDeviceUnitsStream_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPortableDeviceUnitsStream_Release(This) (This)->lpVtbl->Release(This)
/*** IPortableDeviceUnitsStream methods ***/
#define IPortableDeviceUnitsStream_SeekInUnits(This,dlib_move,units,origin,lib_new_position) (This)->lpVtbl->SeekInUnits(This,dlib_move,units,origin,lib_new_position)
#define IPortableDeviceUnitsStream_Cancel(This) (This)->lpVtbl->Cancel(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceUnitsStream_QueryInterface(IPortableDeviceUnitsStream* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPortableDeviceUnitsStream_AddRef(IPortableDeviceUnitsStream* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPortableDeviceUnitsStream_Release(IPortableDeviceUnitsStream* This) {
    return This->lpVtbl->Release(This);
}
/*** IPortableDeviceUnitsStream methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceUnitsStream_SeekInUnits(IPortableDeviceUnitsStream* This,LARGE_INTEGER dlib_move,WPD_STREAM_UNITS units,DWORD origin,ULARGE_INTEGER *lib_new_position) {
    return This->lpVtbl->SeekInUnits(This,dlib_move,units,origin,lib_new_position);
}
static __WIDL_INLINE HRESULT IPortableDeviceUnitsStream_Cancel(IPortableDeviceUnitsStream* This) {
    return This->lpVtbl->Cancel(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IPortableDeviceUnitsStream_RemoteSeekInUnits_Proxy(
    IPortableDeviceUnitsStream* This,
    LARGE_INTEGER dlib_move,
    WPD_STREAM_UNITS units,
    DWORD origin,
    ULARGE_INTEGER *lib_new_position);
void __RPC_STUB IPortableDeviceUnitsStream_RemoteSeekInUnits_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IPortableDeviceUnitsStream_SeekInUnits_Proxy(
    IPortableDeviceUnitsStream* This,
    LARGE_INTEGER dlib_move,
    WPD_STREAM_UNITS units,
    DWORD origin,
    ULARGE_INTEGER *lib_new_position);
HRESULT __RPC_STUB IPortableDeviceUnitsStream_SeekInUnits_Stub(
    IPortableDeviceUnitsStream* This,
    LARGE_INTEGER dlib_move,
    WPD_STREAM_UNITS units,
    DWORD origin,
    ULARGE_INTEGER *lib_new_position);

#endif  /* __IPortableDeviceUnitsStream_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPortableDevicePropertiesBulk interface
 */
#ifndef __IPortableDevicePropertiesBulk_INTERFACE_DEFINED__
#define __IPortableDevicePropertiesBulk_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPortableDevicePropertiesBulk, 0x482b05c0, 0x4056, 0x44ed, 0x9e,0x0f, 0x5e,0x23,0xb0,0x09,0xda,0x93);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("482b05c0-4056-44ed-9e0f-5e23b009da93")
IPortableDevicePropertiesBulk : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE QueueGetValuesByObjectList(
        IPortableDevicePropVariantCollection *object_ids,
        IPortableDeviceKeyCollection *keys,
        IPortableDevicePropertiesBulkCallback *callback,
        GUID *context) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueueGetValuesByObjectFormat(
        REFGUID guid_object_format,
        LPCWSTR parent_object_id,
        const DWORD depth,
        IPortableDeviceKeyCollection *keys,
        IPortableDevicePropertiesBulkCallback *callback,
        GUID *context) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueueSetValuesByObjectList(
        IPortableDeviceValuesCollection *object_values,
        IPortableDevicePropertiesBulkCallback *callback,
        GUID *context) = 0;

    virtual HRESULT STDMETHODCALLTYPE Start(
        REFGUID context) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        REFGUID context) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPortableDevicePropertiesBulk, 0x482b05c0, 0x4056, 0x44ed, 0x9e,0x0f, 0x5e,0x23,0xb0,0x09,0xda,0x93)
#endif
#else
typedef struct IPortableDevicePropertiesBulkVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPortableDevicePropertiesBulk *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPortableDevicePropertiesBulk *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPortableDevicePropertiesBulk *This);

    /*** IPortableDevicePropertiesBulk methods ***/
    HRESULT (STDMETHODCALLTYPE *QueueGetValuesByObjectList)(
        IPortableDevicePropertiesBulk *This,
        IPortableDevicePropVariantCollection *object_ids,
        IPortableDeviceKeyCollection *keys,
        IPortableDevicePropertiesBulkCallback *callback,
        GUID *context);

    HRESULT (STDMETHODCALLTYPE *QueueGetValuesByObjectFormat)(
        IPortableDevicePropertiesBulk *This,
        REFGUID guid_object_format,
        LPCWSTR parent_object_id,
        const DWORD depth,
        IPortableDeviceKeyCollection *keys,
        IPortableDevicePropertiesBulkCallback *callback,
        GUID *context);

    HRESULT (STDMETHODCALLTYPE *QueueSetValuesByObjectList)(
        IPortableDevicePropertiesBulk *This,
        IPortableDeviceValuesCollection *object_values,
        IPortableDevicePropertiesBulkCallback *callback,
        GUID *context);

    HRESULT (STDMETHODCALLTYPE *Start)(
        IPortableDevicePropertiesBulk *This,
        REFGUID context);

    HRESULT (STDMETHODCALLTYPE *Cancel)(
        IPortableDevicePropertiesBulk *This,
        REFGUID context);

    END_INTERFACE
} IPortableDevicePropertiesBulkVtbl;

interface IPortableDevicePropertiesBulk {
    CONST_VTBL IPortableDevicePropertiesBulkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPortableDevicePropertiesBulk_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPortableDevicePropertiesBulk_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPortableDevicePropertiesBulk_Release(This) (This)->lpVtbl->Release(This)
/*** IPortableDevicePropertiesBulk methods ***/
#define IPortableDevicePropertiesBulk_QueueGetValuesByObjectList(This,object_ids,keys,callback,context) (This)->lpVtbl->QueueGetValuesByObjectList(This,object_ids,keys,callback,context)
#define IPortableDevicePropertiesBulk_QueueGetValuesByObjectFormat(This,guid_object_format,parent_object_id,depth,keys,callback,context) (This)->lpVtbl->QueueGetValuesByObjectFormat(This,guid_object_format,parent_object_id,depth,keys,callback,context)
#define IPortableDevicePropertiesBulk_QueueSetValuesByObjectList(This,object_values,callback,context) (This)->lpVtbl->QueueSetValuesByObjectList(This,object_values,callback,context)
#define IPortableDevicePropertiesBulk_Start(This,context) (This)->lpVtbl->Start(This,context)
#define IPortableDevicePropertiesBulk_Cancel(This,context) (This)->lpVtbl->Cancel(This,context)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPortableDevicePropertiesBulk_QueryInterface(IPortableDevicePropertiesBulk* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPortableDevicePropertiesBulk_AddRef(IPortableDevicePropertiesBulk* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPortableDevicePropertiesBulk_Release(IPortableDevicePropertiesBulk* This) {
    return This->lpVtbl->Release(This);
}
/*** IPortableDevicePropertiesBulk methods ***/
static __WIDL_INLINE HRESULT IPortableDevicePropertiesBulk_QueueGetValuesByObjectList(IPortableDevicePropertiesBulk* This,IPortableDevicePropVariantCollection *object_ids,IPortableDeviceKeyCollection *keys,IPortableDevicePropertiesBulkCallback *callback,GUID *context) {
    return This->lpVtbl->QueueGetValuesByObjectList(This,object_ids,keys,callback,context);
}
static __WIDL_INLINE HRESULT IPortableDevicePropertiesBulk_QueueGetValuesByObjectFormat(IPortableDevicePropertiesBulk* This,REFGUID guid_object_format,LPCWSTR parent_object_id,const DWORD depth,IPortableDeviceKeyCollection *keys,IPortableDevicePropertiesBulkCallback *callback,GUID *context) {
    return This->lpVtbl->QueueGetValuesByObjectFormat(This,guid_object_format,parent_object_id,depth,keys,callback,context);
}
static __WIDL_INLINE HRESULT IPortableDevicePropertiesBulk_QueueSetValuesByObjectList(IPortableDevicePropertiesBulk* This,IPortableDeviceValuesCollection *object_values,IPortableDevicePropertiesBulkCallback *callback,GUID *context) {
    return This->lpVtbl->QueueSetValuesByObjectList(This,object_values,callback,context);
}
static __WIDL_INLINE HRESULT IPortableDevicePropertiesBulk_Start(IPortableDevicePropertiesBulk* This,REFGUID context) {
    return This->lpVtbl->Start(This,context);
}
static __WIDL_INLINE HRESULT IPortableDevicePropertiesBulk_Cancel(IPortableDevicePropertiesBulk* This,REFGUID context) {
    return This->lpVtbl->Cancel(This,context);
}
#endif
#endif

#endif


#endif  /* __IPortableDevicePropertiesBulk_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPortableDevicePropertiesBulkCallback interface
 */
#ifndef __IPortableDevicePropertiesBulkCallback_INTERFACE_DEFINED__
#define __IPortableDevicePropertiesBulkCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPortableDevicePropertiesBulkCallback, 0x9deacb80, 0x11e8, 0x40e3, 0xa9,0xf3, 0xf5,0x57,0x98,0x6a,0x78,0x45);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9deacb80-11e8-40e3-a9f3-f557986a7845")
IPortableDevicePropertiesBulkCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnStart(
        REFGUID context) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnProgress(
        REFGUID context,
        IPortableDeviceValuesCollection *results) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnEnd(
        REFGUID context,
        HRESULT hr_status) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPortableDevicePropertiesBulkCallback, 0x9deacb80, 0x11e8, 0x40e3, 0xa9,0xf3, 0xf5,0x57,0x98,0x6a,0x78,0x45)
#endif
#else
typedef struct IPortableDevicePropertiesBulkCallbackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPortableDevicePropertiesBulkCallback *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPortableDevicePropertiesBulkCallback *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPortableDevicePropertiesBulkCallback *This);

    /*** IPortableDevicePropertiesBulkCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnStart)(
        IPortableDevicePropertiesBulkCallback *This,
        REFGUID context);

    HRESULT (STDMETHODCALLTYPE *OnProgress)(
        IPortableDevicePropertiesBulkCallback *This,
        REFGUID context,
        IPortableDeviceValuesCollection *results);

    HRESULT (STDMETHODCALLTYPE *OnEnd)(
        IPortableDevicePropertiesBulkCallback *This,
        REFGUID context,
        HRESULT hr_status);

    END_INTERFACE
} IPortableDevicePropertiesBulkCallbackVtbl;

interface IPortableDevicePropertiesBulkCallback {
    CONST_VTBL IPortableDevicePropertiesBulkCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPortableDevicePropertiesBulkCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPortableDevicePropertiesBulkCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPortableDevicePropertiesBulkCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IPortableDevicePropertiesBulkCallback methods ***/
#define IPortableDevicePropertiesBulkCallback_OnStart(This,context) (This)->lpVtbl->OnStart(This,context)
#define IPortableDevicePropertiesBulkCallback_OnProgress(This,context,results) (This)->lpVtbl->OnProgress(This,context,results)
#define IPortableDevicePropertiesBulkCallback_OnEnd(This,context,hr_status) (This)->lpVtbl->OnEnd(This,context,hr_status)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPortableDevicePropertiesBulkCallback_QueryInterface(IPortableDevicePropertiesBulkCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPortableDevicePropertiesBulkCallback_AddRef(IPortableDevicePropertiesBulkCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPortableDevicePropertiesBulkCallback_Release(IPortableDevicePropertiesBulkCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IPortableDevicePropertiesBulkCallback methods ***/
static __WIDL_INLINE HRESULT IPortableDevicePropertiesBulkCallback_OnStart(IPortableDevicePropertiesBulkCallback* This,REFGUID context) {
    return This->lpVtbl->OnStart(This,context);
}
static __WIDL_INLINE HRESULT IPortableDevicePropertiesBulkCallback_OnProgress(IPortableDevicePropertiesBulkCallback* This,REFGUID context,IPortableDeviceValuesCollection *results) {
    return This->lpVtbl->OnProgress(This,context,results);
}
static __WIDL_INLINE HRESULT IPortableDevicePropertiesBulkCallback_OnEnd(IPortableDevicePropertiesBulkCallback* This,REFGUID context,HRESULT hr_status) {
    return This->lpVtbl->OnEnd(This,context,hr_status);
}
#endif
#endif

#endif


#endif  /* __IPortableDevicePropertiesBulkCallback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPortableDeviceServiceManager interface
 */
#ifndef __IPortableDeviceServiceManager_INTERFACE_DEFINED__
#define __IPortableDeviceServiceManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPortableDeviceServiceManager, 0xa8abc4e9, 0xa84a, 0x47a9, 0x80,0xb3, 0xc5,0xd9,0xb1,0x72,0xa9,0x61);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a8abc4e9-a84a-47a9-80b3-c5d9b172a961")
IPortableDeviceServiceManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDeviceServices(
        LPCWSTR device_id,
        REFGUID guid_service_category,
        LPWSTR *services,
        DWORD *services_count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeviceForService(
        LPCWSTR service_id,
        LPWSTR *device_id) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPortableDeviceServiceManager, 0xa8abc4e9, 0xa84a, 0x47a9, 0x80,0xb3, 0xc5,0xd9,0xb1,0x72,0xa9,0x61)
#endif
#else
typedef struct IPortableDeviceServiceManagerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPortableDeviceServiceManager *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPortableDeviceServiceManager *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPortableDeviceServiceManager *This);

    /*** IPortableDeviceServiceManager methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDeviceServices)(
        IPortableDeviceServiceManager *This,
        LPCWSTR device_id,
        REFGUID guid_service_category,
        LPWSTR *services,
        DWORD *services_count);

    HRESULT (STDMETHODCALLTYPE *GetDeviceForService)(
        IPortableDeviceServiceManager *This,
        LPCWSTR service_id,
        LPWSTR *device_id);

    END_INTERFACE
} IPortableDeviceServiceManagerVtbl;

interface IPortableDeviceServiceManager {
    CONST_VTBL IPortableDeviceServiceManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPortableDeviceServiceManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPortableDeviceServiceManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPortableDeviceServiceManager_Release(This) (This)->lpVtbl->Release(This)
/*** IPortableDeviceServiceManager methods ***/
#define IPortableDeviceServiceManager_GetDeviceServices(This,device_id,guid_service_category,services,services_count) (This)->lpVtbl->GetDeviceServices(This,device_id,guid_service_category,services,services_count)
#define IPortableDeviceServiceManager_GetDeviceForService(This,service_id,device_id) (This)->lpVtbl->GetDeviceForService(This,service_id,device_id)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceServiceManager_QueryInterface(IPortableDeviceServiceManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPortableDeviceServiceManager_AddRef(IPortableDeviceServiceManager* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPortableDeviceServiceManager_Release(IPortableDeviceServiceManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IPortableDeviceServiceManager methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceServiceManager_GetDeviceServices(IPortableDeviceServiceManager* This,LPCWSTR device_id,REFGUID guid_service_category,LPWSTR *services,DWORD *services_count) {
    return This->lpVtbl->GetDeviceServices(This,device_id,guid_service_category,services,services_count);
}
static __WIDL_INLINE HRESULT IPortableDeviceServiceManager_GetDeviceForService(IPortableDeviceServiceManager* This,LPCWSTR service_id,LPWSTR *device_id) {
    return This->lpVtbl->GetDeviceForService(This,service_id,device_id);
}
#endif
#endif

#endif


#endif  /* __IPortableDeviceServiceManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPortableDeviceService interface
 */
#ifndef __IPortableDeviceService_INTERFACE_DEFINED__
#define __IPortableDeviceService_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPortableDeviceService, 0xd3bd3a44, 0xd7b5, 0x40a9, 0x98,0xb7, 0x2f,0xa4,0xd0,0x1d,0xec,0x08);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d3bd3a44-d7b5-40a9-98b7-2fa4d01dec08")
IPortableDeviceService : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Open(
        LPCWSTR service_id,
        IPortableDeviceValues *client_info) = 0;

    virtual HRESULT STDMETHODCALLTYPE Capabilities(
        IPortableDeviceServiceCapabilities **capabilities) = 0;

    virtual HRESULT STDMETHODCALLTYPE Content(
        IPortableDeviceContent2 **content) = 0;

    virtual HRESULT STDMETHODCALLTYPE Methods(
        IPortableDeviceServiceMethods **service_methods) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Close(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetServiceObjectID(
        LPWSTR *service_object_id) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPnPServiceID(
        LPWSTR *service_id) = 0;

    virtual HRESULT STDMETHODCALLTYPE Advise(
        const DWORD flags,
        IPortableDeviceEventCallback *callback,
        IPortableDeviceValues *parameters,
        LPWSTR *cookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unadvise(
        LPCWSTR cookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE SendCommand(
        const DWORD flags,
        IPortableDeviceValues *parameters,
        IPortableDeviceValues **results) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPortableDeviceService, 0xd3bd3a44, 0xd7b5, 0x40a9, 0x98,0xb7, 0x2f,0xa4,0xd0,0x1d,0xec,0x08)
#endif
#else
typedef struct IPortableDeviceServiceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPortableDeviceService *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPortableDeviceService *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPortableDeviceService *This);

    /*** IPortableDeviceService methods ***/
    HRESULT (STDMETHODCALLTYPE *Open)(
        IPortableDeviceService *This,
        LPCWSTR service_id,
        IPortableDeviceValues *client_info);

    HRESULT (STDMETHODCALLTYPE *Capabilities)(
        IPortableDeviceService *This,
        IPortableDeviceServiceCapabilities **capabilities);

    HRESULT (STDMETHODCALLTYPE *Content)(
        IPortableDeviceService *This,
        IPortableDeviceContent2 **content);

    HRESULT (STDMETHODCALLTYPE *Methods)(
        IPortableDeviceService *This,
        IPortableDeviceServiceMethods **service_methods);

    HRESULT (STDMETHODCALLTYPE *Cancel)(
        IPortableDeviceService *This);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IPortableDeviceService *This);

    HRESULT (STDMETHODCALLTYPE *GetServiceObjectID)(
        IPortableDeviceService *This,
        LPWSTR *service_object_id);

    HRESULT (STDMETHODCALLTYPE *GetPnPServiceID)(
        IPortableDeviceService *This,
        LPWSTR *service_id);

    HRESULT (STDMETHODCALLTYPE *Advise)(
        IPortableDeviceService *This,
        const DWORD flags,
        IPortableDeviceEventCallback *callback,
        IPortableDeviceValues *parameters,
        LPWSTR *cookie);

    HRESULT (STDMETHODCALLTYPE *Unadvise)(
        IPortableDeviceService *This,
        LPCWSTR cookie);

    HRESULT (STDMETHODCALLTYPE *SendCommand)(
        IPortableDeviceService *This,
        const DWORD flags,
        IPortableDeviceValues *parameters,
        IPortableDeviceValues **results);

    END_INTERFACE
} IPortableDeviceServiceVtbl;

interface IPortableDeviceService {
    CONST_VTBL IPortableDeviceServiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPortableDeviceService_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPortableDeviceService_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPortableDeviceService_Release(This) (This)->lpVtbl->Release(This)
/*** IPortableDeviceService methods ***/
#define IPortableDeviceService_Open(This,service_id,client_info) (This)->lpVtbl->Open(This,service_id,client_info)
#define IPortableDeviceService_Capabilities(This,capabilities) (This)->lpVtbl->Capabilities(This,capabilities)
#define IPortableDeviceService_Content(This,content) (This)->lpVtbl->Content(This,content)
#define IPortableDeviceService_Methods(This,service_methods) (This)->lpVtbl->Methods(This,service_methods)
#define IPortableDeviceService_Cancel(This) (This)->lpVtbl->Cancel(This)
#define IPortableDeviceService_Close(This) (This)->lpVtbl->Close(This)
#define IPortableDeviceService_GetServiceObjectID(This,service_object_id) (This)->lpVtbl->GetServiceObjectID(This,service_object_id)
#define IPortableDeviceService_GetPnPServiceID(This,service_id) (This)->lpVtbl->GetPnPServiceID(This,service_id)
#define IPortableDeviceService_Advise(This,flags,callback,parameters,cookie) (This)->lpVtbl->Advise(This,flags,callback,parameters,cookie)
#define IPortableDeviceService_Unadvise(This,cookie) (This)->lpVtbl->Unadvise(This,cookie)
#define IPortableDeviceService_SendCommand(This,flags,parameters,results) (This)->lpVtbl->SendCommand(This,flags,parameters,results)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceService_QueryInterface(IPortableDeviceService* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPortableDeviceService_AddRef(IPortableDeviceService* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPortableDeviceService_Release(IPortableDeviceService* This) {
    return This->lpVtbl->Release(This);
}
/*** IPortableDeviceService methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceService_Open(IPortableDeviceService* This,LPCWSTR service_id,IPortableDeviceValues *client_info) {
    return This->lpVtbl->Open(This,service_id,client_info);
}
static __WIDL_INLINE HRESULT IPortableDeviceService_Capabilities(IPortableDeviceService* This,IPortableDeviceServiceCapabilities **capabilities) {
    return This->lpVtbl->Capabilities(This,capabilities);
}
static __WIDL_INLINE HRESULT IPortableDeviceService_Content(IPortableDeviceService* This,IPortableDeviceContent2 **content) {
    return This->lpVtbl->Content(This,content);
}
static __WIDL_INLINE HRESULT IPortableDeviceService_Methods(IPortableDeviceService* This,IPortableDeviceServiceMethods **service_methods) {
    return This->lpVtbl->Methods(This,service_methods);
}
static __WIDL_INLINE HRESULT IPortableDeviceService_Cancel(IPortableDeviceService* This) {
    return This->lpVtbl->Cancel(This);
}
static __WIDL_INLINE HRESULT IPortableDeviceService_Close(IPortableDeviceService* This) {
    return This->lpVtbl->Close(This);
}
static __WIDL_INLINE HRESULT IPortableDeviceService_GetServiceObjectID(IPortableDeviceService* This,LPWSTR *service_object_id) {
    return This->lpVtbl->GetServiceObjectID(This,service_object_id);
}
static __WIDL_INLINE HRESULT IPortableDeviceService_GetPnPServiceID(IPortableDeviceService* This,LPWSTR *service_id) {
    return This->lpVtbl->GetPnPServiceID(This,service_id);
}
static __WIDL_INLINE HRESULT IPortableDeviceService_Advise(IPortableDeviceService* This,const DWORD flags,IPortableDeviceEventCallback *callback,IPortableDeviceValues *parameters,LPWSTR *cookie) {
    return This->lpVtbl->Advise(This,flags,callback,parameters,cookie);
}
static __WIDL_INLINE HRESULT IPortableDeviceService_Unadvise(IPortableDeviceService* This,LPCWSTR cookie) {
    return This->lpVtbl->Unadvise(This,cookie);
}
static __WIDL_INLINE HRESULT IPortableDeviceService_SendCommand(IPortableDeviceService* This,const DWORD flags,IPortableDeviceValues *parameters,IPortableDeviceValues **results) {
    return This->lpVtbl->SendCommand(This,flags,parameters,results);
}
#endif
#endif

#endif


#endif  /* __IPortableDeviceService_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPortableDeviceServiceCapabilities interface
 */
#ifndef __IPortableDeviceServiceCapabilities_INTERFACE_DEFINED__
#define __IPortableDeviceServiceCapabilities_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPortableDeviceServiceCapabilities, 0x24dbd89d, 0x413e, 0x43e0, 0xbd,0x5b, 0x19,0x7f,0x3c,0x56,0xc8,0x86);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("24dbd89d-413e-43e0-bd5b-197f3c56c886")
IPortableDeviceServiceCapabilities : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSupportedMethods(
        IPortableDevicePropVariantCollection **supported_methods) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSupportedMethodsByFormat(
        REFGUID format,
        IPortableDevicePropVariantCollection **supported_methods) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMethodAttributes(
        REFGUID method,
        IPortableDeviceValues **attributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMethodParameterAttributes(
        REFGUID method,
        REFPROPERTYKEY parameter,
        IPortableDeviceValues **attributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSupportedFormats(
        IPortableDevicePropVariantCollection **formats) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFormatAttributes(
        REFGUID format,
        IPortableDeviceValues **attributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSupportedFormatProperties(
        REFGUID format,
        IPortableDeviceKeyCollection **keys) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFormatPropertyAttributes(
        REFGUID format,
        REFPROPERTYKEY property,
        IPortableDeviceValues **attributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSupportedEvents(
        IPortableDevicePropVariantCollection **events) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEventAttributes(
        REFGUID event_id,
        IPortableDeviceValues **attributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEventParameterAttributes(
        REFGUID event_id,
        REFPROPERTYKEY parameter,
        IPortableDeviceValues **attributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInheritedServices(
        const DWORD inheritance_type,
        IPortableDevicePropVariantCollection **services) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFormatRenderingProfiles(
        REFGUID format,
        IPortableDeviceValuesCollection **rendering_profiles) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSupportedCommands(
        IPortableDeviceKeyCollection **commands) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCommandOptions(
        REFPROPERTYKEY command,
        IPortableDeviceValues **options) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPortableDeviceServiceCapabilities, 0x24dbd89d, 0x413e, 0x43e0, 0xbd,0x5b, 0x19,0x7f,0x3c,0x56,0xc8,0x86)
#endif
#else
typedef struct IPortableDeviceServiceCapabilitiesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPortableDeviceServiceCapabilities *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPortableDeviceServiceCapabilities *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPortableDeviceServiceCapabilities *This);

    /*** IPortableDeviceServiceCapabilities methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSupportedMethods)(
        IPortableDeviceServiceCapabilities *This,
        IPortableDevicePropVariantCollection **supported_methods);

    HRESULT (STDMETHODCALLTYPE *GetSupportedMethodsByFormat)(
        IPortableDeviceServiceCapabilities *This,
        REFGUID format,
        IPortableDevicePropVariantCollection **supported_methods);

    HRESULT (STDMETHODCALLTYPE *GetMethodAttributes)(
        IPortableDeviceServiceCapabilities *This,
        REFGUID method,
        IPortableDeviceValues **attributes);

    HRESULT (STDMETHODCALLTYPE *GetMethodParameterAttributes)(
        IPortableDeviceServiceCapabilities *This,
        REFGUID method,
        REFPROPERTYKEY parameter,
        IPortableDeviceValues **attributes);

    HRESULT (STDMETHODCALLTYPE *GetSupportedFormats)(
        IPortableDeviceServiceCapabilities *This,
        IPortableDevicePropVariantCollection **formats);

    HRESULT (STDMETHODCALLTYPE *GetFormatAttributes)(
        IPortableDeviceServiceCapabilities *This,
        REFGUID format,
        IPortableDeviceValues **attributes);

    HRESULT (STDMETHODCALLTYPE *GetSupportedFormatProperties)(
        IPortableDeviceServiceCapabilities *This,
        REFGUID format,
        IPortableDeviceKeyCollection **keys);

    HRESULT (STDMETHODCALLTYPE *GetFormatPropertyAttributes)(
        IPortableDeviceServiceCapabilities *This,
        REFGUID format,
        REFPROPERTYKEY property,
        IPortableDeviceValues **attributes);

    HRESULT (STDMETHODCALLTYPE *GetSupportedEvents)(
        IPortableDeviceServiceCapabilities *This,
        IPortableDevicePropVariantCollection **events);

    HRESULT (STDMETHODCALLTYPE *GetEventAttributes)(
        IPortableDeviceServiceCapabilities *This,
        REFGUID event_id,
        IPortableDeviceValues **attributes);

    HRESULT (STDMETHODCALLTYPE *GetEventParameterAttributes)(
        IPortableDeviceServiceCapabilities *This,
        REFGUID event_id,
        REFPROPERTYKEY parameter,
        IPortableDeviceValues **attributes);

    HRESULT (STDMETHODCALLTYPE *GetInheritedServices)(
        IPortableDeviceServiceCapabilities *This,
        const DWORD inheritance_type,
        IPortableDevicePropVariantCollection **services);

    HRESULT (STDMETHODCALLTYPE *GetFormatRenderingProfiles)(
        IPortableDeviceServiceCapabilities *This,
        REFGUID format,
        IPortableDeviceValuesCollection **rendering_profiles);

    HRESULT (STDMETHODCALLTYPE *GetSupportedCommands)(
        IPortableDeviceServiceCapabilities *This,
        IPortableDeviceKeyCollection **commands);

    HRESULT (STDMETHODCALLTYPE *GetCommandOptions)(
        IPortableDeviceServiceCapabilities *This,
        REFPROPERTYKEY command,
        IPortableDeviceValues **options);

    HRESULT (STDMETHODCALLTYPE *Cancel)(
        IPortableDeviceServiceCapabilities *This);

    END_INTERFACE
} IPortableDeviceServiceCapabilitiesVtbl;

interface IPortableDeviceServiceCapabilities {
    CONST_VTBL IPortableDeviceServiceCapabilitiesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPortableDeviceServiceCapabilities_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPortableDeviceServiceCapabilities_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPortableDeviceServiceCapabilities_Release(This) (This)->lpVtbl->Release(This)
/*** IPortableDeviceServiceCapabilities methods ***/
#define IPortableDeviceServiceCapabilities_GetSupportedMethods(This,supported_methods) (This)->lpVtbl->GetSupportedMethods(This,supported_methods)
#define IPortableDeviceServiceCapabilities_GetSupportedMethodsByFormat(This,format,supported_methods) (This)->lpVtbl->GetSupportedMethodsByFormat(This,format,supported_methods)
#define IPortableDeviceServiceCapabilities_GetMethodAttributes(This,method,attributes) (This)->lpVtbl->GetMethodAttributes(This,method,attributes)
#define IPortableDeviceServiceCapabilities_GetMethodParameterAttributes(This,method,parameter,attributes) (This)->lpVtbl->GetMethodParameterAttributes(This,method,parameter,attributes)
#define IPortableDeviceServiceCapabilities_GetSupportedFormats(This,formats) (This)->lpVtbl->GetSupportedFormats(This,formats)
#define IPortableDeviceServiceCapabilities_GetFormatAttributes(This,format,attributes) (This)->lpVtbl->GetFormatAttributes(This,format,attributes)
#define IPortableDeviceServiceCapabilities_GetSupportedFormatProperties(This,format,keys) (This)->lpVtbl->GetSupportedFormatProperties(This,format,keys)
#define IPortableDeviceServiceCapabilities_GetFormatPropertyAttributes(This,format,property,attributes) (This)->lpVtbl->GetFormatPropertyAttributes(This,format,property,attributes)
#define IPortableDeviceServiceCapabilities_GetSupportedEvents(This,events) (This)->lpVtbl->GetSupportedEvents(This,events)
#define IPortableDeviceServiceCapabilities_GetEventAttributes(This,event_id,attributes) (This)->lpVtbl->GetEventAttributes(This,event_id,attributes)
#define IPortableDeviceServiceCapabilities_GetEventParameterAttributes(This,event_id,parameter,attributes) (This)->lpVtbl->GetEventParameterAttributes(This,event_id,parameter,attributes)
#define IPortableDeviceServiceCapabilities_GetInheritedServices(This,inheritance_type,services) (This)->lpVtbl->GetInheritedServices(This,inheritance_type,services)
#define IPortableDeviceServiceCapabilities_GetFormatRenderingProfiles(This,format,rendering_profiles) (This)->lpVtbl->GetFormatRenderingProfiles(This,format,rendering_profiles)
#define IPortableDeviceServiceCapabilities_GetSupportedCommands(This,commands) (This)->lpVtbl->GetSupportedCommands(This,commands)
#define IPortableDeviceServiceCapabilities_GetCommandOptions(This,command,options) (This)->lpVtbl->GetCommandOptions(This,command,options)
#define IPortableDeviceServiceCapabilities_Cancel(This) (This)->lpVtbl->Cancel(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceServiceCapabilities_QueryInterface(IPortableDeviceServiceCapabilities* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPortableDeviceServiceCapabilities_AddRef(IPortableDeviceServiceCapabilities* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPortableDeviceServiceCapabilities_Release(IPortableDeviceServiceCapabilities* This) {
    return This->lpVtbl->Release(This);
}
/*** IPortableDeviceServiceCapabilities methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceServiceCapabilities_GetSupportedMethods(IPortableDeviceServiceCapabilities* This,IPortableDevicePropVariantCollection **supported_methods) {
    return This->lpVtbl->GetSupportedMethods(This,supported_methods);
}
static __WIDL_INLINE HRESULT IPortableDeviceServiceCapabilities_GetSupportedMethodsByFormat(IPortableDeviceServiceCapabilities* This,REFGUID format,IPortableDevicePropVariantCollection **supported_methods) {
    return This->lpVtbl->GetSupportedMethodsByFormat(This,format,supported_methods);
}
static __WIDL_INLINE HRESULT IPortableDeviceServiceCapabilities_GetMethodAttributes(IPortableDeviceServiceCapabilities* This,REFGUID method,IPortableDeviceValues **attributes) {
    return This->lpVtbl->GetMethodAttributes(This,method,attributes);
}
static __WIDL_INLINE HRESULT IPortableDeviceServiceCapabilities_GetMethodParameterAttributes(IPortableDeviceServiceCapabilities* This,REFGUID method,REFPROPERTYKEY parameter,IPortableDeviceValues **attributes) {
    return This->lpVtbl->GetMethodParameterAttributes(This,method,parameter,attributes);
}
static __WIDL_INLINE HRESULT IPortableDeviceServiceCapabilities_GetSupportedFormats(IPortableDeviceServiceCapabilities* This,IPortableDevicePropVariantCollection **formats) {
    return This->lpVtbl->GetSupportedFormats(This,formats);
}
static __WIDL_INLINE HRESULT IPortableDeviceServiceCapabilities_GetFormatAttributes(IPortableDeviceServiceCapabilities* This,REFGUID format,IPortableDeviceValues **attributes) {
    return This->lpVtbl->GetFormatAttributes(This,format,attributes);
}
static __WIDL_INLINE HRESULT IPortableDeviceServiceCapabilities_GetSupportedFormatProperties(IPortableDeviceServiceCapabilities* This,REFGUID format,IPortableDeviceKeyCollection **keys) {
    return This->lpVtbl->GetSupportedFormatProperties(This,format,keys);
}
static __WIDL_INLINE HRESULT IPortableDeviceServiceCapabilities_GetFormatPropertyAttributes(IPortableDeviceServiceCapabilities* This,REFGUID format,REFPROPERTYKEY property,IPortableDeviceValues **attributes) {
    return This->lpVtbl->GetFormatPropertyAttributes(This,format,property,attributes);
}
static __WIDL_INLINE HRESULT IPortableDeviceServiceCapabilities_GetSupportedEvents(IPortableDeviceServiceCapabilities* This,IPortableDevicePropVariantCollection **events) {
    return This->lpVtbl->GetSupportedEvents(This,events);
}
static __WIDL_INLINE HRESULT IPortableDeviceServiceCapabilities_GetEventAttributes(IPortableDeviceServiceCapabilities* This,REFGUID event_id,IPortableDeviceValues **attributes) {
    return This->lpVtbl->GetEventAttributes(This,event_id,attributes);
}
static __WIDL_INLINE HRESULT IPortableDeviceServiceCapabilities_GetEventParameterAttributes(IPortableDeviceServiceCapabilities* This,REFGUID event_id,REFPROPERTYKEY parameter,IPortableDeviceValues **attributes) {
    return This->lpVtbl->GetEventParameterAttributes(This,event_id,parameter,attributes);
}
static __WIDL_INLINE HRESULT IPortableDeviceServiceCapabilities_GetInheritedServices(IPortableDeviceServiceCapabilities* This,const DWORD inheritance_type,IPortableDevicePropVariantCollection **services) {
    return This->lpVtbl->GetInheritedServices(This,inheritance_type,services);
}
static __WIDL_INLINE HRESULT IPortableDeviceServiceCapabilities_GetFormatRenderingProfiles(IPortableDeviceServiceCapabilities* This,REFGUID format,IPortableDeviceValuesCollection **rendering_profiles) {
    return This->lpVtbl->GetFormatRenderingProfiles(This,format,rendering_profiles);
}
static __WIDL_INLINE HRESULT IPortableDeviceServiceCapabilities_GetSupportedCommands(IPortableDeviceServiceCapabilities* This,IPortableDeviceKeyCollection **commands) {
    return This->lpVtbl->GetSupportedCommands(This,commands);
}
static __WIDL_INLINE HRESULT IPortableDeviceServiceCapabilities_GetCommandOptions(IPortableDeviceServiceCapabilities* This,REFPROPERTYKEY command,IPortableDeviceValues **options) {
    return This->lpVtbl->GetCommandOptions(This,command,options);
}
static __WIDL_INLINE HRESULT IPortableDeviceServiceCapabilities_Cancel(IPortableDeviceServiceCapabilities* This) {
    return This->lpVtbl->Cancel(This);
}
#endif
#endif

#endif


#endif  /* __IPortableDeviceServiceCapabilities_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPortableDeviceServiceMethods interface
 */
#ifndef __IPortableDeviceServiceMethods_INTERFACE_DEFINED__
#define __IPortableDeviceServiceMethods_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPortableDeviceServiceMethods, 0xe20333c9, 0xfd34, 0x412d, 0xa3,0x81, 0xcc,0x6f,0x2d,0x82,0x0d,0xf7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e20333c9-fd34-412d-a381-cc6f2d820df7")
IPortableDeviceServiceMethods : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Invoke(
        REFGUID method_id,
        IPortableDeviceValues *parameters,
        IPortableDeviceValues **results) = 0;

    virtual HRESULT STDMETHODCALLTYPE InvokeAsync(
        REFGUID method_id,
        IPortableDeviceValues *parameters,
        IPortableDeviceServiceMethodCallback *callback) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        IPortableDeviceServiceMethodCallback *callback) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPortableDeviceServiceMethods, 0xe20333c9, 0xfd34, 0x412d, 0xa3,0x81, 0xcc,0x6f,0x2d,0x82,0x0d,0xf7)
#endif
#else
typedef struct IPortableDeviceServiceMethodsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPortableDeviceServiceMethods *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPortableDeviceServiceMethods *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPortableDeviceServiceMethods *This);

    /*** IPortableDeviceServiceMethods methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IPortableDeviceServiceMethods *This,
        REFGUID method_id,
        IPortableDeviceValues *parameters,
        IPortableDeviceValues **results);

    HRESULT (STDMETHODCALLTYPE *InvokeAsync)(
        IPortableDeviceServiceMethods *This,
        REFGUID method_id,
        IPortableDeviceValues *parameters,
        IPortableDeviceServiceMethodCallback *callback);

    HRESULT (STDMETHODCALLTYPE *Cancel)(
        IPortableDeviceServiceMethods *This,
        IPortableDeviceServiceMethodCallback *callback);

    END_INTERFACE
} IPortableDeviceServiceMethodsVtbl;

interface IPortableDeviceServiceMethods {
    CONST_VTBL IPortableDeviceServiceMethodsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPortableDeviceServiceMethods_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPortableDeviceServiceMethods_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPortableDeviceServiceMethods_Release(This) (This)->lpVtbl->Release(This)
/*** IPortableDeviceServiceMethods methods ***/
#define IPortableDeviceServiceMethods_Invoke(This,method_id,parameters,results) (This)->lpVtbl->Invoke(This,method_id,parameters,results)
#define IPortableDeviceServiceMethods_InvokeAsync(This,method_id,parameters,callback) (This)->lpVtbl->InvokeAsync(This,method_id,parameters,callback)
#define IPortableDeviceServiceMethods_Cancel(This,callback) (This)->lpVtbl->Cancel(This,callback)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceServiceMethods_QueryInterface(IPortableDeviceServiceMethods* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPortableDeviceServiceMethods_AddRef(IPortableDeviceServiceMethods* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPortableDeviceServiceMethods_Release(IPortableDeviceServiceMethods* This) {
    return This->lpVtbl->Release(This);
}
/*** IPortableDeviceServiceMethods methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceServiceMethods_Invoke(IPortableDeviceServiceMethods* This,REFGUID method_id,IPortableDeviceValues *parameters,IPortableDeviceValues **results) {
    return This->lpVtbl->Invoke(This,method_id,parameters,results);
}
static __WIDL_INLINE HRESULT IPortableDeviceServiceMethods_InvokeAsync(IPortableDeviceServiceMethods* This,REFGUID method_id,IPortableDeviceValues *parameters,IPortableDeviceServiceMethodCallback *callback) {
    return This->lpVtbl->InvokeAsync(This,method_id,parameters,callback);
}
static __WIDL_INLINE HRESULT IPortableDeviceServiceMethods_Cancel(IPortableDeviceServiceMethods* This,IPortableDeviceServiceMethodCallback *callback) {
    return This->lpVtbl->Cancel(This,callback);
}
#endif
#endif

#endif


#endif  /* __IPortableDeviceServiceMethods_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPortableDeviceServiceMethodCallback interface
 */
#ifndef __IPortableDeviceServiceMethodCallback_INTERFACE_DEFINED__
#define __IPortableDeviceServiceMethodCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPortableDeviceServiceMethodCallback, 0xc424233c, 0xafce, 0x4828, 0xa7,0x56, 0x7e,0xd7,0xa2,0x35,0x00,0x83);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c424233c-afce-4828-a756-7ed7a2350083")
IPortableDeviceServiceMethodCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnComplete(
        HRESULT hr_status,
        IPortableDeviceValues *results) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPortableDeviceServiceMethodCallback, 0xc424233c, 0xafce, 0x4828, 0xa7,0x56, 0x7e,0xd7,0xa2,0x35,0x00,0x83)
#endif
#else
typedef struct IPortableDeviceServiceMethodCallbackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPortableDeviceServiceMethodCallback *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPortableDeviceServiceMethodCallback *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPortableDeviceServiceMethodCallback *This);

    /*** IPortableDeviceServiceMethodCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnComplete)(
        IPortableDeviceServiceMethodCallback *This,
        HRESULT hr_status,
        IPortableDeviceValues *results);

    END_INTERFACE
} IPortableDeviceServiceMethodCallbackVtbl;

interface IPortableDeviceServiceMethodCallback {
    CONST_VTBL IPortableDeviceServiceMethodCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPortableDeviceServiceMethodCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPortableDeviceServiceMethodCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPortableDeviceServiceMethodCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IPortableDeviceServiceMethodCallback methods ***/
#define IPortableDeviceServiceMethodCallback_OnComplete(This,hr_status,results) (This)->lpVtbl->OnComplete(This,hr_status,results)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceServiceMethodCallback_QueryInterface(IPortableDeviceServiceMethodCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPortableDeviceServiceMethodCallback_AddRef(IPortableDeviceServiceMethodCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPortableDeviceServiceMethodCallback_Release(IPortableDeviceServiceMethodCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IPortableDeviceServiceMethodCallback methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceServiceMethodCallback_OnComplete(IPortableDeviceServiceMethodCallback* This,HRESULT hr_status,IPortableDeviceValues *results) {
    return This->lpVtbl->OnComplete(This,hr_status,results);
}
#endif
#endif

#endif


#endif  /* __IPortableDeviceServiceMethodCallback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPortableDeviceServiceActivation interface
 */
#ifndef __IPortableDeviceServiceActivation_INTERFACE_DEFINED__
#define __IPortableDeviceServiceActivation_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPortableDeviceServiceActivation, 0xe56b0534, 0xd9b9, 0x425c, 0x9b,0x99, 0x75,0xf9,0x7c,0xb3,0xd7,0xc8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e56b0534-d9b9-425c-9b99-75f97cb3d7c8")
IPortableDeviceServiceActivation : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OpenAsync(
        LPCWSTR service_id,
        IPortableDeviceValues *client_info,
        IPortableDeviceServiceOpenCallback *callback) = 0;

    virtual HRESULT STDMETHODCALLTYPE CancelOpenAsync(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPortableDeviceServiceActivation, 0xe56b0534, 0xd9b9, 0x425c, 0x9b,0x99, 0x75,0xf9,0x7c,0xb3,0xd7,0xc8)
#endif
#else
typedef struct IPortableDeviceServiceActivationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPortableDeviceServiceActivation *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPortableDeviceServiceActivation *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPortableDeviceServiceActivation *This);

    /*** IPortableDeviceServiceActivation methods ***/
    HRESULT (STDMETHODCALLTYPE *OpenAsync)(
        IPortableDeviceServiceActivation *This,
        LPCWSTR service_id,
        IPortableDeviceValues *client_info,
        IPortableDeviceServiceOpenCallback *callback);

    HRESULT (STDMETHODCALLTYPE *CancelOpenAsync)(
        IPortableDeviceServiceActivation *This);

    END_INTERFACE
} IPortableDeviceServiceActivationVtbl;

interface IPortableDeviceServiceActivation {
    CONST_VTBL IPortableDeviceServiceActivationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPortableDeviceServiceActivation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPortableDeviceServiceActivation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPortableDeviceServiceActivation_Release(This) (This)->lpVtbl->Release(This)
/*** IPortableDeviceServiceActivation methods ***/
#define IPortableDeviceServiceActivation_OpenAsync(This,service_id,client_info,callback) (This)->lpVtbl->OpenAsync(This,service_id,client_info,callback)
#define IPortableDeviceServiceActivation_CancelOpenAsync(This) (This)->lpVtbl->CancelOpenAsync(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceServiceActivation_QueryInterface(IPortableDeviceServiceActivation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPortableDeviceServiceActivation_AddRef(IPortableDeviceServiceActivation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPortableDeviceServiceActivation_Release(IPortableDeviceServiceActivation* This) {
    return This->lpVtbl->Release(This);
}
/*** IPortableDeviceServiceActivation methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceServiceActivation_OpenAsync(IPortableDeviceServiceActivation* This,LPCWSTR service_id,IPortableDeviceValues *client_info,IPortableDeviceServiceOpenCallback *callback) {
    return This->lpVtbl->OpenAsync(This,service_id,client_info,callback);
}
static __WIDL_INLINE HRESULT IPortableDeviceServiceActivation_CancelOpenAsync(IPortableDeviceServiceActivation* This) {
    return This->lpVtbl->CancelOpenAsync(This);
}
#endif
#endif

#endif


#endif  /* __IPortableDeviceServiceActivation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPortableDeviceServiceOpenCallback interface
 */
#ifndef __IPortableDeviceServiceOpenCallback_INTERFACE_DEFINED__
#define __IPortableDeviceServiceOpenCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPortableDeviceServiceOpenCallback, 0xbced49c8, 0x8efe, 0x41ed, 0x96,0x0b, 0x61,0x31,0x3a,0xbd,0x47,0xa9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bced49c8-8efe-41ed-960b-61313abd47a9")
IPortableDeviceServiceOpenCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnComplete(
        HRESULT hr_status) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPortableDeviceServiceOpenCallback, 0xbced49c8, 0x8efe, 0x41ed, 0x96,0x0b, 0x61,0x31,0x3a,0xbd,0x47,0xa9)
#endif
#else
typedef struct IPortableDeviceServiceOpenCallbackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPortableDeviceServiceOpenCallback *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPortableDeviceServiceOpenCallback *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPortableDeviceServiceOpenCallback *This);

    /*** IPortableDeviceServiceOpenCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnComplete)(
        IPortableDeviceServiceOpenCallback *This,
        HRESULT hr_status);

    END_INTERFACE
} IPortableDeviceServiceOpenCallbackVtbl;

interface IPortableDeviceServiceOpenCallback {
    CONST_VTBL IPortableDeviceServiceOpenCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPortableDeviceServiceOpenCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPortableDeviceServiceOpenCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPortableDeviceServiceOpenCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IPortableDeviceServiceOpenCallback methods ***/
#define IPortableDeviceServiceOpenCallback_OnComplete(This,hr_status) (This)->lpVtbl->OnComplete(This,hr_status)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceServiceOpenCallback_QueryInterface(IPortableDeviceServiceOpenCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPortableDeviceServiceOpenCallback_AddRef(IPortableDeviceServiceOpenCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPortableDeviceServiceOpenCallback_Release(IPortableDeviceServiceOpenCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IPortableDeviceServiceOpenCallback methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceServiceOpenCallback_OnComplete(IPortableDeviceServiceOpenCallback* This,HRESULT hr_status) {
    return This->lpVtbl->OnComplete(This,hr_status);
}
#endif
#endif

#endif


#endif  /* __IPortableDeviceServiceOpenCallback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPortableDeviceDispatchFactory interface
 */
#ifndef __IPortableDeviceDispatchFactory_INTERFACE_DEFINED__
#define __IPortableDeviceDispatchFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPortableDeviceDispatchFactory, 0x5e1eafc3, 0xe3d7, 0x4132, 0x96,0xfa, 0x75,0x9c,0x0f,0x9d,0x1e,0x0f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5e1eafc3-e3d7-4132-96fa-759c0f9d1e0f")
IPortableDeviceDispatchFactory : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDeviceDispatch(
        LPCWSTR device_id,
        IDispatch **device_dispatch) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPortableDeviceDispatchFactory, 0x5e1eafc3, 0xe3d7, 0x4132, 0x96,0xfa, 0x75,0x9c,0x0f,0x9d,0x1e,0x0f)
#endif
#else
typedef struct IPortableDeviceDispatchFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPortableDeviceDispatchFactory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPortableDeviceDispatchFactory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPortableDeviceDispatchFactory *This);

    /*** IPortableDeviceDispatchFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDeviceDispatch)(
        IPortableDeviceDispatchFactory *This,
        LPCWSTR device_id,
        IDispatch **device_dispatch);

    END_INTERFACE
} IPortableDeviceDispatchFactoryVtbl;

interface IPortableDeviceDispatchFactory {
    CONST_VTBL IPortableDeviceDispatchFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPortableDeviceDispatchFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPortableDeviceDispatchFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPortableDeviceDispatchFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IPortableDeviceDispatchFactory methods ***/
#define IPortableDeviceDispatchFactory_GetDeviceDispatch(This,device_id,device_dispatch) (This)->lpVtbl->GetDeviceDispatch(This,device_id,device_dispatch)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceDispatchFactory_QueryInterface(IPortableDeviceDispatchFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPortableDeviceDispatchFactory_AddRef(IPortableDeviceDispatchFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPortableDeviceDispatchFactory_Release(IPortableDeviceDispatchFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IPortableDeviceDispatchFactory methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceDispatchFactory_GetDeviceDispatch(IPortableDeviceDispatchFactory* This,LPCWSTR device_id,IDispatch **device_dispatch) {
    return This->lpVtbl->GetDeviceDispatch(This,device_id,device_dispatch);
}
#endif
#endif

#endif


#endif  /* __IPortableDeviceDispatchFactory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPortableDeviceWebControl interface
 */
#ifndef __IPortableDeviceWebControl_INTERFACE_DEFINED__
#define __IPortableDeviceWebControl_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPortableDeviceWebControl, 0x94fc7953, 0x5ca1, 0x483a, 0x8a,0xee, 0xdf,0x52,0xe7,0x74,0x7d,0x00);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("94fc7953-5ca1-483a-8aee-df52e7747d00")
IPortableDeviceWebControl : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE GetDeviceFromId(
        BSTR device_id,
        IDispatch **device) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeviceFromIdAsync(
        BSTR device_id,
        IDispatch *completion_handler,
        IDispatch *error_handler) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPortableDeviceWebControl, 0x94fc7953, 0x5ca1, 0x483a, 0x8a,0xee, 0xdf,0x52,0xe7,0x74,0x7d,0x00)
#endif
#else
typedef struct IPortableDeviceWebControlVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IPortableDeviceWebControl *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IPortableDeviceWebControl *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IPortableDeviceWebControl *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IPortableDeviceWebControl *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IPortableDeviceWebControl *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IPortableDeviceWebControl *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IPortableDeviceWebControl *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IPortableDeviceWebControl methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDeviceFromId)(
        IPortableDeviceWebControl *This,
        BSTR device_id,
        IDispatch **device);

    HRESULT (STDMETHODCALLTYPE *GetDeviceFromIdAsync)(
        IPortableDeviceWebControl *This,
        BSTR device_id,
        IDispatch *completion_handler,
        IDispatch *error_handler);

    END_INTERFACE
} IPortableDeviceWebControlVtbl;

interface IPortableDeviceWebControl {
    CONST_VTBL IPortableDeviceWebControlVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPortableDeviceWebControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPortableDeviceWebControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPortableDeviceWebControl_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IPortableDeviceWebControl_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IPortableDeviceWebControl_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IPortableDeviceWebControl_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IPortableDeviceWebControl_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IPortableDeviceWebControl methods ***/
#define IPortableDeviceWebControl_GetDeviceFromId(This,device_id,device) (This)->lpVtbl->GetDeviceFromId(This,device_id,device)
#define IPortableDeviceWebControl_GetDeviceFromIdAsync(This,device_id,completion_handler,error_handler) (This)->lpVtbl->GetDeviceFromIdAsync(This,device_id,completion_handler,error_handler)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceWebControl_QueryInterface(IPortableDeviceWebControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPortableDeviceWebControl_AddRef(IPortableDeviceWebControl* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPortableDeviceWebControl_Release(IPortableDeviceWebControl* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceWebControl_GetTypeInfoCount(IPortableDeviceWebControl* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IPortableDeviceWebControl_GetTypeInfo(IPortableDeviceWebControl* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IPortableDeviceWebControl_GetIDsOfNames(IPortableDeviceWebControl* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IPortableDeviceWebControl_Invoke(IPortableDeviceWebControl* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IPortableDeviceWebControl methods ***/
static __WIDL_INLINE HRESULT IPortableDeviceWebControl_GetDeviceFromId(IPortableDeviceWebControl* This,BSTR device_id,IDispatch **device) {
    return This->lpVtbl->GetDeviceFromId(This,device_id,device);
}
static __WIDL_INLINE HRESULT IPortableDeviceWebControl_GetDeviceFromIdAsync(IPortableDeviceWebControl* This,BSTR device_id,IDispatch *completion_handler,IDispatch *error_handler) {
    return This->lpVtbl->GetDeviceFromIdAsync(This,device_id,completion_handler,error_handler);
}
#endif
#endif

#endif


#endif  /* __IPortableDeviceWebControl_INTERFACE_DEFINED__ */

#ifndef __PortableDeviceApiLib_LIBRARY_DEFINED__
#define __PortableDeviceApiLib_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_PortableDeviceApiLib, 0x1f001332, 0x1a57, 0x4934, 0xbe,0x31, 0xaf,0xfc,0x99,0xf4,0xee,0x0a);

/*****************************************************************************
 * PortableDevice coclass
 */

DEFINE_GUID(CLSID_PortableDevice, 0x728a21c5, 0x3d9e, 0x48d7, 0x98,0x10, 0x86,0x48,0x48,0xf0,0xf4,0x04);

#ifdef __cplusplus
class DECLSPEC_UUID("728a21c5-3d9e-48d7-9810-864848f0f404") PortableDevice;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(PortableDevice, 0x728a21c5, 0x3d9e, 0x48d7, 0x98,0x10, 0x86,0x48,0x48,0xf0,0xf4,0x04)
#endif
#endif

/*****************************************************************************
 * PortableDeviceManager coclass
 */

DEFINE_GUID(CLSID_PortableDeviceManager, 0x0af10cec, 0x2ecd, 0x4b92, 0x95,0x81, 0x34,0xf6,0xae,0x06,0x37,0xf3);

#ifdef __cplusplus
class DECLSPEC_UUID("0af10cec-2ecd-4b92-9581-34f6ae0637f3") PortableDeviceManager;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(PortableDeviceManager, 0x0af10cec, 0x2ecd, 0x4b92, 0x95,0x81, 0x34,0xf6,0xae,0x06,0x37,0xf3)
#endif
#endif

/*****************************************************************************
 * PortableDeviceService coclass
 */

DEFINE_GUID(CLSID_PortableDeviceService, 0xef5db4c2, 0x9312, 0x422c, 0x91,0x52, 0x41,0x1c,0xd9,0xc4,0xdd,0x84);

#ifdef __cplusplus
class DECLSPEC_UUID("ef5db4c2-9312-422c-9152-411cd9c4dd84") PortableDeviceService;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(PortableDeviceService, 0xef5db4c2, 0x9312, 0x422c, 0x91,0x52, 0x41,0x1c,0xd9,0xc4,0xdd,0x84)
#endif
#endif

/*****************************************************************************
 * PortableDeviceDispatchFactory coclass
 */

DEFINE_GUID(CLSID_PortableDeviceDispatchFactory, 0x43232233, 0x8338, 0x4658, 0xae,0x01, 0x0b,0x4a,0xe8,0x30,0xb6,0xb0);

#ifdef __cplusplus
class DECLSPEC_UUID("43232233-8338-4658-ae01-0b4ae830b6b0") PortableDeviceDispatchFactory;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(PortableDeviceDispatchFactory, 0x43232233, 0x8338, 0x4658, 0xae,0x01, 0x0b,0x4a,0xe8,0x30,0xb6,0xb0)
#endif
#endif

/*****************************************************************************
 * PortableDeviceFTM coclass
 */

DEFINE_GUID(CLSID_PortableDeviceFTM, 0xf7c0039a, 0x4762, 0x488a, 0xb4,0xb3, 0x76,0x0e,0xf9,0xa1,0xba,0x9b);

#ifdef __cplusplus
class DECLSPEC_UUID("f7c0039a-4762-488a-b4b3-760ef9a1ba9b") PortableDeviceFTM;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(PortableDeviceFTM, 0xf7c0039a, 0x4762, 0x488a, 0xb4,0xb3, 0x76,0x0e,0xf9,0xa1,0xba,0x9b)
#endif
#endif

/*****************************************************************************
 * PortableDeviceServiceFTM coclass
 */

DEFINE_GUID(CLSID_PortableDeviceServiceFTM, 0x1649b154, 0xc794, 0x497a, 0x9b,0x03, 0xf3,0xf0,0x12,0x13,0x02,0xf3);

#ifdef __cplusplus
class DECLSPEC_UUID("1649b154-c794-497a-9b03-f3f0121302f3") PortableDeviceServiceFTM;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(PortableDeviceServiceFTM, 0x1649b154, 0xc794, 0x497a, 0x9b,0x03, 0xf3,0xf0,0x12,0x13,0x02,0xf3)
#endif
#endif

/*****************************************************************************
 * PortableDeviceWebControl coclass
 */

DEFINE_GUID(CLSID_PortableDeviceWebControl, 0x186dd02c, 0x2dec, 0x41b5, 0xa7,0xd4, 0xb5,0x90,0x56,0xfa,0xde,0x51);

#ifdef __cplusplus
class DECLSPEC_UUID("186dd02c-2dec-41b5-a7d4-b59056fade51") PortableDeviceWebControl;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(PortableDeviceWebControl, 0x186dd02c, 0x2dec, 0x41b5, 0xa7,0xd4, 0xb5,0x90,0x56,0xfa,0xde,0x51)
#endif
#endif

#endif /* __PortableDeviceApiLib_LIBRARY_DEFINED__ */
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __portabledeviceapi_h__ */
