/*** Autogenerated by WIDL 10.0-rc1 from include/windows.applicationmodel.datatransfer.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 __windows_applicationmodel_datatransfer_h__
#define __windows_applicationmodel_datatransfer_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler ABI::Windows::ApplicationModel::DataTransfer::IDataProviderHandler
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataProviderHandler;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler ABI::Windows::ApplicationModel::DataTransfer::IShareProviderHandler
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IShareProviderHandler;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions ABI::Windows::ApplicationModel::DataTransfer::IClipboardContentOptions
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IClipboardContentOptions;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs ABI::Windows::ApplicationModel::DataTransfer::IClipboardHistoryChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IClipboardHistoryChangedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem ABI::Windows::ApplicationModel::DataTransfer::IClipboardHistoryItem
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IClipboardHistoryItem;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult ABI::Windows::ApplicationModel::DataTransfer::IClipboardHistoryItemsResult
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IClipboardHistoryItemsResult;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics ABI::Windows::ApplicationModel::DataTransfer::IClipboardStatics
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IClipboardStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2 ABI::Windows::ApplicationModel::DataTransfer::IClipboardStatics2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IClipboardStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage ABI::Windows::ApplicationModel::DataTransfer::IDataPackage
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackage;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2 ABI::Windows::ApplicationModel::DataTransfer::IDataPackage2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackage2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3 ABI::Windows::ApplicationModel::DataTransfer::IDataPackage3
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackage3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4 ABI::Windows::ApplicationModel::DataTransfer::IDataPackage4
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackage4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet ABI::Windows::ApplicationModel::DataTransfer::IDataPackagePropertySet
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackagePropertySet;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2 ABI::Windows::ApplicationModel::DataTransfer::IDataPackagePropertySet2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackagePropertySet2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3 ABI::Windows::ApplicationModel::DataTransfer::IDataPackagePropertySet3
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackagePropertySet3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4 ABI::Windows::ApplicationModel::DataTransfer::IDataPackagePropertySet4
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackagePropertySet4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView ABI::Windows::ApplicationModel::DataTransfer::IDataPackagePropertySetView
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackagePropertySetView;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2 ABI::Windows::ApplicationModel::DataTransfer::IDataPackagePropertySetView2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackagePropertySetView2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3 ABI::Windows::ApplicationModel::DataTransfer::IDataPackagePropertySetView3
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackagePropertySetView3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4 ABI::Windows::ApplicationModel::DataTransfer::IDataPackagePropertySetView4
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackagePropertySetView4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5 ABI::Windows::ApplicationModel::DataTransfer::IDataPackagePropertySetView5
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackagePropertySetView5;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView ABI::Windows::ApplicationModel::DataTransfer::IDataPackageView
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackageView;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2 ABI::Windows::ApplicationModel::DataTransfer::IDataPackageView2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackageView2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3 ABI::Windows::ApplicationModel::DataTransfer::IDataPackageView3
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackageView3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4 ABI::Windows::ApplicationModel::DataTransfer::IDataPackageView4
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackageView4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral ABI::Windows::ApplicationModel::DataTransfer::IDataProviderDeferral
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataProviderDeferral;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest ABI::Windows::ApplicationModel::DataTransfer::IDataProviderRequest
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataProviderRequest;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest ABI::Windows::ApplicationModel::DataTransfer::IDataRequest
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataRequest;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral ABI::Windows::ApplicationModel::DataTransfer::IDataRequestDeferral
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataRequestDeferral;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs ABI::Windows::ApplicationModel::DataTransfer::IDataRequestedEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataRequestedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager ABI::Windows::ApplicationModel::DataTransfer::IDataTransferManager
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataTransferManager;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2 ABI::Windows::ApplicationModel::DataTransfer::IDataTransferManager2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataTransferManager2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics ABI::Windows::ApplicationModel::DataTransfer::IDataTransferManagerStatics
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataTransferManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2 ABI::Windows::ApplicationModel::DataTransfer::IDataTransferManagerStatics2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataTransferManagerStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3 ABI::Windows::ApplicationModel::DataTransfer::IDataTransferManagerStatics3
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataTransferManagerStatics3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics ABI::Windows::ApplicationModel::DataTransfer::IHtmlFormatHelperStatics
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IHtmlFormatHelperStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs ABI::Windows::ApplicationModel::DataTransfer::IOperationCompletedEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IOperationCompletedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2 ABI::Windows::ApplicationModel::DataTransfer::IOperationCompletedEventArgs2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IOperationCompletedEventArgs2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs ABI::Windows::ApplicationModel::DataTransfer::IShareCompletedEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IShareCompletedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider ABI::Windows::ApplicationModel::DataTransfer::IShareProvider
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IShareProvider;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory ABI::Windows::ApplicationModel::DataTransfer::IShareProviderFactory
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IShareProviderFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation ABI::Windows::ApplicationModel::DataTransfer::IShareProviderOperation
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IShareProviderOperation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs ABI::Windows::ApplicationModel::DataTransfer::IShareProvidersRequestedEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IShareProvidersRequestedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo ABI::Windows::ApplicationModel::DataTransfer::IShareTargetInfo
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IShareTargetInfo;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions ABI::Windows::ApplicationModel::DataTransfer::IShareUIOptions
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IShareUIOptions;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics ABI::Windows::ApplicationModel::DataTransfer::ISharedStorageAccessManagerStatics
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface ISharedStorageAccessManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics ABI::Windows::ApplicationModel::DataTransfer::IStandardDataFormatsStatics
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IStandardDataFormatsStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2 ABI::Windows::ApplicationModel::DataTransfer::IStandardDataFormatsStatics2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IStandardDataFormatsStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3 ABI::Windows::ApplicationModel::DataTransfer::IStandardDataFormatsStatics3
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IStandardDataFormatsStatics3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs ABI::Windows::ApplicationModel::DataTransfer::ITargetApplicationChosenEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface ITargetApplicationChosenEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboard_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboard_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class Clipboard;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboard __x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboard;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboard_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardContentOptions_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardContentOptions_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class ClipboardContentOptions;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardContentOptions __x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardContentOptions;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardContentOptions_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryChangedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class ClipboardHistoryChangedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryChangedEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryChangedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryChangedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryItem_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryItem_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class ClipboardHistoryItem;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryItem __x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryItem;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryItem_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryItemsResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryItemsResult_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class ClipboardHistoryItemsResult;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryItemsResult __x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryItemsResult;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryItemsResult_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackage_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackage_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class DataPackage;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackage __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackage;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackage_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackagePropertySet_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackagePropertySet_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class DataPackagePropertySet;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackagePropertySet __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackagePropertySet;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackagePropertySet_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackagePropertySetView_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackagePropertySetView_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class DataPackagePropertySetView;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackagePropertySetView __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackagePropertySetView;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackagePropertySetView_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageView_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageView_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class DataPackageView;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageView __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageView;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageView_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataProviderDeferral_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataProviderDeferral_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class DataProviderDeferral;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataProviderDeferral __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataProviderDeferral;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataProviderDeferral_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataProviderRequest_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataProviderRequest_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class DataProviderRequest;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataProviderRequest __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataProviderRequest;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataProviderRequest_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataRequest_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataRequest_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class DataRequest;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataRequest __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataRequest;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataRequest_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataRequestDeferral_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataRequestDeferral_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class DataRequestDeferral;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataRequestDeferral __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataRequestDeferral;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataRequestDeferral_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataRequestedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataRequestedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class DataRequestedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataRequestedEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataRequestedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataRequestedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataTransferManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataTransferManager_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class DataTransferManager;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataTransferManager __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataTransferManager;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataTransferManager_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CHtmlFormatHelper_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CHtmlFormatHelper_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class HtmlFormatHelper;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CHtmlFormatHelper __x_ABI_CWindows_CApplicationModel_CDataTransfer_CHtmlFormatHelper;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CHtmlFormatHelper_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_COperationCompletedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_COperationCompletedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class OperationCompletedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_COperationCompletedEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_COperationCompletedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_COperationCompletedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareCompletedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareCompletedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class ShareCompletedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareCompletedEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareCompletedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareCompletedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareProvider_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareProvider_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class ShareProvider;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareProvider __x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareProvider;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareProvider_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareProviderOperation_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareProviderOperation_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class ShareProviderOperation;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareProviderOperation __x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareProviderOperation;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareProviderOperation_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareProvidersRequestedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareProvidersRequestedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class ShareProvidersRequestedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareProvidersRequestedEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareProvidersRequestedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareProvidersRequestedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareTargetInfo_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareTargetInfo_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class ShareTargetInfo;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareTargetInfo __x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareTargetInfo;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareTargetInfo_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareUIOptions_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareUIOptions_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class ShareUIOptions;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareUIOptions __x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareUIOptions;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareUIOptions_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CSharedStorageAccessManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CSharedStorageAccessManager_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class SharedStorageAccessManager;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CSharedStorageAccessManager __x_ABI_CWindows_CApplicationModel_CDataTransfer_CSharedStorageAccessManager;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CSharedStorageAccessManager_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CStandardDataFormats_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CStandardDataFormats_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class StandardDataFormats;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CStandardDataFormats __x_ABI_CWindows_CApplicationModel_CDataTransfer_CStandardDataFormats;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CStandardDataFormats_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CTargetApplicationChosenEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CTargetApplicationChosenEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                class TargetApplicationChosenEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CTargetApplicationChosenEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CTargetApplicationChosenEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CTargetApplicationChosenEventArgs_FWD_DEFINED__ */

#ifndef ____FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_FWD_DEFINED__
#define ____FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_FWD_DEFINED__
#define ____FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_FWD_DEFINED__
#define ____FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_FWD_DEFINED__
#define ____FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_FWD_DEFINED__
#define ____FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider;
#ifdef __cplusplus
#define __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider ABI::Windows::Foundation::Collections::IVector<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* >
#endif /* __cplusplus */
#endif

#ifndef ____FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs_FWD_DEFINED__
#define ____FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs_FWD_DEFINED__
typedef interface __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs;
#ifdef __cplusplus
#define __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs ABI::Windows::Foundation::IEventHandler<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryChangedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItemsResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_DataPackageOperation_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_DataPackageOperation_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_DataPackageOperation __FIAsyncOperationCompletedHandler_1_DataPackageOperation;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_DataPackageOperation ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackageOperation >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItemsResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::DataPackage* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_DataPackageOperation_FWD_DEFINED__
#define ____FIAsyncOperation_1_DataPackageOperation_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_DataPackageOperation __FIAsyncOperation_1_DataPackageOperation;
#ifdef __cplusplus
#define __FIAsyncOperation_1_DataPackageOperation ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::DataPackageOperation >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,ABI::Windows::ApplicationModel::DataTransfer::OperationCompletedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,ABI::Windows::ApplicationModel::DataTransfer::ShareCompletedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*,ABI::Windows::ApplicationModel::DataTransfer::DataRequestedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*,ABI::Windows::ApplicationModel::DataTransfer::ShareProvidersRequestedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*,ABI::Windows::ApplicationModel::DataTransfer::TargetApplicationChosenEventArgs* >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <asyncinfo.h>
#include <eventtoken.h>
#include <windowscontracts.h>
#include <windows.foundation.h>
#include <windows.security.enterprisedata.h>
#include <windows.storage.h>
#include <windows.storage.streams.h>
#include <windows.ui.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryItemsResultStatus __x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryItemsResultStatus;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageOperation __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageOperation;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CApplicationModel_CDataTransfer_CSetHistoryItemAsContentStatus __x_ABI_CWindows_CApplicationModel_CDataTransfer_CSetHistoryItemAsContentStatus;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareUITheme __x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareUITheme;
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions ABI::Windows::ApplicationModel::DataTransfer::IClipboardContentOptions
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IClipboardContentOptions;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs ABI::Windows::ApplicationModel::DataTransfer::IClipboardHistoryChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IClipboardHistoryChangedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem ABI::Windows::ApplicationModel::DataTransfer::IClipboardHistoryItem
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IClipboardHistoryItem;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult ABI::Windows::ApplicationModel::DataTransfer::IClipboardHistoryItemsResult
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IClipboardHistoryItemsResult;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics ABI::Windows::ApplicationModel::DataTransfer::IClipboardStatics
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IClipboardStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2 ABI::Windows::ApplicationModel::DataTransfer::IClipboardStatics2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IClipboardStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage ABI::Windows::ApplicationModel::DataTransfer::IDataPackage
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackage;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2 ABI::Windows::ApplicationModel::DataTransfer::IDataPackage2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackage2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3 ABI::Windows::ApplicationModel::DataTransfer::IDataPackage3
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackage3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4 ABI::Windows::ApplicationModel::DataTransfer::IDataPackage4
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackage4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet ABI::Windows::ApplicationModel::DataTransfer::IDataPackagePropertySet
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackagePropertySet;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2 ABI::Windows::ApplicationModel::DataTransfer::IDataPackagePropertySet2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackagePropertySet2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3 ABI::Windows::ApplicationModel::DataTransfer::IDataPackagePropertySet3
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackagePropertySet3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4 ABI::Windows::ApplicationModel::DataTransfer::IDataPackagePropertySet4
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackagePropertySet4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView ABI::Windows::ApplicationModel::DataTransfer::IDataPackagePropertySetView
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackagePropertySetView;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2 ABI::Windows::ApplicationModel::DataTransfer::IDataPackagePropertySetView2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackagePropertySetView2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3 ABI::Windows::ApplicationModel::DataTransfer::IDataPackagePropertySetView3
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackagePropertySetView3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4 ABI::Windows::ApplicationModel::DataTransfer::IDataPackagePropertySetView4
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackagePropertySetView4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5 ABI::Windows::ApplicationModel::DataTransfer::IDataPackagePropertySetView5
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackagePropertySetView5;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView ABI::Windows::ApplicationModel::DataTransfer::IDataPackageView
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackageView;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2 ABI::Windows::ApplicationModel::DataTransfer::IDataPackageView2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackageView2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3 ABI::Windows::ApplicationModel::DataTransfer::IDataPackageView3
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackageView3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4 ABI::Windows::ApplicationModel::DataTransfer::IDataPackageView4
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataPackageView4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral ABI::Windows::ApplicationModel::DataTransfer::IDataProviderDeferral
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataProviderDeferral;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest ABI::Windows::ApplicationModel::DataTransfer::IDataProviderRequest
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataProviderRequest;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest ABI::Windows::ApplicationModel::DataTransfer::IDataRequest
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataRequest;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral ABI::Windows::ApplicationModel::DataTransfer::IDataRequestDeferral
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataRequestDeferral;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs ABI::Windows::ApplicationModel::DataTransfer::IDataRequestedEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataRequestedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager ABI::Windows::ApplicationModel::DataTransfer::IDataTransferManager
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataTransferManager;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2 ABI::Windows::ApplicationModel::DataTransfer::IDataTransferManager2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataTransferManager2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics ABI::Windows::ApplicationModel::DataTransfer::IDataTransferManagerStatics
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataTransferManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2 ABI::Windows::ApplicationModel::DataTransfer::IDataTransferManagerStatics2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataTransferManagerStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3 ABI::Windows::ApplicationModel::DataTransfer::IDataTransferManagerStatics3
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IDataTransferManagerStatics3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics ABI::Windows::ApplicationModel::DataTransfer::IHtmlFormatHelperStatics
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IHtmlFormatHelperStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs ABI::Windows::ApplicationModel::DataTransfer::IOperationCompletedEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IOperationCompletedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2 ABI::Windows::ApplicationModel::DataTransfer::IOperationCompletedEventArgs2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IOperationCompletedEventArgs2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs ABI::Windows::ApplicationModel::DataTransfer::IShareCompletedEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IShareCompletedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider ABI::Windows::ApplicationModel::DataTransfer::IShareProvider
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IShareProvider;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory ABI::Windows::ApplicationModel::DataTransfer::IShareProviderFactory
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IShareProviderFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation ABI::Windows::ApplicationModel::DataTransfer::IShareProviderOperation
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IShareProviderOperation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs ABI::Windows::ApplicationModel::DataTransfer::IShareProvidersRequestedEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IShareProvidersRequestedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo ABI::Windows::ApplicationModel::DataTransfer::IShareTargetInfo
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IShareTargetInfo;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions ABI::Windows::ApplicationModel::DataTransfer::IShareUIOptions
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IShareUIOptions;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics ABI::Windows::ApplicationModel::DataTransfer::ISharedStorageAccessManagerStatics
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface ISharedStorageAccessManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics ABI::Windows::ApplicationModel::DataTransfer::IStandardDataFormatsStatics
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IStandardDataFormatsStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2 ABI::Windows::ApplicationModel::DataTransfer::IStandardDataFormatsStatics2
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IStandardDataFormatsStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3 ABI::Windows::ApplicationModel::DataTransfer::IStandardDataFormatsStatics3
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface IStandardDataFormatsStatics3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs ABI::Windows::ApplicationModel::DataTransfer::ITargetApplicationChosenEventArgs
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                interface ITargetApplicationChosenEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_FWD_DEFINED__
#define ____FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_FWD_DEFINED__
#define ____FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_FWD_DEFINED__
#define ____FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_FWD_DEFINED__
#define ____FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_FWD_DEFINED__
#define ____FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider;
#ifdef __cplusplus
#define __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider ABI::Windows::Foundation::Collections::IVector<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItemsResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::DataPackage* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_DataPackageOperation_FWD_DEFINED__
#define ____FIAsyncOperation_1_DataPackageOperation_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_DataPackageOperation __FIAsyncOperation_1_DataPackageOperation;
#ifdef __cplusplus
#define __FIAsyncOperation_1_DataPackageOperation ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::DataPackageOperation >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                enum ClipboardHistoryItemsResultStatus {
                    ClipboardHistoryItemsResultStatus_Success = 0,
                    ClipboardHistoryItemsResultStatus_AccessDenied = 1,
                    ClipboardHistoryItemsResultStatus_ClipboardHistoryDisabled = 2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryItemsResultStatus {
    ClipboardHistoryItemsResultStatus_Success = 0,
    ClipboardHistoryItemsResultStatus_AccessDenied = 1,
    ClipboardHistoryItemsResultStatus_ClipboardHistoryDisabled = 2
};
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define ClipboardHistoryItemsResultStatus __x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryItemsResultStatus
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                enum DataPackageOperation {
                    DataPackageOperation_None = 0x0,
                    DataPackageOperation_Copy = 0x1,
                    DataPackageOperation_Move = 0x2,
                    DataPackageOperation_Link = 0x4
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageOperation {
    DataPackageOperation_None = 0x0,
    DataPackageOperation_Copy = 0x1,
    DataPackageOperation_Move = 0x2,
    DataPackageOperation_Link = 0x4
};
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define DataPackageOperation __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageOperation
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                enum SetHistoryItemAsContentStatus {
                    SetHistoryItemAsContentStatus_Success = 0,
                    SetHistoryItemAsContentStatus_AccessDenied = 1,
                    SetHistoryItemAsContentStatus_ItemDeleted = 2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CApplicationModel_CDataTransfer_CSetHistoryItemAsContentStatus {
    SetHistoryItemAsContentStatus_Success = 0,
    SetHistoryItemAsContentStatus_AccessDenied = 1,
    SetHistoryItemAsContentStatus_ItemDeleted = 2
};
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define SetHistoryItemAsContentStatus __x_ABI_CWindows_CApplicationModel_CDataTransfer_CSetHistoryItemAsContentStatus
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                enum ShareUITheme {
                    ShareUITheme_Default = 0,
                    ShareUITheme_Light = 1,
                    ShareUITheme_Dark = 2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareUITheme {
    ShareUITheme_Default = 0,
    ShareUITheme_Light = 1,
    ShareUITheme_Dark = 2
};
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define ShareUITheme __x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareUITheme
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */
/*****************************************************************************
 * IDataProviderHandler interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler, 0xe7ecd720, 0xf2f4, 0x4a2d, 0x92,0x0e, 0x17,0x0a,0x2f,0x48,0x2a,0x27);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("e7ecd720-f2f4-4a2d-920e-170a2f482a27")
                IDataProviderHandler : public IUnknown
                {
                    virtual HRESULT STDMETHODCALLTYPE Invoke(
                        ABI::Windows::ApplicationModel::DataTransfer::IDataProviderRequest *request) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler, 0xe7ecd720, 0xf2f4, 0x4a2d, 0x92,0x0e, 0x17,0x0a,0x2f,0x48,0x2a,0x27)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDataProviderHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest *request);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandlerVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IDataProviderHandler methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler_Invoke(This,request) (This)->lpVtbl->Invoke(This,request)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDataProviderHandler methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler_Invoke(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest *request) {
    return This->lpVtbl->Invoke(This,request);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataProviderHandler IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler
#define IDataProviderHandlerVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandlerVtbl
#define IDataProviderHandler __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler
#define IDataProviderHandler_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler_QueryInterface
#define IDataProviderHandler_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler_AddRef
#define IDataProviderHandler_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler_Release
#define IDataProviderHandler_Invoke __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler_Invoke
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IShareProviderHandler interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler, 0xe7f9d9ba, 0xe1ba, 0x4e4d, 0xbd,0x65, 0xd4,0x38,0x45,0xd3,0x21,0x2f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("e7f9d9ba-e1ba-4e4d-bd65-d43845d3212f")
                IShareProviderHandler : public IUnknown
                {
                    virtual HRESULT STDMETHODCALLTYPE Invoke(
                        ABI::Windows::ApplicationModel::DataTransfer::IShareProviderOperation *operation) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler, 0xe7f9d9ba, 0xe1ba, 0x4e4d, 0xbd,0x65, 0xd4,0x38,0x45,0xd3,0x21,0x2f)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IShareProviderHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation *operation);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandlerVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IShareProviderHandler methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler_Invoke(This,operation) (This)->lpVtbl->Invoke(This,operation)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IShareProviderHandler methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler_Invoke(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation *operation) {
    return This->lpVtbl->Invoke(This,operation);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IShareProviderHandler IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler
#define IShareProviderHandlerVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandlerVtbl
#define IShareProviderHandler __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler
#define IShareProviderHandler_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler_QueryInterface
#define IShareProviderHandler_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler_AddRef
#define IShareProviderHandler_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler_Release
#define IShareProviderHandler_Invoke __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler_Invoke
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IClipboardContentOptions interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions, 0xe888a98c, 0xad4b, 0x5447, 0xa0,0x56, 0xab,0x35,0x56,0x27,0x6d,0x2b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("e888a98c-ad4b-5447-a056-ab3556276d2b")
                IClipboardContentOptions : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_IsRoamable(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_IsRoamable(
                        boolean value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_IsAllowedInHistory(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_IsAllowedInHistory(
                        boolean value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_RoamingFormats(
                        ABI::Windows::Foundation::Collections::IVector<HSTRING > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_HistoryFormats(
                        ABI::Windows::Foundation::Collections::IVector<HSTRING > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions, 0xe888a98c, 0xad4b, 0x5447, 0xa0,0x56, 0xab,0x35,0x56,0x27,0x6d,0x2b)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptionsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions *This,
        TrustLevel *trustLevel);

    /*** IClipboardContentOptions methods ***/
    HRESULT (STDMETHODCALLTYPE *get_IsRoamable)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_IsRoamable)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_IsAllowedInHistory)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_IsAllowedInHistory)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_RoamingFormats)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions *This,
        __FIVector_1_HSTRING **value);

    HRESULT (STDMETHODCALLTYPE *get_HistoryFormats)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions *This,
        __FIVector_1_HSTRING **value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptionsVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptionsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IClipboardContentOptions methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_get_IsRoamable(This,value) (This)->lpVtbl->get_IsRoamable(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_put_IsRoamable(This,value) (This)->lpVtbl->put_IsRoamable(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_get_IsAllowedInHistory(This,value) (This)->lpVtbl->get_IsAllowedInHistory(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_put_IsAllowedInHistory(This,value) (This)->lpVtbl->put_IsAllowedInHistory(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_get_RoamingFormats(This,value) (This)->lpVtbl->get_RoamingFormats(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_get_HistoryFormats(This,value) (This)->lpVtbl->get_HistoryFormats(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IClipboardContentOptions methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_get_IsRoamable(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions* This,boolean *value) {
    return This->lpVtbl->get_IsRoamable(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_put_IsRoamable(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions* This,boolean value) {
    return This->lpVtbl->put_IsRoamable(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_get_IsAllowedInHistory(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions* This,boolean *value) {
    return This->lpVtbl->get_IsAllowedInHistory(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_put_IsAllowedInHistory(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions* This,boolean value) {
    return This->lpVtbl->put_IsAllowedInHistory(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_get_RoamingFormats(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions* This,__FIVector_1_HSTRING **value) {
    return This->lpVtbl->get_RoamingFormats(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_get_HistoryFormats(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions* This,__FIVector_1_HSTRING **value) {
    return This->lpVtbl->get_HistoryFormats(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IClipboardContentOptions IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions
#define IClipboardContentOptionsVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptionsVtbl
#define IClipboardContentOptions __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions
#define IClipboardContentOptions_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_QueryInterface
#define IClipboardContentOptions_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_AddRef
#define IClipboardContentOptions_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_Release
#define IClipboardContentOptions_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_GetIids
#define IClipboardContentOptions_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_GetRuntimeClassName
#define IClipboardContentOptions_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_GetTrustLevel
#define IClipboardContentOptions_get_IsRoamable __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_get_IsRoamable
#define IClipboardContentOptions_put_IsRoamable __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_put_IsRoamable
#define IClipboardContentOptions_get_IsAllowedInHistory __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_get_IsAllowedInHistory
#define IClipboardContentOptions_put_IsAllowedInHistory __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_put_IsAllowedInHistory
#define IClipboardContentOptions_get_RoamingFormats __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_get_RoamingFormats
#define IClipboardContentOptions_get_HistoryFormats __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_get_HistoryFormats
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */

/*****************************************************************************
 * IClipboardHistoryChangedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs, 0xc0be453f, 0x8ea2, 0x53ce, 0x9a,0xba, 0x8d,0x22,0x12,0x57,0x34,0x52);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("c0be453f-8ea2-53ce-9aba-8d2212573452")
                IClipboardHistoryChangedEventArgs : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs, 0xc0be453f, 0x8ea2, 0x53ce, 0x9a,0xba, 0x8d,0x22,0x12,0x57,0x34,0x52)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgsVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IClipboardHistoryChangedEventArgs IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs
#define IClipboardHistoryChangedEventArgsVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgsVtbl
#define IClipboardHistoryChangedEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs
#define IClipboardHistoryChangedEventArgs_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_QueryInterface
#define IClipboardHistoryChangedEventArgs_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_AddRef
#define IClipboardHistoryChangedEventArgs_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_Release
#define IClipboardHistoryChangedEventArgs_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_GetIids
#define IClipboardHistoryChangedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_GetRuntimeClassName
#define IClipboardHistoryChangedEventArgs_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_GetTrustLevel
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */

/*****************************************************************************
 * IClipboardHistoryItem interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem, 0x0173bd8a, 0xafff, 0x5c50, 0xab,0x92, 0x3d,0x19,0xf4,0x81,0xec,0x58);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("0173bd8a-afff-5c50-ab92-3d19f481ec58")
                IClipboardHistoryItem : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Id(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Timestamp(
                        ABI::Windows::Foundation::DateTime *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Content(
                        ABI::Windows::ApplicationModel::DataTransfer::IDataPackageView **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem, 0x0173bd8a, 0xafff, 0x5c50, 0xab,0x92, 0x3d,0x19,0xf4,0x81,0xec,0x58)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem *This,
        TrustLevel *trustLevel);

    /*** IClipboardHistoryItem methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Timestamp)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem *This,
        __x_ABI_CWindows_CFoundation_CDateTime *value);

    HRESULT (STDMETHODCALLTYPE *get_Content)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView **value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IClipboardHistoryItem methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_get_Id(This,value) (This)->lpVtbl->get_Id(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_get_Timestamp(This,value) (This)->lpVtbl->get_Timestamp(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_get_Content(This,value) (This)->lpVtbl->get_Content(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IClipboardHistoryItem methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_get_Id(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem* This,HSTRING *value) {
    return This->lpVtbl->get_Id(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_get_Timestamp(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem* This,__x_ABI_CWindows_CFoundation_CDateTime *value) {
    return This->lpVtbl->get_Timestamp(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_get_Content(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView **value) {
    return This->lpVtbl->get_Content(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IClipboardHistoryItem IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem
#define IClipboardHistoryItemVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemVtbl
#define IClipboardHistoryItem __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem
#define IClipboardHistoryItem_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_QueryInterface
#define IClipboardHistoryItem_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_AddRef
#define IClipboardHistoryItem_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_Release
#define IClipboardHistoryItem_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_GetIids
#define IClipboardHistoryItem_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_GetRuntimeClassName
#define IClipboardHistoryItem_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_GetTrustLevel
#define IClipboardHistoryItem_get_Id __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_get_Id
#define IClipboardHistoryItem_get_Timestamp __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_get_Timestamp
#define IClipboardHistoryItem_get_Content __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_get_Content
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */

/*****************************************************************************
 * IClipboardHistoryItemsResult interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult, 0xe6dfdee6, 0x0ee2, 0x52e3, 0x85,0x2b, 0xf2,0x95,0xdb,0x65,0x93,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("e6dfdee6-0ee2-52e3-852b-f295db65939a")
                IClipboardHistoryItemsResult : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Status(
                        ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItemsResultStatus *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Items(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult, 0xe6dfdee6, 0x0ee2, 0x52e3, 0x85,0x2b, 0xf2,0x95,0xdb,0x65,0x93,0x9a)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResultVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult *This,
        TrustLevel *trustLevel);

    /*** IClipboardHistoryItemsResult methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Status)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryItemsResultStatus *value);

    HRESULT (STDMETHODCALLTYPE *get_Items)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult *This,
        __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem **value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResultVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IClipboardHistoryItemsResult methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_get_Status(This,value) (This)->lpVtbl->get_Status(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_get_Items(This,value) (This)->lpVtbl->get_Items(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IClipboardHistoryItemsResult methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_get_Status(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryItemsResultStatus *value) {
    return This->lpVtbl->get_Status(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_get_Items(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult* This,__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem **value) {
    return This->lpVtbl->get_Items(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IClipboardHistoryItemsResult IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult
#define IClipboardHistoryItemsResultVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResultVtbl
#define IClipboardHistoryItemsResult __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult
#define IClipboardHistoryItemsResult_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_QueryInterface
#define IClipboardHistoryItemsResult_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_AddRef
#define IClipboardHistoryItemsResult_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_Release
#define IClipboardHistoryItemsResult_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_GetIids
#define IClipboardHistoryItemsResult_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_GetRuntimeClassName
#define IClipboardHistoryItemsResult_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_GetTrustLevel
#define IClipboardHistoryItemsResult_get_Status __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_get_Status
#define IClipboardHistoryItemsResult_get_Items __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_get_Items
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */

/*****************************************************************************
 * IClipboardStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics, 0xc627e291, 0x34e2, 0x4963, 0x8e,0xed, 0x93,0xcb,0xb0,0xea,0x3d,0x70);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("c627e291-34e2-4963-8eed-93cbb0ea3d70")
                IClipboardStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetContent(
                        ABI::Windows::ApplicationModel::DataTransfer::IDataPackageView **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetContent(
                        ABI::Windows::ApplicationModel::DataTransfer::IDataPackage *content) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Flush(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Clear(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_ContentChanged(
                        ABI::Windows::Foundation::IEventHandler<IInspectable* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_ContentChanged(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics, 0xc627e291, 0x34e2, 0x4963, 0x8e,0xed, 0x93,0xcb,0xb0,0xea,0x3d,0x70)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics *This,
        TrustLevel *trustLevel);

    /*** IClipboardStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *GetContent)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView **result);

    HRESULT (STDMETHODCALLTYPE *SetContent)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *content);

    HRESULT (STDMETHODCALLTYPE *Flush)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics *This);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics *This);

    HRESULT (STDMETHODCALLTYPE *add_ContentChanged)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics *This,
        __FIEventHandler_1_IInspectable *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_ContentChanged)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStaticsVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IClipboardStatics methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_GetContent(This,result) (This)->lpVtbl->GetContent(This,result)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_SetContent(This,content) (This)->lpVtbl->SetContent(This,content)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_Flush(This) (This)->lpVtbl->Flush(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_Clear(This) (This)->lpVtbl->Clear(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_add_ContentChanged(This,handler,token) (This)->lpVtbl->add_ContentChanged(This,handler,token)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_remove_ContentChanged(This,token) (This)->lpVtbl->remove_ContentChanged(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IClipboardStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_GetContent(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView **result) {
    return This->lpVtbl->GetContent(This,result);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_SetContent(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *content) {
    return This->lpVtbl->SetContent(This,content);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_Flush(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics* This) {
    return This->lpVtbl->Flush(This);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_Clear(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics* This) {
    return This->lpVtbl->Clear(This);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_add_ContentChanged(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics* This,__FIEventHandler_1_IInspectable *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_ContentChanged(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_remove_ContentChanged(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_ContentChanged(This,token);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IClipboardStatics IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics
#define IClipboardStaticsVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStaticsVtbl
#define IClipboardStatics __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics
#define IClipboardStatics_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_QueryInterface
#define IClipboardStatics_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_AddRef
#define IClipboardStatics_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_Release
#define IClipboardStatics_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_GetIids
#define IClipboardStatics_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_GetRuntimeClassName
#define IClipboardStatics_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_GetTrustLevel
#define IClipboardStatics_GetContent __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_GetContent
#define IClipboardStatics_SetContent __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_SetContent
#define IClipboardStatics_Flush __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_Flush
#define IClipboardStatics_Clear __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_Clear
#define IClipboardStatics_add_ContentChanged __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_add_ContentChanged
#define IClipboardStatics_remove_ContentChanged __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_remove_ContentChanged
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IClipboardStatics2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2, 0xd2ac1b6a, 0xd29f, 0x554b, 0xb3,0x03, 0xf0,0x45,0x23,0x45,0xfe,0x02);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("d2ac1b6a-d29f-554b-b303-f0452345fe02")
                IClipboardStatics2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetHistoryItemsAsync(
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItemsResult* > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE ClearHistory(
                        boolean *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE DeleteItemFromHistory(
                        ABI::Windows::ApplicationModel::DataTransfer::IClipboardHistoryItem *item,
                        boolean *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetHistoryItemAsContent(
                        ABI::Windows::ApplicationModel::DataTransfer::IClipboardHistoryItem *item,
                        ABI::Windows::ApplicationModel::DataTransfer::SetHistoryItemAsContentStatus *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE IsHistoryEnabled(
                        boolean *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE IsRoamingEnabled(
                        boolean *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetContentWithOptions(
                        ABI::Windows::ApplicationModel::DataTransfer::IDataPackage *content,
                        ABI::Windows::ApplicationModel::DataTransfer::IClipboardContentOptions *options,
                        boolean *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_HistoryChanged(
                        ABI::Windows::Foundation::IEventHandler<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryChangedEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_HistoryChanged(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_RoamingEnabledChanged(
                        ABI::Windows::Foundation::IEventHandler<IInspectable* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_RoamingEnabledChanged(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_HistoryEnabledChanged(
                        ABI::Windows::Foundation::IEventHandler<IInspectable* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_HistoryEnabledChanged(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2, 0xd2ac1b6a, 0xd29f, 0x554b, 0xb3,0x03, 0xf0,0x45,0x23,0x45,0xfe,0x02)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2 *This,
        TrustLevel *trustLevel);

    /*** IClipboardStatics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetHistoryItemsAsync)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2 *This,
        __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult **operation);

    HRESULT (STDMETHODCALLTYPE *ClearHistory)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2 *This,
        boolean *result);

    HRESULT (STDMETHODCALLTYPE *DeleteItemFromHistory)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2 *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem *item,
        boolean *result);

    HRESULT (STDMETHODCALLTYPE *SetHistoryItemAsContent)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2 *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem *item,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CSetHistoryItemAsContentStatus *result);

    HRESULT (STDMETHODCALLTYPE *IsHistoryEnabled)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2 *This,
        boolean *result);

    HRESULT (STDMETHODCALLTYPE *IsRoamingEnabled)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2 *This,
        boolean *result);

    HRESULT (STDMETHODCALLTYPE *SetContentWithOptions)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2 *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *content,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions *options,
        boolean *result);

    HRESULT (STDMETHODCALLTYPE *add_HistoryChanged)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2 *This,
        __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_HistoryChanged)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2 *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_RoamingEnabledChanged)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2 *This,
        __FIEventHandler_1_IInspectable *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_RoamingEnabledChanged)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2 *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_HistoryEnabledChanged)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2 *This,
        __FIEventHandler_1_IInspectable *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_HistoryEnabledChanged)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2 *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IClipboardStatics2 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_GetHistoryItemsAsync(This,operation) (This)->lpVtbl->GetHistoryItemsAsync(This,operation)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_ClearHistory(This,result) (This)->lpVtbl->ClearHistory(This,result)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_DeleteItemFromHistory(This,item,result) (This)->lpVtbl->DeleteItemFromHistory(This,item,result)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_SetHistoryItemAsContent(This,item,result) (This)->lpVtbl->SetHistoryItemAsContent(This,item,result)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_IsHistoryEnabled(This,result) (This)->lpVtbl->IsHistoryEnabled(This,result)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_IsRoamingEnabled(This,result) (This)->lpVtbl->IsRoamingEnabled(This,result)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_SetContentWithOptions(This,content,options,result) (This)->lpVtbl->SetContentWithOptions(This,content,options,result)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_add_HistoryChanged(This,handler,token) (This)->lpVtbl->add_HistoryChanged(This,handler,token)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_remove_HistoryChanged(This,token) (This)->lpVtbl->remove_HistoryChanged(This,token)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_add_RoamingEnabledChanged(This,handler,token) (This)->lpVtbl->add_RoamingEnabledChanged(This,handler,token)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_remove_RoamingEnabledChanged(This,token) (This)->lpVtbl->remove_RoamingEnabledChanged(This,token)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_add_HistoryEnabledChanged(This,handler,token) (This)->lpVtbl->add_HistoryEnabledChanged(This,handler,token)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_remove_HistoryEnabledChanged(This,token) (This)->lpVtbl->remove_HistoryEnabledChanged(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IClipboardStatics2 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_GetHistoryItemsAsync(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2* This,__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult **operation) {
    return This->lpVtbl->GetHistoryItemsAsync(This,operation);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_ClearHistory(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2* This,boolean *result) {
    return This->lpVtbl->ClearHistory(This,result);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_DeleteItemFromHistory(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem *item,boolean *result) {
    return This->lpVtbl->DeleteItemFromHistory(This,item,result);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_SetHistoryItemAsContent(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem *item,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CSetHistoryItemAsContentStatus *result) {
    return This->lpVtbl->SetHistoryItemAsContent(This,item,result);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_IsHistoryEnabled(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2* This,boolean *result) {
    return This->lpVtbl->IsHistoryEnabled(This,result);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_IsRoamingEnabled(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2* This,boolean *result) {
    return This->lpVtbl->IsRoamingEnabled(This,result);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_SetContentWithOptions(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *content,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardContentOptions *options,boolean *result) {
    return This->lpVtbl->SetContentWithOptions(This,content,options,result);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_add_HistoryChanged(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2* This,__FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_HistoryChanged(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_remove_HistoryChanged(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_HistoryChanged(This,token);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_add_RoamingEnabledChanged(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2* This,__FIEventHandler_1_IInspectable *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_RoamingEnabledChanged(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_remove_RoamingEnabledChanged(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_RoamingEnabledChanged(This,token);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_add_HistoryEnabledChanged(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2* This,__FIEventHandler_1_IInspectable *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_HistoryEnabledChanged(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_remove_HistoryEnabledChanged(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_HistoryEnabledChanged(This,token);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IClipboardStatics2 IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2
#define IClipboardStatics2Vtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2Vtbl
#define IClipboardStatics2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2
#define IClipboardStatics2_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_QueryInterface
#define IClipboardStatics2_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_AddRef
#define IClipboardStatics2_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_Release
#define IClipboardStatics2_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_GetIids
#define IClipboardStatics2_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_GetRuntimeClassName
#define IClipboardStatics2_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_GetTrustLevel
#define IClipboardStatics2_GetHistoryItemsAsync __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_GetHistoryItemsAsync
#define IClipboardStatics2_ClearHistory __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_ClearHistory
#define IClipboardStatics2_DeleteItemFromHistory __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_DeleteItemFromHistory
#define IClipboardStatics2_SetHistoryItemAsContent __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_SetHistoryItemAsContent
#define IClipboardStatics2_IsHistoryEnabled __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_IsHistoryEnabled
#define IClipboardStatics2_IsRoamingEnabled __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_IsRoamingEnabled
#define IClipboardStatics2_SetContentWithOptions __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_SetContentWithOptions
#define IClipboardStatics2_add_HistoryChanged __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_add_HistoryChanged
#define IClipboardStatics2_remove_HistoryChanged __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_remove_HistoryChanged
#define IClipboardStatics2_add_RoamingEnabledChanged __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_add_RoamingEnabledChanged
#define IClipboardStatics2_remove_RoamingEnabledChanged __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_remove_RoamingEnabledChanged
#define IClipboardStatics2_add_HistoryEnabledChanged __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_add_HistoryEnabledChanged
#define IClipboardStatics2_remove_HistoryEnabledChanged __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_remove_HistoryEnabledChanged
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardStatics2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */

/*****************************************************************************
 * IDataPackage interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage, 0x61ebf5c7, 0xefea, 0x4346, 0x95,0x54, 0x98,0x1d,0x7e,0x19,0x8f,0xfe);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("61ebf5c7-efea-4346-9554-981d7e198ffe")
                IDataPackage : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetView(
                        ABI::Windows::ApplicationModel::DataTransfer::IDataPackageView **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Properties(
                        ABI::Windows::ApplicationModel::DataTransfer::IDataPackagePropertySet **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_RequestedOperation(
                        ABI::Windows::ApplicationModel::DataTransfer::DataPackageOperation *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_RequestedOperation(
                        ABI::Windows::ApplicationModel::DataTransfer::DataPackageOperation value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_OperationCompleted(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,ABI::Windows::ApplicationModel::DataTransfer::OperationCompletedEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_OperationCompleted(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_Destroyed(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,IInspectable* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_Destroyed(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetData(
                        HSTRING format_id,
                        IInspectable *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetDataProvider(
                        HSTRING format_id,
                        ABI::Windows::ApplicationModel::DataTransfer::IDataProviderHandler *delay_renderer) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetText(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetUri(
                        ABI::Windows::Foundation::IUriRuntimeClass *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetHtmlFormat(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ResourceMap(
                        ABI::Windows::Foundation::Collections::IMap<HSTRING,ABI::Windows::Storage::Streams::RandomAccessStreamReference* > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetRtf(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetBitmap(
                        ABI::Windows::Storage::Streams::IRandomAccessStreamReference *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetStorageItemsReadOnly(
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Storage::IStorageItem* > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetStorageItems(
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Storage::IStorageItem* > *value,
                        boolean read_only) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage, 0x61ebf5c7, 0xefea, 0x4346, 0x95,0x54, 0x98,0x1d,0x7e,0x19,0x8f,0xfe)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *This,
        TrustLevel *trustLevel);

    /*** IDataPackage methods ***/
    HRESULT (STDMETHODCALLTYPE *GetView)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView **result);

    HRESULT (STDMETHODCALLTYPE *get_Properties)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet **value);

    HRESULT (STDMETHODCALLTYPE *get_RequestedOperation)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageOperation *value);

    HRESULT (STDMETHODCALLTYPE *put_RequestedOperation)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageOperation value);

    HRESULT (STDMETHODCALLTYPE *add_OperationCompleted)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *This,
        __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_OperationCompleted)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_Destroyed)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *This,
        __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_Destroyed)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *SetData)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *This,
        HSTRING format_id,
        IInspectable *value);

    HRESULT (STDMETHODCALLTYPE *SetDataProvider)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *This,
        HSTRING format_id,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler *delay_renderer);

    HRESULT (STDMETHODCALLTYPE *SetText)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *SetUri)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *value);

    HRESULT (STDMETHODCALLTYPE *SetHtmlFormat)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_ResourceMap)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *This,
        __FIMap_2_HSTRING_Windows__CStorage__CStreams__CRandomAccessStreamReference **value);

    HRESULT (STDMETHODCALLTYPE *SetRtf)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *SetBitmap)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *This,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference *value);

    HRESULT (STDMETHODCALLTYPE *SetStorageItemsReadOnly)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *This,
        __FIIterable_1_Windows__CStorage__CIStorageItem *value);

    HRESULT (STDMETHODCALLTYPE *SetStorageItems)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *This,
        __FIIterable_1_Windows__CStorage__CIStorageItem *value,
        boolean read_only);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataPackage methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_GetView(This,result) (This)->lpVtbl->GetView(This,result)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_get_Properties(This,value) (This)->lpVtbl->get_Properties(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_get_RequestedOperation(This,value) (This)->lpVtbl->get_RequestedOperation(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_put_RequestedOperation(This,value) (This)->lpVtbl->put_RequestedOperation(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_add_OperationCompleted(This,handler,token) (This)->lpVtbl->add_OperationCompleted(This,handler,token)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_remove_OperationCompleted(This,token) (This)->lpVtbl->remove_OperationCompleted(This,token)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_add_Destroyed(This,handler,token) (This)->lpVtbl->add_Destroyed(This,handler,token)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_remove_Destroyed(This,token) (This)->lpVtbl->remove_Destroyed(This,token)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetData(This,format_id,value) (This)->lpVtbl->SetData(This,format_id,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetDataProvider(This,format_id,delay_renderer) (This)->lpVtbl->SetDataProvider(This,format_id,delay_renderer)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetText(This,value) (This)->lpVtbl->SetText(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetUri(This,value) (This)->lpVtbl->SetUri(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetHtmlFormat(This,value) (This)->lpVtbl->SetHtmlFormat(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_get_ResourceMap(This,value) (This)->lpVtbl->get_ResourceMap(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetRtf(This,value) (This)->lpVtbl->SetRtf(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetBitmap(This,value) (This)->lpVtbl->SetBitmap(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetStorageItemsReadOnly(This,value) (This)->lpVtbl->SetStorageItemsReadOnly(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetStorageItems(This,value,read_only) (This)->lpVtbl->SetStorageItems(This,value,read_only)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataPackage methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_GetView(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView **result) {
    return This->lpVtbl->GetView(This,result);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_get_Properties(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet **value) {
    return This->lpVtbl->get_Properties(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_get_RequestedOperation(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageOperation *value) {
    return This->lpVtbl->get_RequestedOperation(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_put_RequestedOperation(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageOperation value) {
    return This->lpVtbl->put_RequestedOperation(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_add_OperationCompleted(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_OperationCompleted(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_remove_OperationCompleted(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_OperationCompleted(This,token);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_add_Destroyed(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_Destroyed(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_remove_Destroyed(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_Destroyed(This,token);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetData(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,HSTRING format_id,IInspectable *value) {
    return This->lpVtbl->SetData(This,format_id,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetDataProvider(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,HSTRING format_id,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderHandler *delay_renderer) {
    return This->lpVtbl->SetDataProvider(This,format_id,delay_renderer);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetText(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,HSTRING value) {
    return This->lpVtbl->SetText(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetUri(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *value) {
    return This->lpVtbl->SetUri(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetHtmlFormat(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,HSTRING value) {
    return This->lpVtbl->SetHtmlFormat(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_get_ResourceMap(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,__FIMap_2_HSTRING_Windows__CStorage__CStreams__CRandomAccessStreamReference **value) {
    return This->lpVtbl->get_ResourceMap(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetRtf(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,HSTRING value) {
    return This->lpVtbl->SetRtf(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetBitmap(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference *value) {
    return This->lpVtbl->SetBitmap(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetStorageItemsReadOnly(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,__FIIterable_1_Windows__CStorage__CIStorageItem *value) {
    return This->lpVtbl->SetStorageItemsReadOnly(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetStorageItems(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage* This,__FIIterable_1_Windows__CStorage__CIStorageItem *value,boolean read_only) {
    return This->lpVtbl->SetStorageItems(This,value,read_only);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataPackage IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage
#define IDataPackageVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageVtbl
#define IDataPackage __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage
#define IDataPackage_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_QueryInterface
#define IDataPackage_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_AddRef
#define IDataPackage_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_Release
#define IDataPackage_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_GetIids
#define IDataPackage_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_GetRuntimeClassName
#define IDataPackage_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_GetTrustLevel
#define IDataPackage_GetView __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_GetView
#define IDataPackage_get_Properties __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_get_Properties
#define IDataPackage_get_RequestedOperation __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_get_RequestedOperation
#define IDataPackage_put_RequestedOperation __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_put_RequestedOperation
#define IDataPackage_add_OperationCompleted __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_add_OperationCompleted
#define IDataPackage_remove_OperationCompleted __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_remove_OperationCompleted
#define IDataPackage_add_Destroyed __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_add_Destroyed
#define IDataPackage_remove_Destroyed __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_remove_Destroyed
#define IDataPackage_SetData __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetData
#define IDataPackage_SetDataProvider __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetDataProvider
#define IDataPackage_SetText __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetText
#define IDataPackage_SetUri __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetUri
#define IDataPackage_SetHtmlFormat __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetHtmlFormat
#define IDataPackage_get_ResourceMap __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_get_ResourceMap
#define IDataPackage_SetRtf __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetRtf
#define IDataPackage_SetBitmap __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetBitmap
#define IDataPackage_SetStorageItemsReadOnly __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetStorageItemsReadOnly
#define IDataPackage_SetStorageItems __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_SetStorageItems
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDataPackage2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2, 0x041c1fe9, 0x2409, 0x45e1, 0xa5,0x38, 0x4c,0x53,0xee,0xee,0x04,0xa7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("041c1fe9-2409-45e1-a538-4c53eeee04a7")
                IDataPackage2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE SetApplicationLink(
                        ABI::Windows::Foundation::IUriRuntimeClass *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetWebLink(
                        ABI::Windows::Foundation::IUriRuntimeClass *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2, 0x041c1fe9, 0x2409, 0x45e1, 0xa5,0x38, 0x4c,0x53,0xee,0xee,0x04,0xa7)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2 *This,
        TrustLevel *trustLevel);

    /*** IDataPackage2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetApplicationLink)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2 *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *value);

    HRESULT (STDMETHODCALLTYPE *SetWebLink)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2 *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataPackage2 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_SetApplicationLink(This,value) (This)->lpVtbl->SetApplicationLink(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_SetWebLink(This,value) (This)->lpVtbl->SetWebLink(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataPackage2 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_SetApplicationLink(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *value) {
    return This->lpVtbl->SetApplicationLink(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_SetWebLink(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *value) {
    return This->lpVtbl->SetWebLink(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataPackage2 IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2
#define IDataPackage2Vtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2Vtbl
#define IDataPackage2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2
#define IDataPackage2_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_QueryInterface
#define IDataPackage2_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_AddRef
#define IDataPackage2_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_Release
#define IDataPackage2_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_GetIids
#define IDataPackage2_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_GetRuntimeClassName
#define IDataPackage2_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_GetTrustLevel
#define IDataPackage2_SetApplicationLink __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_SetApplicationLink
#define IDataPackage2_SetWebLink __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_SetWebLink
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDataPackage3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3, 0x88f31f5d, 0x787b, 0x4d32, 0x96,0x5a, 0xa9,0x83,0x81,0x05,0xa0,0x56);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("88f31f5d-787b-4d32-965a-a9838105a056")
                IDataPackage3 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE add_ShareCompleted(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,ABI::Windows::ApplicationModel::DataTransfer::ShareCompletedEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_ShareCompleted(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3, 0x88f31f5d, 0x787b, 0x4d32, 0x96,0x5a, 0xa9,0x83,0x81,0x05,0xa0,0x56)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3 *This,
        TrustLevel *trustLevel);

    /*** IDataPackage3 methods ***/
    HRESULT (STDMETHODCALLTYPE *add_ShareCompleted)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3 *This,
        __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_ShareCompleted)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3 *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataPackage3 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_add_ShareCompleted(This,handler,token) (This)->lpVtbl->add_ShareCompleted(This,handler,token)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_remove_ShareCompleted(This,token) (This)->lpVtbl->remove_ShareCompleted(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataPackage3 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_add_ShareCompleted(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3* This,__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_ShareCompleted(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_remove_ShareCompleted(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_ShareCompleted(This,token);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataPackage3 IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3
#define IDataPackage3Vtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3Vtbl
#define IDataPackage3 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3
#define IDataPackage3_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_QueryInterface
#define IDataPackage3_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_AddRef
#define IDataPackage3_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_Release
#define IDataPackage3_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_GetIids
#define IDataPackage3_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_GetRuntimeClassName
#define IDataPackage3_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_GetTrustLevel
#define IDataPackage3_add_ShareCompleted __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_add_ShareCompleted
#define IDataPackage3_remove_ShareCompleted __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_remove_ShareCompleted
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage3_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IDataPackage4 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4, 0x13a24ec8, 0x9382, 0x536f, 0x85,0x2a, 0x30,0x45,0xe1,0xb2,0x9a,0x3b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("13a24ec8-9382-536f-852a-3045e1b29a3b")
                IDataPackage4 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE add_ShareCanceled(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,IInspectable* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_ShareCanceled(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4, 0x13a24ec8, 0x9382, 0x536f, 0x85,0x2a, 0x30,0x45,0xe1,0xb2,0x9a,0x3b)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4 *This,
        TrustLevel *trustLevel);

    /*** IDataPackage4 methods ***/
    HRESULT (STDMETHODCALLTYPE *add_ShareCanceled)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4 *This,
        __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_ShareCanceled)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4 *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataPackage4 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_add_ShareCanceled(This,handler,token) (This)->lpVtbl->add_ShareCanceled(This,handler,token)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_remove_ShareCanceled(This,token) (This)->lpVtbl->remove_ShareCanceled(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataPackage4 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_add_ShareCanceled(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4* This,__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_ShareCanceled(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_remove_ShareCanceled(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_ShareCanceled(This,token);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataPackage4 IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4
#define IDataPackage4Vtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4Vtbl
#define IDataPackage4 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4
#define IDataPackage4_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_QueryInterface
#define IDataPackage4_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_AddRef
#define IDataPackage4_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_Release
#define IDataPackage4_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_GetIids
#define IDataPackage4_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_GetRuntimeClassName
#define IDataPackage4_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_GetTrustLevel
#define IDataPackage4_add_ShareCanceled __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_add_ShareCanceled
#define IDataPackage4_remove_ShareCanceled __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_remove_ShareCanceled
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage4_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000 */

/*****************************************************************************
 * IDataPackagePropertySet interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet, 0xcd1c93eb, 0x4c4c, 0x443a, 0xa8,0xd3, 0xf5,0xc2,0x41,0xe9,0x16,0x89);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("cd1c93eb-4c4c-443a-a8d3-f5c241e91689")
                IDataPackagePropertySet : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Title(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Title(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Description(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Description(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Thumbnail(
                        ABI::Windows::Storage::Streams::IRandomAccessStreamReference **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Thumbnail(
                        ABI::Windows::Storage::Streams::IRandomAccessStreamReference *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_FileTypes(
                        ABI::Windows::Foundation::Collections::IVector<HSTRING > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ApplicationName(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ApplicationName(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ApplicationListingUri(
                        ABI::Windows::Foundation::IUriRuntimeClass **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ApplicationListingUri(
                        ABI::Windows::Foundation::IUriRuntimeClass *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet, 0xcd1c93eb, 0x4c4c, 0x443a, 0xa8,0xd3, 0xf5,0xc2,0x41,0xe9,0x16,0x89)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet *This,
        TrustLevel *trustLevel);

    /*** IDataPackagePropertySet methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Title)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Title)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Description)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Thumbnail)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet *This,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **value);

    HRESULT (STDMETHODCALLTYPE *put_Thumbnail)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet *This,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference *value);

    HRESULT (STDMETHODCALLTYPE *get_FileTypes)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet *This,
        __FIVector_1_HSTRING **value);

    HRESULT (STDMETHODCALLTYPE *get_ApplicationName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_ApplicationName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_ApplicationListingUri)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value);

    HRESULT (STDMETHODCALLTYPE *put_ApplicationListingUri)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataPackagePropertySet methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_get_Title(This,value) (This)->lpVtbl->get_Title(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_put_Title(This,value) (This)->lpVtbl->put_Title(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_get_Description(This,value) (This)->lpVtbl->get_Description(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_put_Description(This,value) (This)->lpVtbl->put_Description(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_get_Thumbnail(This,value) (This)->lpVtbl->get_Thumbnail(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_put_Thumbnail(This,value) (This)->lpVtbl->put_Thumbnail(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_get_FileTypes(This,value) (This)->lpVtbl->get_FileTypes(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_get_ApplicationName(This,value) (This)->lpVtbl->get_ApplicationName(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_put_ApplicationName(This,value) (This)->lpVtbl->put_ApplicationName(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_get_ApplicationListingUri(This,value) (This)->lpVtbl->get_ApplicationListingUri(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_put_ApplicationListingUri(This,value) (This)->lpVtbl->put_ApplicationListingUri(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataPackagePropertySet methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_get_Title(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet* This,HSTRING *value) {
    return This->lpVtbl->get_Title(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_put_Title(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet* This,HSTRING value) {
    return This->lpVtbl->put_Title(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_get_Description(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet* This,HSTRING *value) {
    return This->lpVtbl->get_Description(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_put_Description(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet* This,HSTRING value) {
    return This->lpVtbl->put_Description(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_get_Thumbnail(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet* This,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **value) {
    return This->lpVtbl->get_Thumbnail(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_put_Thumbnail(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet* This,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference *value) {
    return This->lpVtbl->put_Thumbnail(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_get_FileTypes(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet* This,__FIVector_1_HSTRING **value) {
    return This->lpVtbl->get_FileTypes(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_get_ApplicationName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet* This,HSTRING *value) {
    return This->lpVtbl->get_ApplicationName(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_put_ApplicationName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet* This,HSTRING value) {
    return This->lpVtbl->put_ApplicationName(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_get_ApplicationListingUri(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value) {
    return This->lpVtbl->get_ApplicationListingUri(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_put_ApplicationListingUri(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *value) {
    return This->lpVtbl->put_ApplicationListingUri(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataPackagePropertySet IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet
#define IDataPackagePropertySetVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetVtbl
#define IDataPackagePropertySet __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet
#define IDataPackagePropertySet_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_QueryInterface
#define IDataPackagePropertySet_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_AddRef
#define IDataPackagePropertySet_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_Release
#define IDataPackagePropertySet_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_GetIids
#define IDataPackagePropertySet_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_GetRuntimeClassName
#define IDataPackagePropertySet_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_GetTrustLevel
#define IDataPackagePropertySet_get_Title __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_get_Title
#define IDataPackagePropertySet_put_Title __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_put_Title
#define IDataPackagePropertySet_get_Description __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_get_Description
#define IDataPackagePropertySet_put_Description __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_put_Description
#define IDataPackagePropertySet_get_Thumbnail __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_get_Thumbnail
#define IDataPackagePropertySet_put_Thumbnail __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_put_Thumbnail
#define IDataPackagePropertySet_get_FileTypes __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_get_FileTypes
#define IDataPackagePropertySet_get_ApplicationName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_get_ApplicationName
#define IDataPackagePropertySet_put_ApplicationName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_put_ApplicationName
#define IDataPackagePropertySet_get_ApplicationListingUri __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_get_ApplicationListingUri
#define IDataPackagePropertySet_put_ApplicationListingUri __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_put_ApplicationListingUri
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDataPackagePropertySet2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2, 0xeb505d4a, 0x9800, 0x46aa, 0xb1,0x81, 0x7b,0x6f,0x0f,0x2b,0x91,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("eb505d4a-9800-46aa-b181-7b6f0f2b919a")
                IDataPackagePropertySet2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ContentSourceWebLink(
                        ABI::Windows::Foundation::IUriRuntimeClass **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ContentSourceWebLink(
                        ABI::Windows::Foundation::IUriRuntimeClass *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ContentSourceApplicationLink(
                        ABI::Windows::Foundation::IUriRuntimeClass **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ContentSourceApplicationLink(
                        ABI::Windows::Foundation::IUriRuntimeClass *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_PackageFamilyName(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_PackageFamilyName(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Square30x30Logo(
                        ABI::Windows::Storage::Streams::IRandomAccessStreamReference **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Square30x30Logo(
                        ABI::Windows::Storage::Streams::IRandomAccessStreamReference *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_LogoBackgroundColor(
                        ABI::Windows::UI::Color *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_LogoBackgroundColor(
                        ABI::Windows::UI::Color value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2, 0xeb505d4a, 0x9800, 0x46aa, 0xb1,0x81, 0x7b,0x6f,0x0f,0x2b,0x91,0x9a)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2 *This,
        TrustLevel *trustLevel);

    /*** IDataPackagePropertySet2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ContentSourceWebLink)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2 *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value);

    HRESULT (STDMETHODCALLTYPE *put_ContentSourceWebLink)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2 *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *value);

    HRESULT (STDMETHODCALLTYPE *get_ContentSourceApplicationLink)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2 *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value);

    HRESULT (STDMETHODCALLTYPE *put_ContentSourceApplicationLink)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2 *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *value);

    HRESULT (STDMETHODCALLTYPE *get_PackageFamilyName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_PackageFamilyName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2 *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Square30x30Logo)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2 *This,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **value);

    HRESULT (STDMETHODCALLTYPE *put_Square30x30Logo)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2 *This,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference *value);

    HRESULT (STDMETHODCALLTYPE *get_LogoBackgroundColor)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2 *This,
        __x_ABI_CWindows_CUI_CColor *value);

    HRESULT (STDMETHODCALLTYPE *put_LogoBackgroundColor)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2 *This,
        __x_ABI_CWindows_CUI_CColor value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataPackagePropertySet2 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_get_ContentSourceWebLink(This,value) (This)->lpVtbl->get_ContentSourceWebLink(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_put_ContentSourceWebLink(This,value) (This)->lpVtbl->put_ContentSourceWebLink(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_get_ContentSourceApplicationLink(This,value) (This)->lpVtbl->get_ContentSourceApplicationLink(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_put_ContentSourceApplicationLink(This,value) (This)->lpVtbl->put_ContentSourceApplicationLink(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_get_PackageFamilyName(This,value) (This)->lpVtbl->get_PackageFamilyName(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_put_PackageFamilyName(This,value) (This)->lpVtbl->put_PackageFamilyName(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_get_Square30x30Logo(This,value) (This)->lpVtbl->get_Square30x30Logo(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_put_Square30x30Logo(This,value) (This)->lpVtbl->put_Square30x30Logo(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_get_LogoBackgroundColor(This,value) (This)->lpVtbl->get_LogoBackgroundColor(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_put_LogoBackgroundColor(This,value) (This)->lpVtbl->put_LogoBackgroundColor(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataPackagePropertySet2 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_get_ContentSourceWebLink(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value) {
    return This->lpVtbl->get_ContentSourceWebLink(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_put_ContentSourceWebLink(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *value) {
    return This->lpVtbl->put_ContentSourceWebLink(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_get_ContentSourceApplicationLink(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value) {
    return This->lpVtbl->get_ContentSourceApplicationLink(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_put_ContentSourceApplicationLink(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *value) {
    return This->lpVtbl->put_ContentSourceApplicationLink(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_get_PackageFamilyName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2* This,HSTRING *value) {
    return This->lpVtbl->get_PackageFamilyName(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_put_PackageFamilyName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2* This,HSTRING value) {
    return This->lpVtbl->put_PackageFamilyName(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_get_Square30x30Logo(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2* This,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **value) {
    return This->lpVtbl->get_Square30x30Logo(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_put_Square30x30Logo(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2* This,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference *value) {
    return This->lpVtbl->put_Square30x30Logo(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_get_LogoBackgroundColor(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2* This,__x_ABI_CWindows_CUI_CColor *value) {
    return This->lpVtbl->get_LogoBackgroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_put_LogoBackgroundColor(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2* This,__x_ABI_CWindows_CUI_CColor value) {
    return This->lpVtbl->put_LogoBackgroundColor(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataPackagePropertySet2 IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2
#define IDataPackagePropertySet2Vtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2Vtbl
#define IDataPackagePropertySet2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2
#define IDataPackagePropertySet2_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_QueryInterface
#define IDataPackagePropertySet2_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_AddRef
#define IDataPackagePropertySet2_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_Release
#define IDataPackagePropertySet2_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_GetIids
#define IDataPackagePropertySet2_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_GetRuntimeClassName
#define IDataPackagePropertySet2_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_GetTrustLevel
#define IDataPackagePropertySet2_get_ContentSourceWebLink __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_get_ContentSourceWebLink
#define IDataPackagePropertySet2_put_ContentSourceWebLink __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_put_ContentSourceWebLink
#define IDataPackagePropertySet2_get_ContentSourceApplicationLink __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_get_ContentSourceApplicationLink
#define IDataPackagePropertySet2_put_ContentSourceApplicationLink __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_put_ContentSourceApplicationLink
#define IDataPackagePropertySet2_get_PackageFamilyName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_get_PackageFamilyName
#define IDataPackagePropertySet2_put_PackageFamilyName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_put_PackageFamilyName
#define IDataPackagePropertySet2_get_Square30x30Logo __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_get_Square30x30Logo
#define IDataPackagePropertySet2_put_Square30x30Logo __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_put_Square30x30Logo
#define IDataPackagePropertySet2_get_LogoBackgroundColor __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_get_LogoBackgroundColor
#define IDataPackagePropertySet2_put_LogoBackgroundColor __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_put_LogoBackgroundColor
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDataPackagePropertySet3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3, 0x9e87fd9b, 0x5205, 0x401b, 0x87,0x4a, 0x45,0x56,0x53,0xbd,0x39,0xe8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("9e87fd9b-5205-401b-874a-455653bd39e8")
                IDataPackagePropertySet3 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_EnterpriseId(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_EnterpriseId(
                        HSTRING value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3, 0x9e87fd9b, 0x5205, 0x401b, 0x87,0x4a, 0x45,0x56,0x53,0xbd,0x39,0xe8)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3 *This,
        TrustLevel *trustLevel);

    /*** IDataPackagePropertySet3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_EnterpriseId)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_EnterpriseId)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3 *This,
        HSTRING value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataPackagePropertySet3 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_get_EnterpriseId(This,value) (This)->lpVtbl->get_EnterpriseId(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_put_EnterpriseId(This,value) (This)->lpVtbl->put_EnterpriseId(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataPackagePropertySet3 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_get_EnterpriseId(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3* This,HSTRING *value) {
    return This->lpVtbl->get_EnterpriseId(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_put_EnterpriseId(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3* This,HSTRING value) {
    return This->lpVtbl->put_EnterpriseId(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataPackagePropertySet3 IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3
#define IDataPackagePropertySet3Vtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3Vtbl
#define IDataPackagePropertySet3 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3
#define IDataPackagePropertySet3_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_QueryInterface
#define IDataPackagePropertySet3_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_AddRef
#define IDataPackagePropertySet3_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_Release
#define IDataPackagePropertySet3_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_GetIids
#define IDataPackagePropertySet3_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_GetRuntimeClassName
#define IDataPackagePropertySet3_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_GetTrustLevel
#define IDataPackagePropertySet3_get_EnterpriseId __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_get_EnterpriseId
#define IDataPackagePropertySet3_put_EnterpriseId __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_put_EnterpriseId
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet3_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDataPackagePropertySet4 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4, 0x6390ebf5, 0x1739, 0x4c74, 0xb2,0x2f, 0x86,0x5f,0xab,0x5e,0x85,0x45);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("6390ebf5-1739-4c74-b22f-865fab5e8545")
                IDataPackagePropertySet4 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ContentSourceUserActivityJson(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ContentSourceUserActivityJson(
                        HSTRING value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4, 0x6390ebf5, 0x1739, 0x4c74, 0xb2,0x2f, 0x86,0x5f,0xab,0x5e,0x85,0x45)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4 *This,
        TrustLevel *trustLevel);

    /*** IDataPackagePropertySet4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ContentSourceUserActivityJson)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_ContentSourceUserActivityJson)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4 *This,
        HSTRING value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataPackagePropertySet4 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_get_ContentSourceUserActivityJson(This,value) (This)->lpVtbl->get_ContentSourceUserActivityJson(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_put_ContentSourceUserActivityJson(This,value) (This)->lpVtbl->put_ContentSourceUserActivityJson(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataPackagePropertySet4 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_get_ContentSourceUserActivityJson(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4* This,HSTRING *value) {
    return This->lpVtbl->get_ContentSourceUserActivityJson(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_put_ContentSourceUserActivityJson(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4* This,HSTRING value) {
    return This->lpVtbl->put_ContentSourceUserActivityJson(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataPackagePropertySet4 IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4
#define IDataPackagePropertySet4Vtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4Vtbl
#define IDataPackagePropertySet4 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4
#define IDataPackagePropertySet4_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_QueryInterface
#define IDataPackagePropertySet4_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_AddRef
#define IDataPackagePropertySet4_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_Release
#define IDataPackagePropertySet4_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_GetIids
#define IDataPackagePropertySet4_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_GetRuntimeClassName
#define IDataPackagePropertySet4_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_GetTrustLevel
#define IDataPackagePropertySet4_get_ContentSourceUserActivityJson __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_get_ContentSourceUserActivityJson
#define IDataPackagePropertySet4_put_ContentSourceUserActivityJson __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_put_ContentSourceUserActivityJson
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySet4_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000 */

/*****************************************************************************
 * IDataPackagePropertySetView interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView, 0xb94cec01, 0x0c1a, 0x4c57, 0xbe,0x55, 0x75,0xd0,0x12,0x89,0x73,0x5d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("b94cec01-0c1a-4c57-be55-75d01289735d")
                IDataPackagePropertySetView : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Title(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Description(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Thumbnail(
                        ABI::Windows::Storage::Streams::IRandomAccessStreamReference **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_FileTypes(
                        ABI::Windows::Foundation::Collections::IVectorView<HSTRING > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ApplicationName(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ApplicationListingUri(
                        ABI::Windows::Foundation::IUriRuntimeClass **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView, 0xb94cec01, 0x0c1a, 0x4c57, 0xbe,0x55, 0x75,0xd0,0x12,0x89,0x73,0x5d)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetViewVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView *This,
        TrustLevel *trustLevel);

    /*** IDataPackagePropertySetView methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Title)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Thumbnail)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView *This,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **value);

    HRESULT (STDMETHODCALLTYPE *get_FileTypes)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView *This,
        __FIVectorView_1_HSTRING **value);

    HRESULT (STDMETHODCALLTYPE *get_ApplicationName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_ApplicationListingUri)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetViewVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetViewVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataPackagePropertySetView methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_get_Title(This,value) (This)->lpVtbl->get_Title(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_get_Description(This,value) (This)->lpVtbl->get_Description(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_get_Thumbnail(This,value) (This)->lpVtbl->get_Thumbnail(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_get_FileTypes(This,value) (This)->lpVtbl->get_FileTypes(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_get_ApplicationName(This,value) (This)->lpVtbl->get_ApplicationName(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_get_ApplicationListingUri(This,value) (This)->lpVtbl->get_ApplicationListingUri(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataPackagePropertySetView methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_get_Title(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView* This,HSTRING *value) {
    return This->lpVtbl->get_Title(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_get_Description(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView* This,HSTRING *value) {
    return This->lpVtbl->get_Description(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_get_Thumbnail(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView* This,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **value) {
    return This->lpVtbl->get_Thumbnail(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_get_FileTypes(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView* This,__FIVectorView_1_HSTRING **value) {
    return This->lpVtbl->get_FileTypes(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_get_ApplicationName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView* This,HSTRING *value) {
    return This->lpVtbl->get_ApplicationName(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_get_ApplicationListingUri(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value) {
    return This->lpVtbl->get_ApplicationListingUri(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataPackagePropertySetView IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView
#define IDataPackagePropertySetViewVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetViewVtbl
#define IDataPackagePropertySetView __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView
#define IDataPackagePropertySetView_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_QueryInterface
#define IDataPackagePropertySetView_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_AddRef
#define IDataPackagePropertySetView_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_Release
#define IDataPackagePropertySetView_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_GetIids
#define IDataPackagePropertySetView_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_GetRuntimeClassName
#define IDataPackagePropertySetView_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_GetTrustLevel
#define IDataPackagePropertySetView_get_Title __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_get_Title
#define IDataPackagePropertySetView_get_Description __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_get_Description
#define IDataPackagePropertySetView_get_Thumbnail __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_get_Thumbnail
#define IDataPackagePropertySetView_get_FileTypes __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_get_FileTypes
#define IDataPackagePropertySetView_get_ApplicationName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_get_ApplicationName
#define IDataPackagePropertySetView_get_ApplicationListingUri __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_get_ApplicationListingUri
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDataPackagePropertySetView2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2, 0x6054509b, 0x8ebe, 0x4feb, 0x9c,0x1e, 0x75,0xe6,0x9d,0xe5,0x4b,0x84);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("6054509b-8ebe-4feb-9c1e-75e69de54b84")
                IDataPackagePropertySetView2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_PackageFamilyName(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ContentSourceWebLink(
                        ABI::Windows::Foundation::IUriRuntimeClass **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ContentSourceApplicationLink(
                        ABI::Windows::Foundation::IUriRuntimeClass **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Square30x30Logo(
                        ABI::Windows::Storage::Streams::IRandomAccessStreamReference **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_LogoBackgroundColor(
                        ABI::Windows::UI::Color *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2, 0x6054509b, 0x8ebe, 0x4feb, 0x9c,0x1e, 0x75,0xe6,0x9d,0xe5,0x4b,0x84)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2 *This,
        TrustLevel *trustLevel);

    /*** IDataPackagePropertySetView2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_PackageFamilyName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_ContentSourceWebLink)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2 *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value);

    HRESULT (STDMETHODCALLTYPE *get_ContentSourceApplicationLink)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2 *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value);

    HRESULT (STDMETHODCALLTYPE *get_Square30x30Logo)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2 *This,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **value);

    HRESULT (STDMETHODCALLTYPE *get_LogoBackgroundColor)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2 *This,
        __x_ABI_CWindows_CUI_CColor *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataPackagePropertySetView2 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_get_PackageFamilyName(This,value) (This)->lpVtbl->get_PackageFamilyName(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_get_ContentSourceWebLink(This,value) (This)->lpVtbl->get_ContentSourceWebLink(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_get_ContentSourceApplicationLink(This,value) (This)->lpVtbl->get_ContentSourceApplicationLink(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_get_Square30x30Logo(This,value) (This)->lpVtbl->get_Square30x30Logo(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_get_LogoBackgroundColor(This,value) (This)->lpVtbl->get_LogoBackgroundColor(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataPackagePropertySetView2 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_get_PackageFamilyName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2* This,HSTRING *value) {
    return This->lpVtbl->get_PackageFamilyName(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_get_ContentSourceWebLink(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value) {
    return This->lpVtbl->get_ContentSourceWebLink(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_get_ContentSourceApplicationLink(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value) {
    return This->lpVtbl->get_ContentSourceApplicationLink(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_get_Square30x30Logo(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2* This,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **value) {
    return This->lpVtbl->get_Square30x30Logo(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_get_LogoBackgroundColor(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2* This,__x_ABI_CWindows_CUI_CColor *value) {
    return This->lpVtbl->get_LogoBackgroundColor(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataPackagePropertySetView2 IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2
#define IDataPackagePropertySetView2Vtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2Vtbl
#define IDataPackagePropertySetView2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2
#define IDataPackagePropertySetView2_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_QueryInterface
#define IDataPackagePropertySetView2_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_AddRef
#define IDataPackagePropertySetView2_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_Release
#define IDataPackagePropertySetView2_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_GetIids
#define IDataPackagePropertySetView2_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_GetRuntimeClassName
#define IDataPackagePropertySetView2_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_GetTrustLevel
#define IDataPackagePropertySetView2_get_PackageFamilyName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_get_PackageFamilyName
#define IDataPackagePropertySetView2_get_ContentSourceWebLink __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_get_ContentSourceWebLink
#define IDataPackagePropertySetView2_get_ContentSourceApplicationLink __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_get_ContentSourceApplicationLink
#define IDataPackagePropertySetView2_get_Square30x30Logo __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_get_Square30x30Logo
#define IDataPackagePropertySetView2_get_LogoBackgroundColor __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_get_LogoBackgroundColor
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDataPackagePropertySetView3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3, 0xdb764ce5, 0xd174, 0x495c, 0x84,0xfc, 0x1a,0x51,0xf6,0xab,0x45,0xd7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("db764ce5-d174-495c-84fc-1a51f6ab45d7")
                IDataPackagePropertySetView3 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_EnterpriseId(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3, 0xdb764ce5, 0xd174, 0x495c, 0x84,0xfc, 0x1a,0x51,0xf6,0xab,0x45,0xd7)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3 *This,
        TrustLevel *trustLevel);

    /*** IDataPackagePropertySetView3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_EnterpriseId)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3 *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataPackagePropertySetView3 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_get_EnterpriseId(This,value) (This)->lpVtbl->get_EnterpriseId(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataPackagePropertySetView3 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_get_EnterpriseId(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3* This,HSTRING *value) {
    return This->lpVtbl->get_EnterpriseId(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataPackagePropertySetView3 IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3
#define IDataPackagePropertySetView3Vtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3Vtbl
#define IDataPackagePropertySetView3 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3
#define IDataPackagePropertySetView3_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_QueryInterface
#define IDataPackagePropertySetView3_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_AddRef
#define IDataPackagePropertySetView3_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_Release
#define IDataPackagePropertySetView3_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_GetIids
#define IDataPackagePropertySetView3_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_GetRuntimeClassName
#define IDataPackagePropertySetView3_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_GetTrustLevel
#define IDataPackagePropertySetView3_get_EnterpriseId __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_get_EnterpriseId
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView3_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDataPackagePropertySetView4 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4, 0x4474c80d, 0xd16f, 0x40ae, 0x95,0x80, 0x6f,0x85,0x62,0xb9,0x42,0x35);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("4474c80d-d16f-40ae-9580-6f8562b94235")
                IDataPackagePropertySetView4 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ContentSourceUserActivityJson(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4, 0x4474c80d, 0xd16f, 0x40ae, 0x95,0x80, 0x6f,0x85,0x62,0xb9,0x42,0x35)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4 *This,
        TrustLevel *trustLevel);

    /*** IDataPackagePropertySetView4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ContentSourceUserActivityJson)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4 *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataPackagePropertySetView4 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_get_ContentSourceUserActivityJson(This,value) (This)->lpVtbl->get_ContentSourceUserActivityJson(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataPackagePropertySetView4 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_get_ContentSourceUserActivityJson(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4* This,HSTRING *value) {
    return This->lpVtbl->get_ContentSourceUserActivityJson(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataPackagePropertySetView4 IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4
#define IDataPackagePropertySetView4Vtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4Vtbl
#define IDataPackagePropertySetView4 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4
#define IDataPackagePropertySetView4_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_QueryInterface
#define IDataPackagePropertySetView4_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_AddRef
#define IDataPackagePropertySetView4_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_Release
#define IDataPackagePropertySetView4_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_GetIids
#define IDataPackagePropertySetView4_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_GetRuntimeClassName
#define IDataPackagePropertySetView4_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_GetTrustLevel
#define IDataPackagePropertySetView4_get_ContentSourceUserActivityJson __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_get_ContentSourceUserActivityJson
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView4_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000 */

/*****************************************************************************
 * IDataPackagePropertySetView5 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5, 0x6f0a9445, 0x3760, 0x50bb, 0x85,0x23, 0xc4,0x20,0x2d,0xed,0x7d,0x78);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("6f0a9445-3760-50bb-8523-c4202ded7d78")
                IDataPackagePropertySetView5 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_IsFromRoamingClipboard(
                        boolean *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5, 0x6f0a9445, 0x3760, 0x50bb, 0x85,0x23, 0xc4,0x20,0x2d,0xed,0x7d,0x78)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5 *This,
        TrustLevel *trustLevel);

    /*** IDataPackagePropertySetView5 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_IsFromRoamingClipboard)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5 *This,
        boolean *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataPackagePropertySetView5 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_get_IsFromRoamingClipboard(This,value) (This)->lpVtbl->get_IsFromRoamingClipboard(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataPackagePropertySetView5 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_get_IsFromRoamingClipboard(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5* This,boolean *value) {
    return This->lpVtbl->get_IsFromRoamingClipboard(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataPackagePropertySetView5 IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5
#define IDataPackagePropertySetView5Vtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5Vtbl
#define IDataPackagePropertySetView5 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5
#define IDataPackagePropertySetView5_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_QueryInterface
#define IDataPackagePropertySetView5_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_AddRef
#define IDataPackagePropertySetView5_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_Release
#define IDataPackagePropertySetView5_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_GetIids
#define IDataPackagePropertySetView5_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_GetRuntimeClassName
#define IDataPackagePropertySetView5_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_GetTrustLevel
#define IDataPackagePropertySetView5_get_IsFromRoamingClipboard __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_get_IsFromRoamingClipboard
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView5_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */

/*****************************************************************************
 * IDataPackageView interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView, 0x7b840471, 0x5900, 0x4d85, 0xa9,0x0b, 0x10,0xcb,0x85,0xfe,0x35,0x52);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("7b840471-5900-4d85-a90b-10cb85fe3552")
                IDataPackageView : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Properties(
                        ABI::Windows::ApplicationModel::DataTransfer::IDataPackagePropertySetView **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_RequestedOperation(
                        ABI::Windows::ApplicationModel::DataTransfer::DataPackageOperation *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE ReportOperationCompleted(
                        ABI::Windows::ApplicationModel::DataTransfer::DataPackageOperation value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_AvailableFormats(
                        ABI::Windows::Foundation::Collections::IVectorView<HSTRING > **format_ids) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Contains(
                        HSTRING format_id,
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetDataAsync(
                        HSTRING format_id,
                        ABI::Windows::Foundation::IAsyncOperation<IInspectable* > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetTextAsync(
                        ABI::Windows::Foundation::IAsyncOperation<HSTRING > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetCustomTextAsync(
                        HSTRING format_id,
                        ABI::Windows::Foundation::IAsyncOperation<HSTRING > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetUriAsync(
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Uri* > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetHtmlFormatAsync(
                        ABI::Windows::Foundation::IAsyncOperation<HSTRING > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetResourceMapAsync(
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Storage::Streams::RandomAccessStreamReference* >* > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetRtfAsync(
                        ABI::Windows::Foundation::IAsyncOperation<HSTRING > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetBitmapAsync(
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::Streams::RandomAccessStreamReference* > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetStorageItemsAsync(
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Storage::IStorageItem* >* > **operation) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView, 0x7b840471, 0x5900, 0x4d85, 0xa9,0x0b, 0x10,0xcb,0x85,0xfe,0x35,0x52)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageViewVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView *This,
        TrustLevel *trustLevel);

    /*** IDataPackageView methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Properties)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView **value);

    HRESULT (STDMETHODCALLTYPE *get_RequestedOperation)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageOperation *value);

    HRESULT (STDMETHODCALLTYPE *ReportOperationCompleted)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageOperation value);

    HRESULT (STDMETHODCALLTYPE *get_AvailableFormats)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView *This,
        __FIVectorView_1_HSTRING **format_ids);

    HRESULT (STDMETHODCALLTYPE *Contains)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView *This,
        HSTRING format_id,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetDataAsync)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView *This,
        HSTRING format_id,
        __FIAsyncOperation_1_IInspectable **operation);

    HRESULT (STDMETHODCALLTYPE *GetTextAsync)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView *This,
        __FIAsyncOperation_1_HSTRING **operation);

    HRESULT (STDMETHODCALLTYPE *GetCustomTextAsync)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView *This,
        HSTRING format_id,
        __FIAsyncOperation_1_HSTRING **operation);

    HRESULT (STDMETHODCALLTYPE *GetUriAsync)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView *This,
        __FIAsyncOperation_1_Windows__CFoundation__CUri **operation);

    HRESULT (STDMETHODCALLTYPE *GetHtmlFormatAsync)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView *This,
        __FIAsyncOperation_1_HSTRING **operation);

    HRESULT (STDMETHODCALLTYPE *GetResourceMapAsync)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView *This,
        __FIAsyncOperation_1___FIMapView_2_HSTRING_Windows__CStorage__CStreams__CRandomAccessStreamReference **operation);

    HRESULT (STDMETHODCALLTYPE *GetRtfAsync)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView *This,
        __FIAsyncOperation_1_HSTRING **operation);

    HRESULT (STDMETHODCALLTYPE *GetBitmapAsync)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView *This,
        __FIAsyncOperation_1_Windows__CStorage__CStreams__CRandomAccessStreamReference **operation);

    HRESULT (STDMETHODCALLTYPE *GetStorageItemsAsync)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView *This,
        __FIAsyncOperation_1___FIVectorView_1_Windows__CStorage__CIStorageItem **operation);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageViewVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageViewVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataPackageView methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_get_Properties(This,value) (This)->lpVtbl->get_Properties(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_get_RequestedOperation(This,value) (This)->lpVtbl->get_RequestedOperation(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_ReportOperationCompleted(This,value) (This)->lpVtbl->ReportOperationCompleted(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_get_AvailableFormats(This,format_ids) (This)->lpVtbl->get_AvailableFormats(This,format_ids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_Contains(This,format_id,value) (This)->lpVtbl->Contains(This,format_id,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetDataAsync(This,format_id,operation) (This)->lpVtbl->GetDataAsync(This,format_id,operation)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetTextAsync(This,operation) (This)->lpVtbl->GetTextAsync(This,operation)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetCustomTextAsync(This,format_id,operation) (This)->lpVtbl->GetCustomTextAsync(This,format_id,operation)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetUriAsync(This,operation) (This)->lpVtbl->GetUriAsync(This,operation)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetHtmlFormatAsync(This,operation) (This)->lpVtbl->GetHtmlFormatAsync(This,operation)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetResourceMapAsync(This,operation) (This)->lpVtbl->GetResourceMapAsync(This,operation)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetRtfAsync(This,operation) (This)->lpVtbl->GetRtfAsync(This,operation)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetBitmapAsync(This,operation) (This)->lpVtbl->GetBitmapAsync(This,operation)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetStorageItemsAsync(This,operation) (This)->lpVtbl->GetStorageItemsAsync(This,operation)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataPackageView methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_get_Properties(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackagePropertySetView **value) {
    return This->lpVtbl->get_Properties(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_get_RequestedOperation(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageOperation *value) {
    return This->lpVtbl->get_RequestedOperation(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_ReportOperationCompleted(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageOperation value) {
    return This->lpVtbl->ReportOperationCompleted(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_get_AvailableFormats(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView* This,__FIVectorView_1_HSTRING **format_ids) {
    return This->lpVtbl->get_AvailableFormats(This,format_ids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_Contains(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView* This,HSTRING format_id,boolean *value) {
    return This->lpVtbl->Contains(This,format_id,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetDataAsync(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView* This,HSTRING format_id,__FIAsyncOperation_1_IInspectable **operation) {
    return This->lpVtbl->GetDataAsync(This,format_id,operation);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetTextAsync(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView* This,__FIAsyncOperation_1_HSTRING **operation) {
    return This->lpVtbl->GetTextAsync(This,operation);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetCustomTextAsync(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView* This,HSTRING format_id,__FIAsyncOperation_1_HSTRING **operation) {
    return This->lpVtbl->GetCustomTextAsync(This,format_id,operation);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetUriAsync(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView* This,__FIAsyncOperation_1_Windows__CFoundation__CUri **operation) {
    return This->lpVtbl->GetUriAsync(This,operation);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetHtmlFormatAsync(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView* This,__FIAsyncOperation_1_HSTRING **operation) {
    return This->lpVtbl->GetHtmlFormatAsync(This,operation);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetResourceMapAsync(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView* This,__FIAsyncOperation_1___FIMapView_2_HSTRING_Windows__CStorage__CStreams__CRandomAccessStreamReference **operation) {
    return This->lpVtbl->GetResourceMapAsync(This,operation);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetRtfAsync(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView* This,__FIAsyncOperation_1_HSTRING **operation) {
    return This->lpVtbl->GetRtfAsync(This,operation);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetBitmapAsync(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView* This,__FIAsyncOperation_1_Windows__CStorage__CStreams__CRandomAccessStreamReference **operation) {
    return This->lpVtbl->GetBitmapAsync(This,operation);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetStorageItemsAsync(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView* This,__FIAsyncOperation_1___FIVectorView_1_Windows__CStorage__CIStorageItem **operation) {
    return This->lpVtbl->GetStorageItemsAsync(This,operation);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataPackageView IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView
#define IDataPackageViewVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageViewVtbl
#define IDataPackageView __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView
#define IDataPackageView_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_QueryInterface
#define IDataPackageView_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_AddRef
#define IDataPackageView_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_Release
#define IDataPackageView_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetIids
#define IDataPackageView_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetRuntimeClassName
#define IDataPackageView_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetTrustLevel
#define IDataPackageView_get_Properties __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_get_Properties
#define IDataPackageView_get_RequestedOperation __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_get_RequestedOperation
#define IDataPackageView_ReportOperationCompleted __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_ReportOperationCompleted
#define IDataPackageView_get_AvailableFormats __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_get_AvailableFormats
#define IDataPackageView_Contains __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_Contains
#define IDataPackageView_GetDataAsync __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetDataAsync
#define IDataPackageView_GetTextAsync __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetTextAsync
#define IDataPackageView_GetCustomTextAsync __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetCustomTextAsync
#define IDataPackageView_GetUriAsync __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetUriAsync
#define IDataPackageView_GetHtmlFormatAsync __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetHtmlFormatAsync
#define IDataPackageView_GetResourceMapAsync __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetResourceMapAsync
#define IDataPackageView_GetRtfAsync __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetRtfAsync
#define IDataPackageView_GetBitmapAsync __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetBitmapAsync
#define IDataPackageView_GetStorageItemsAsync __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_GetStorageItemsAsync
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDataPackageView2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2, 0x40ecba95, 0x2450, 0x4c1d, 0xb6,0xb4, 0xed,0x45,0x46,0x3d,0xee,0x9c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("40ecba95-2450-4c1d-b6b4-ed45463dee9c")
                IDataPackageView2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetApplicationLinkAsync(
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Uri* > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetWebLinkAsync(
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Uri* > **operation) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2, 0x40ecba95, 0x2450, 0x4c1d, 0xb6,0xb4, 0xed,0x45,0x46,0x3d,0xee,0x9c)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2 *This,
        TrustLevel *trustLevel);

    /*** IDataPackageView2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetApplicationLinkAsync)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2 *This,
        __FIAsyncOperation_1_Windows__CFoundation__CUri **operation);

    HRESULT (STDMETHODCALLTYPE *GetWebLinkAsync)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2 *This,
        __FIAsyncOperation_1_Windows__CFoundation__CUri **operation);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataPackageView2 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_GetApplicationLinkAsync(This,operation) (This)->lpVtbl->GetApplicationLinkAsync(This,operation)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_GetWebLinkAsync(This,operation) (This)->lpVtbl->GetWebLinkAsync(This,operation)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataPackageView2 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_GetApplicationLinkAsync(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2* This,__FIAsyncOperation_1_Windows__CFoundation__CUri **operation) {
    return This->lpVtbl->GetApplicationLinkAsync(This,operation);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_GetWebLinkAsync(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2* This,__FIAsyncOperation_1_Windows__CFoundation__CUri **operation) {
    return This->lpVtbl->GetWebLinkAsync(This,operation);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataPackageView2 IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2
#define IDataPackageView2Vtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2Vtbl
#define IDataPackageView2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2
#define IDataPackageView2_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_QueryInterface
#define IDataPackageView2_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_AddRef
#define IDataPackageView2_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_Release
#define IDataPackageView2_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_GetIids
#define IDataPackageView2_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_GetRuntimeClassName
#define IDataPackageView2_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_GetTrustLevel
#define IDataPackageView2_GetApplicationLinkAsync __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_GetApplicationLinkAsync
#define IDataPackageView2_GetWebLinkAsync __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_GetWebLinkAsync
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDataPackageView3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3, 0xd37771a8, 0xddad, 0x4288, 0x84,0x28, 0xd1,0xca,0xe3,0x94,0x12,0x8b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("d37771a8-ddad-4288-8428-d1cae394128b")
                IDataPackageView3 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE RequestAccessAsync(
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::EnterpriseData::ProtectionPolicyEvaluationResult > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RequestAccessWithEnterpriseIdAsync(
                        HSTRING enterprise_id,
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::EnterpriseData::ProtectionPolicyEvaluationResult > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE UnlockAndAssumeEnterpriseIdentity(
                        ABI::Windows::Security::EnterpriseData::ProtectionPolicyEvaluationResult *result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3, 0xd37771a8, 0xddad, 0x4288, 0x84,0x28, 0xd1,0xca,0xe3,0x94,0x12,0x8b)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3 *This,
        TrustLevel *trustLevel);

    /*** IDataPackageView3 methods ***/
    HRESULT (STDMETHODCALLTYPE *RequestAccessAsync)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3 *This,
        __FIAsyncOperation_1_ProtectionPolicyEvaluationResult **operation);

    HRESULT (STDMETHODCALLTYPE *RequestAccessWithEnterpriseIdAsync)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3 *This,
        HSTRING enterprise_id,
        __FIAsyncOperation_1_ProtectionPolicyEvaluationResult **operation);

    HRESULT (STDMETHODCALLTYPE *UnlockAndAssumeEnterpriseIdentity)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3 *This,
        __x_ABI_CWindows_CSecurity_CEnterpriseData_CProtectionPolicyEvaluationResult *result);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataPackageView3 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_RequestAccessAsync(This,operation) (This)->lpVtbl->RequestAccessAsync(This,operation)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_RequestAccessWithEnterpriseIdAsync(This,enterprise_id,operation) (This)->lpVtbl->RequestAccessWithEnterpriseIdAsync(This,enterprise_id,operation)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_UnlockAndAssumeEnterpriseIdentity(This,result) (This)->lpVtbl->UnlockAndAssumeEnterpriseIdentity(This,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataPackageView3 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_RequestAccessAsync(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3* This,__FIAsyncOperation_1_ProtectionPolicyEvaluationResult **operation) {
    return This->lpVtbl->RequestAccessAsync(This,operation);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_RequestAccessWithEnterpriseIdAsync(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3* This,HSTRING enterprise_id,__FIAsyncOperation_1_ProtectionPolicyEvaluationResult **operation) {
    return This->lpVtbl->RequestAccessWithEnterpriseIdAsync(This,enterprise_id,operation);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_UnlockAndAssumeEnterpriseIdentity(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3* This,__x_ABI_CWindows_CSecurity_CEnterpriseData_CProtectionPolicyEvaluationResult *result) {
    return This->lpVtbl->UnlockAndAssumeEnterpriseIdentity(This,result);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataPackageView3 IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3
#define IDataPackageView3Vtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3Vtbl
#define IDataPackageView3 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3
#define IDataPackageView3_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_QueryInterface
#define IDataPackageView3_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_AddRef
#define IDataPackageView3_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_Release
#define IDataPackageView3_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_GetIids
#define IDataPackageView3_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_GetRuntimeClassName
#define IDataPackageView3_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_GetTrustLevel
#define IDataPackageView3_RequestAccessAsync __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_RequestAccessAsync
#define IDataPackageView3_RequestAccessWithEnterpriseIdAsync __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_RequestAccessWithEnterpriseIdAsync
#define IDataPackageView3_UnlockAndAssumeEnterpriseIdentity __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_UnlockAndAssumeEnterpriseIdentity
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView3_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDataPackageView4 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4, 0xdfe96f1f, 0xe042, 0x4433, 0xa0,0x9f, 0x26,0xd6,0xff,0xda,0x8b,0x85);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("dfe96f1f-e042-4433-a09f-26d6ffda8b85")
                IDataPackageView4 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE SetAcceptedFormatId(
                        HSTRING format_id) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4, 0xdfe96f1f, 0xe042, 0x4433, 0xa0,0x9f, 0x26,0xd6,0xff,0xda,0x8b,0x85)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4 *This,
        TrustLevel *trustLevel);

    /*** IDataPackageView4 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetAcceptedFormatId)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4 *This,
        HSTRING format_id);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataPackageView4 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_SetAcceptedFormatId(This,format_id) (This)->lpVtbl->SetAcceptedFormatId(This,format_id)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataPackageView4 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_SetAcceptedFormatId(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4* This,HSTRING format_id) {
    return This->lpVtbl->SetAcceptedFormatId(This,format_id);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataPackageView4 IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4
#define IDataPackageView4Vtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4Vtbl
#define IDataPackageView4 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4
#define IDataPackageView4_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_QueryInterface
#define IDataPackageView4_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_AddRef
#define IDataPackageView4_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_Release
#define IDataPackageView4_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_GetIids
#define IDataPackageView4_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_GetRuntimeClassName
#define IDataPackageView4_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_GetTrustLevel
#define IDataPackageView4_SetAcceptedFormatId __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_SetAcceptedFormatId
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView4_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * IDataProviderDeferral interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral, 0xc2cf2373, 0x2d26, 0x43d9, 0xb6,0x9d, 0xdc,0xb8,0x6d,0x03,0xf6,0xda);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("c2cf2373-2d26-43d9-b69d-dcb86d03f6da")
                IDataProviderDeferral : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE Complete(
                        ) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral, 0xc2cf2373, 0x2d26, 0x43d9, 0xb6,0x9d, 0xdc,0xb8,0x6d,0x03,0xf6,0xda)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferralVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral *This,
        TrustLevel *trustLevel);

    /*** IDataProviderDeferral methods ***/
    HRESULT (STDMETHODCALLTYPE *Complete)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral *This);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferralVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferralVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataProviderDeferral methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_Complete(This) (This)->lpVtbl->Complete(This)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataProviderDeferral methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_Complete(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral* This) {
    return This->lpVtbl->Complete(This);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataProviderDeferral IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral
#define IDataProviderDeferralVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferralVtbl
#define IDataProviderDeferral __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral
#define IDataProviderDeferral_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_QueryInterface
#define IDataProviderDeferral_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_AddRef
#define IDataProviderDeferral_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_Release
#define IDataProviderDeferral_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_GetIids
#define IDataProviderDeferral_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_GetRuntimeClassName
#define IDataProviderDeferral_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_GetTrustLevel
#define IDataProviderDeferral_Complete __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_Complete
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDataProviderRequest interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest, 0xebbc7157, 0xd3c8, 0x47da, 0xac,0xde, 0xf8,0x23,0x88,0xd5,0xf7,0x16);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("ebbc7157-d3c8-47da-acde-f82388d5f716")
                IDataProviderRequest : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_FormatId(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Deadline(
                        ABI::Windows::Foundation::DateTime *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetDeferral(
                        ABI::Windows::ApplicationModel::DataTransfer::IDataProviderDeferral **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetData(
                        IInspectable *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest, 0xebbc7157, 0xd3c8, 0x47da, 0xac,0xde, 0xf8,0x23,0x88,0xd5,0xf7,0x16)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequestVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest *This,
        TrustLevel *trustLevel);

    /*** IDataProviderRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_FormatId)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Deadline)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest *This,
        __x_ABI_CWindows_CFoundation_CDateTime *value);

    HRESULT (STDMETHODCALLTYPE *GetDeferral)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral **value);

    HRESULT (STDMETHODCALLTYPE *SetData)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest *This,
        IInspectable *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequestVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataProviderRequest methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_get_FormatId(This,value) (This)->lpVtbl->get_FormatId(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_get_Deadline(This,value) (This)->lpVtbl->get_Deadline(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_GetDeferral(This,value) (This)->lpVtbl->GetDeferral(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_SetData(This,value) (This)->lpVtbl->SetData(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataProviderRequest methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_get_FormatId(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest* This,HSTRING *value) {
    return This->lpVtbl->get_FormatId(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_get_Deadline(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest* This,__x_ABI_CWindows_CFoundation_CDateTime *value) {
    return This->lpVtbl->get_Deadline(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_GetDeferral(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderDeferral **value) {
    return This->lpVtbl->GetDeferral(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_SetData(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest* This,IInspectable *value) {
    return This->lpVtbl->SetData(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataProviderRequest IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest
#define IDataProviderRequestVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequestVtbl
#define IDataProviderRequest __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest
#define IDataProviderRequest_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_QueryInterface
#define IDataProviderRequest_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_AddRef
#define IDataProviderRequest_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_Release
#define IDataProviderRequest_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_GetIids
#define IDataProviderRequest_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_GetRuntimeClassName
#define IDataProviderRequest_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_GetTrustLevel
#define IDataProviderRequest_get_FormatId __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_get_FormatId
#define IDataProviderRequest_get_Deadline __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_get_Deadline
#define IDataProviderRequest_GetDeferral __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_GetDeferral
#define IDataProviderRequest_SetData __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_SetData
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataProviderRequest_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDataRequest interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest, 0x4341ae3b, 0xfc12, 0x4e53, 0x8c,0x02, 0xac,0x71,0x4c,0x41,0x5a,0x27);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("4341ae3b-fc12-4e53-8c02-ac714c415a27")
                IDataRequest : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Data(
                        ABI::Windows::ApplicationModel::DataTransfer::IDataPackage **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Data(
                        ABI::Windows::ApplicationModel::DataTransfer::IDataPackage *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Deadline(
                        ABI::Windows::Foundation::DateTime *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FailWithDisplayText(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetDeferral(
                        ABI::Windows::ApplicationModel::DataTransfer::IDataRequestDeferral **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest, 0x4341ae3b, 0xfc12, 0x4e53, 0x8c,0x02, 0xac,0x71,0x4c,0x41,0x5a,0x27)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest *This,
        TrustLevel *trustLevel);

    /*** IDataRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Data)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage **value);

    HRESULT (STDMETHODCALLTYPE *put_Data)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *value);

    HRESULT (STDMETHODCALLTYPE *get_Deadline)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest *This,
        __x_ABI_CWindows_CFoundation_CDateTime *value);

    HRESULT (STDMETHODCALLTYPE *FailWithDisplayText)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *GetDeferral)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral **result);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataRequest methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_get_Data(This,value) (This)->lpVtbl->get_Data(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_put_Data(This,value) (This)->lpVtbl->put_Data(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_get_Deadline(This,value) (This)->lpVtbl->get_Deadline(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_FailWithDisplayText(This,value) (This)->lpVtbl->FailWithDisplayText(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_GetDeferral(This,result) (This)->lpVtbl->GetDeferral(This,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataRequest methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_get_Data(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage **value) {
    return This->lpVtbl->get_Data(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_put_Data(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *value) {
    return This->lpVtbl->put_Data(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_get_Deadline(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest* This,__x_ABI_CWindows_CFoundation_CDateTime *value) {
    return This->lpVtbl->get_Deadline(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_FailWithDisplayText(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest* This,HSTRING value) {
    return This->lpVtbl->FailWithDisplayText(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_GetDeferral(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral **result) {
    return This->lpVtbl->GetDeferral(This,result);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataRequest IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest
#define IDataRequestVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestVtbl
#define IDataRequest __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest
#define IDataRequest_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_QueryInterface
#define IDataRequest_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_AddRef
#define IDataRequest_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_Release
#define IDataRequest_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_GetIids
#define IDataRequest_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_GetRuntimeClassName
#define IDataRequest_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_GetTrustLevel
#define IDataRequest_get_Data __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_get_Data
#define IDataRequest_put_Data __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_put_Data
#define IDataRequest_get_Deadline __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_get_Deadline
#define IDataRequest_FailWithDisplayText __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_FailWithDisplayText
#define IDataRequest_GetDeferral __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_GetDeferral
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDataRequestDeferral interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral, 0x6dc4b89f, 0x0386, 0x4263, 0x87,0xc1, 0xed,0x7d,0xce,0x30,0x89,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("6dc4b89f-0386-4263-87c1-ed7dce30890e")
                IDataRequestDeferral : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE Complete(
                        ) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral, 0x6dc4b89f, 0x0386, 0x4263, 0x87,0xc1, 0xed,0x7d,0xce,0x30,0x89,0x0e)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferralVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral *This,
        TrustLevel *trustLevel);

    /*** IDataRequestDeferral methods ***/
    HRESULT (STDMETHODCALLTYPE *Complete)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral *This);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferralVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferralVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataRequestDeferral methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_Complete(This) (This)->lpVtbl->Complete(This)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataRequestDeferral methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_Complete(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral* This) {
    return This->lpVtbl->Complete(This);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataRequestDeferral IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral
#define IDataRequestDeferralVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferralVtbl
#define IDataRequestDeferral __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral
#define IDataRequestDeferral_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_QueryInterface
#define IDataRequestDeferral_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_AddRef
#define IDataRequestDeferral_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_Release
#define IDataRequestDeferral_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_GetIids
#define IDataRequestDeferral_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_GetRuntimeClassName
#define IDataRequestDeferral_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_GetTrustLevel
#define IDataRequestDeferral_Complete __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_Complete
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestDeferral_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDataRequestedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs, 0xcb8ba807, 0x6ac5, 0x43c9, 0x8a,0xc5, 0x9b,0xa2,0x32,0x16,0x31,0x82);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("cb8ba807-6ac5-43c9-8ac5-9ba232163182")
                IDataRequestedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Request(
                        ABI::Windows::ApplicationModel::DataTransfer::IDataRequest **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs, 0xcb8ba807, 0x6ac5, 0x43c9, 0x8a,0xc5, 0x9b,0xa2,0x32,0x16,0x31,0x82)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs *This,
        TrustLevel *trustLevel);

    /*** IDataRequestedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Request)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest **value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgsVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataRequestedEventArgs methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_get_Request(This,value) (This)->lpVtbl->get_Request(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataRequestedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_get_Request(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequest **value) {
    return This->lpVtbl->get_Request(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataRequestedEventArgs IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs
#define IDataRequestedEventArgsVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgsVtbl
#define IDataRequestedEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs
#define IDataRequestedEventArgs_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_QueryInterface
#define IDataRequestedEventArgs_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_AddRef
#define IDataRequestedEventArgs_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_Release
#define IDataRequestedEventArgs_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_GetIids
#define IDataRequestedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_GetRuntimeClassName
#define IDataRequestedEventArgs_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_GetTrustLevel
#define IDataRequestedEventArgs_get_Request __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_get_Request
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDataTransferManager interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager, 0xa5caee9b, 0x8708, 0x49d1, 0x8d,0x36, 0x67,0xd2,0x5a,0x8d,0xa0,0x0c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("a5caee9b-8708-49d1-8d36-67d25a8da00c")
                IDataTransferManager : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE add_DataRequested(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*,ABI::Windows::ApplicationModel::DataTransfer::DataRequestedEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_DataRequested(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_TargetApplicationChosen(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*,ABI::Windows::ApplicationModel::DataTransfer::TargetApplicationChosenEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_TargetApplicationChosen(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager, 0xa5caee9b, 0x8708, 0x49d1, 0x8d,0x36, 0x67,0xd2,0x5a,0x8d,0xa0,0x0c)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager *This,
        TrustLevel *trustLevel);

    /*** IDataTransferManager methods ***/
    HRESULT (STDMETHODCALLTYPE *add_DataRequested)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager *This,
        __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_DataRequested)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_TargetApplicationChosen)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager *This,
        __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_TargetApplicationChosen)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataTransferManager methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_add_DataRequested(This,handler,token) (This)->lpVtbl->add_DataRequested(This,handler,token)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_remove_DataRequested(This,token) (This)->lpVtbl->remove_DataRequested(This,token)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_add_TargetApplicationChosen(This,handler,token) (This)->lpVtbl->add_TargetApplicationChosen(This,handler,token)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_remove_TargetApplicationChosen(This,token) (This)->lpVtbl->remove_TargetApplicationChosen(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataTransferManager methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_add_DataRequested(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager* This,__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_DataRequested(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_remove_DataRequested(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_DataRequested(This,token);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_add_TargetApplicationChosen(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager* This,__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_TargetApplicationChosen(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_remove_TargetApplicationChosen(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_TargetApplicationChosen(This,token);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataTransferManager IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager
#define IDataTransferManagerVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerVtbl
#define IDataTransferManager __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager
#define IDataTransferManager_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_QueryInterface
#define IDataTransferManager_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_AddRef
#define IDataTransferManager_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_Release
#define IDataTransferManager_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_GetIids
#define IDataTransferManager_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_GetRuntimeClassName
#define IDataTransferManager_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_GetTrustLevel
#define IDataTransferManager_add_DataRequested __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_add_DataRequested
#define IDataTransferManager_remove_DataRequested __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_remove_DataRequested
#define IDataTransferManager_add_TargetApplicationChosen __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_add_TargetApplicationChosen
#define IDataTransferManager_remove_TargetApplicationChosen __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_remove_TargetApplicationChosen
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDataTransferManager2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2, 0x30ae7d71, 0x8ba8, 0x4c02, 0x8e,0x3f, 0xdd,0xb2,0x3b,0x38,0x87,0x15);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("30ae7d71-8ba8-4c02-8e3f-ddb23b388715")
                IDataTransferManager2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE add_ShareProvidersRequested(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*,ABI::Windows::ApplicationModel::DataTransfer::ShareProvidersRequestedEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_ShareProvidersRequested(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2, 0x30ae7d71, 0x8ba8, 0x4c02, 0x8e,0x3f, 0xdd,0xb2,0x3b,0x38,0x87,0x15)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2 *This,
        TrustLevel *trustLevel);

    /*** IDataTransferManager2 methods ***/
    HRESULT (STDMETHODCALLTYPE *add_ShareProvidersRequested)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2 *This,
        __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_ShareProvidersRequested)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2 *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataTransferManager2 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_add_ShareProvidersRequested(This,handler,token) (This)->lpVtbl->add_ShareProvidersRequested(This,handler,token)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_remove_ShareProvidersRequested(This,token) (This)->lpVtbl->remove_ShareProvidersRequested(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataTransferManager2 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_add_ShareProvidersRequested(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2* This,__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_ShareProvidersRequested(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_remove_ShareProvidersRequested(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_ShareProvidersRequested(This,token);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataTransferManager2 IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2
#define IDataTransferManager2Vtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2Vtbl
#define IDataTransferManager2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2
#define IDataTransferManager2_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_QueryInterface
#define IDataTransferManager2_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_AddRef
#define IDataTransferManager2_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_Release
#define IDataTransferManager2_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_GetIids
#define IDataTransferManager2_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_GetRuntimeClassName
#define IDataTransferManager2_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_GetTrustLevel
#define IDataTransferManager2_add_ShareProvidersRequested __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_add_ShareProvidersRequested
#define IDataTransferManager2_remove_ShareProvidersRequested __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_remove_ShareProvidersRequested
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IDataTransferManagerStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics, 0xa9da01aa, 0xe00e, 0x4cfe, 0xaa,0x44, 0x2d,0xd9,0x32,0xdc,0xa3,0xd8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("a9da01aa-e00e-4cfe-aa44-2dd932dca3d8")
                IDataTransferManagerStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE ShowShareUI(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetForCurrentView(
                        ABI::Windows::ApplicationModel::DataTransfer::IDataTransferManager **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics, 0xa9da01aa, 0xe00e, 0x4cfe, 0xaa,0x44, 0x2d,0xd9,0x32,0xdc,0xa3,0xd8)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics *This,
        TrustLevel *trustLevel);

    /*** IDataTransferManagerStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *ShowShareUI)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics *This);

    HRESULT (STDMETHODCALLTYPE *GetForCurrentView)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager **result);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStaticsVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataTransferManagerStatics methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_ShowShareUI(This) (This)->lpVtbl->ShowShareUI(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_GetForCurrentView(This,result) (This)->lpVtbl->GetForCurrentView(This,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataTransferManagerStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_ShowShareUI(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics* This) {
    return This->lpVtbl->ShowShareUI(This);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_GetForCurrentView(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager **result) {
    return This->lpVtbl->GetForCurrentView(This,result);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataTransferManagerStatics IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics
#define IDataTransferManagerStaticsVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStaticsVtbl
#define IDataTransferManagerStatics __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics
#define IDataTransferManagerStatics_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_QueryInterface
#define IDataTransferManagerStatics_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_AddRef
#define IDataTransferManagerStatics_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_Release
#define IDataTransferManagerStatics_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_GetIids
#define IDataTransferManagerStatics_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_GetRuntimeClassName
#define IDataTransferManagerStatics_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_GetTrustLevel
#define IDataTransferManagerStatics_ShowShareUI __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_ShowShareUI
#define IDataTransferManagerStatics_GetForCurrentView __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_GetForCurrentView
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDataTransferManagerStatics2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2, 0xc54ec2ec, 0x9f97, 0x4d63, 0x98,0x68, 0x39,0x5e,0x27,0x1a,0xd8,0xf5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("c54ec2ec-9f97-4d63-9868-395e271ad8f5")
                IDataTransferManagerStatics2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE IsSupported(
                        boolean *result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2, 0xc54ec2ec, 0x9f97, 0x4d63, 0x98,0x68, 0x39,0x5e,0x27,0x1a,0xd8,0xf5)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2 *This,
        TrustLevel *trustLevel);

    /*** IDataTransferManagerStatics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *IsSupported)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2 *This,
        boolean *result);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataTransferManagerStatics2 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_IsSupported(This,result) (This)->lpVtbl->IsSupported(This,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataTransferManagerStatics2 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_IsSupported(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2* This,boolean *result) {
    return This->lpVtbl->IsSupported(This,result);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataTransferManagerStatics2 IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2
#define IDataTransferManagerStatics2Vtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2Vtbl
#define IDataTransferManagerStatics2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2
#define IDataTransferManagerStatics2_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_QueryInterface
#define IDataTransferManagerStatics2_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_AddRef
#define IDataTransferManagerStatics2_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_Release
#define IDataTransferManagerStatics2_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_GetIids
#define IDataTransferManagerStatics2_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_GetRuntimeClassName
#define IDataTransferManagerStatics2_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_GetTrustLevel
#define IDataTransferManagerStatics2_IsSupported __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_IsSupported
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IDataTransferManagerStatics3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3, 0x05845473, 0x6c82, 0x4f5c, 0xac,0x23, 0x62,0xe4,0x58,0x36,0x1f,0xac);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("05845473-6c82-4f5c-ac23-62e458361fac")
                IDataTransferManagerStatics3 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE ShowShareUIWithOptions(
                        ABI::Windows::ApplicationModel::DataTransfer::IShareUIOptions *options) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3, 0x05845473, 0x6c82, 0x4f5c, 0xac,0x23, 0x62,0xe4,0x58,0x36,0x1f,0xac)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3 *This,
        TrustLevel *trustLevel);

    /*** IDataTransferManagerStatics3 methods ***/
    HRESULT (STDMETHODCALLTYPE *ShowShareUIWithOptions)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3 *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions *options);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataTransferManagerStatics3 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_ShowShareUIWithOptions(This,options) (This)->lpVtbl->ShowShareUIWithOptions(This,options)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataTransferManagerStatics3 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_ShowShareUIWithOptions(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions *options) {
    return This->lpVtbl->ShowShareUIWithOptions(This,options);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IDataTransferManagerStatics3 IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3
#define IDataTransferManagerStatics3Vtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3Vtbl
#define IDataTransferManagerStatics3 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3
#define IDataTransferManagerStatics3_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_QueryInterface
#define IDataTransferManagerStatics3_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_AddRef
#define IDataTransferManagerStatics3_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_Release
#define IDataTransferManagerStatics3_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_GetIids
#define IDataTransferManagerStatics3_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_GetRuntimeClassName
#define IDataTransferManagerStatics3_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_GetTrustLevel
#define IDataTransferManagerStatics3_ShowShareUIWithOptions __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_ShowShareUIWithOptions
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManagerStatics3_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */

/*****************************************************************************
 * IHtmlFormatHelperStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics, 0xe22e7749, 0xdd70, 0x446f, 0xae,0xfc, 0x61,0xce,0xe5,0x9f,0x65,0x5e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("e22e7749-dd70-446f-aefc-61cee59f655e")
                IHtmlFormatHelperStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetStaticFragment(
                        HSTRING html_format,
                        HSTRING *html_fragment) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateHtmlFormat(
                        HSTRING html_fragment,
                        HSTRING *html_format) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics, 0xe22e7749, 0xdd70, 0x446f, 0xae,0xfc, 0x61,0xce,0xe5,0x9f,0x65,0x5e)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics *This,
        TrustLevel *trustLevel);

    /*** IHtmlFormatHelperStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStaticFragment)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics *This,
        HSTRING html_format,
        HSTRING *html_fragment);

    HRESULT (STDMETHODCALLTYPE *CreateHtmlFormat)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics *This,
        HSTRING html_fragment,
        HSTRING *html_format);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStaticsVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IHtmlFormatHelperStatics methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_GetStaticFragment(This,html_format,html_fragment) (This)->lpVtbl->GetStaticFragment(This,html_format,html_fragment)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_CreateHtmlFormat(This,html_fragment,html_format) (This)->lpVtbl->CreateHtmlFormat(This,html_fragment,html_format)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IHtmlFormatHelperStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_GetStaticFragment(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics* This,HSTRING html_format,HSTRING *html_fragment) {
    return This->lpVtbl->GetStaticFragment(This,html_format,html_fragment);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_CreateHtmlFormat(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics* This,HSTRING html_fragment,HSTRING *html_format) {
    return This->lpVtbl->CreateHtmlFormat(This,html_fragment,html_format);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IHtmlFormatHelperStatics IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics
#define IHtmlFormatHelperStaticsVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStaticsVtbl
#define IHtmlFormatHelperStatics __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics
#define IHtmlFormatHelperStatics_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_QueryInterface
#define IHtmlFormatHelperStatics_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_AddRef
#define IHtmlFormatHelperStatics_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_Release
#define IHtmlFormatHelperStatics_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_GetIids
#define IHtmlFormatHelperStatics_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_GetRuntimeClassName
#define IHtmlFormatHelperStatics_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_GetTrustLevel
#define IHtmlFormatHelperStatics_GetStaticFragment __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_GetStaticFragment
#define IHtmlFormatHelperStatics_CreateHtmlFormat __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_CreateHtmlFormat
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIHtmlFormatHelperStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IOperationCompletedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs, 0xe7af329d, 0x051d, 0x4fab, 0xb1,0xa9, 0x47,0xfd,0x77,0xf7,0x0a,0x41);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("e7af329d-051d-4fab-b1a9-47fd77f70a41")
                IOperationCompletedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Operation(
                        ABI::Windows::ApplicationModel::DataTransfer::DataPackageOperation *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs, 0xe7af329d, 0x051d, 0x4fab, 0xb1,0xa9, 0x47,0xfd,0x77,0xf7,0x0a,0x41)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs *This,
        TrustLevel *trustLevel);

    /*** IOperationCompletedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Operation)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageOperation *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgsVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IOperationCompletedEventArgs methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_get_Operation(This,value) (This)->lpVtbl->get_Operation(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IOperationCompletedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_get_Operation(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageOperation *value) {
    return This->lpVtbl->get_Operation(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IOperationCompletedEventArgs IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs
#define IOperationCompletedEventArgsVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgsVtbl
#define IOperationCompletedEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs
#define IOperationCompletedEventArgs_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_QueryInterface
#define IOperationCompletedEventArgs_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_AddRef
#define IOperationCompletedEventArgs_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_Release
#define IOperationCompletedEventArgs_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_GetIids
#define IOperationCompletedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_GetRuntimeClassName
#define IOperationCompletedEventArgs_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_GetTrustLevel
#define IOperationCompletedEventArgs_get_Operation __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_get_Operation
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IOperationCompletedEventArgs2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2, 0x858fa073, 0x1e19, 0x4105, 0xb2,0xf7, 0xc8,0x47,0x88,0x08,0xd5,0x62);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("858fa073-1e19-4105-b2f7-c8478808d562")
                IOperationCompletedEventArgs2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_AcceptedFormatId(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2, 0x858fa073, 0x1e19, 0x4105, 0xb2,0xf7, 0xc8,0x47,0x88,0x08,0xd5,0x62)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2 *This,
        TrustLevel *trustLevel);

    /*** IOperationCompletedEventArgs2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AcceptedFormatId)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2 *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IOperationCompletedEventArgs2 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_get_AcceptedFormatId(This,value) (This)->lpVtbl->get_AcceptedFormatId(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IOperationCompletedEventArgs2 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_get_AcceptedFormatId(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2* This,HSTRING *value) {
    return This->lpVtbl->get_AcceptedFormatId(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IOperationCompletedEventArgs2 IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2
#define IOperationCompletedEventArgs2Vtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2Vtbl
#define IOperationCompletedEventArgs2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2
#define IOperationCompletedEventArgs2_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_QueryInterface
#define IOperationCompletedEventArgs2_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_AddRef
#define IOperationCompletedEventArgs2_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_Release
#define IOperationCompletedEventArgs2_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_GetIids
#define IOperationCompletedEventArgs2_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_GetRuntimeClassName
#define IOperationCompletedEventArgs2_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_GetTrustLevel
#define IOperationCompletedEventArgs2_get_AcceptedFormatId __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_get_AcceptedFormatId
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * IShareCompletedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs, 0x4574c442, 0xf913, 0x4f60, 0x9d,0xf7, 0xcc,0x40,0x60,0xab,0x19,0x16);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("4574c442-f913-4f60-9df7-cc4060ab1916")
                IShareCompletedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ShareTarget(
                        ABI::Windows::ApplicationModel::DataTransfer::IShareTargetInfo **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs, 0x4574c442, 0xf913, 0x4f60, 0x9d,0xf7, 0xcc,0x40,0x60,0xab,0x19,0x16)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs *This,
        TrustLevel *trustLevel);

    /*** IShareCompletedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ShareTarget)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo **value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgsVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IShareCompletedEventArgs methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_get_ShareTarget(This,value) (This)->lpVtbl->get_ShareTarget(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IShareCompletedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_get_ShareTarget(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo **value) {
    return This->lpVtbl->get_ShareTarget(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IShareCompletedEventArgs IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs
#define IShareCompletedEventArgsVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgsVtbl
#define IShareCompletedEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs
#define IShareCompletedEventArgs_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_QueryInterface
#define IShareCompletedEventArgs_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_AddRef
#define IShareCompletedEventArgs_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_Release
#define IShareCompletedEventArgs_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_GetIids
#define IShareCompletedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_GetRuntimeClassName
#define IShareCompletedEventArgs_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_GetTrustLevel
#define IShareCompletedEventArgs_get_ShareTarget __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_get_ShareTarget
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IShareProvider interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider, 0x2fabe026, 0x443e, 0x4cda, 0xaf,0x25, 0x8d,0x81,0x07,0x0e,0xfd,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("2fabe026-443e-4cda-af25-8d81070efd80")
                IShareProvider : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Title(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_DisplayIcon(
                        ABI::Windows::Storage::Streams::IRandomAccessStreamReference **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_BackgroundColor(
                        ABI::Windows::UI::Color *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Tag(
                        IInspectable **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Tag(
                        IInspectable *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider, 0x2fabe026, 0x443e, 0x4cda, 0xaf,0x25, 0x8d,0x81,0x07,0x0e,0xfd,0x80)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider *This,
        TrustLevel *trustLevel);

    /*** IShareProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Title)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_DisplayIcon)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider *This,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **value);

    HRESULT (STDMETHODCALLTYPE *get_BackgroundColor)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider *This,
        __x_ABI_CWindows_CUI_CColor *value);

    HRESULT (STDMETHODCALLTYPE *get_Tag)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider *This,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *put_Tag)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider *This,
        IInspectable *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IShareProvider methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_get_Title(This,value) (This)->lpVtbl->get_Title(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_get_DisplayIcon(This,value) (This)->lpVtbl->get_DisplayIcon(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_get_BackgroundColor(This,value) (This)->lpVtbl->get_BackgroundColor(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_get_Tag(This,value) (This)->lpVtbl->get_Tag(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_put_Tag(This,value) (This)->lpVtbl->put_Tag(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IShareProvider methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_get_Title(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider* This,HSTRING *value) {
    return This->lpVtbl->get_Title(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_get_DisplayIcon(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider* This,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **value) {
    return This->lpVtbl->get_DisplayIcon(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_get_BackgroundColor(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider* This,__x_ABI_CWindows_CUI_CColor *value) {
    return This->lpVtbl->get_BackgroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_get_Tag(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider* This,IInspectable **value) {
    return This->lpVtbl->get_Tag(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_put_Tag(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider* This,IInspectable *value) {
    return This->lpVtbl->put_Tag(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IShareProvider IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider
#define IShareProviderVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderVtbl
#define IShareProvider __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider
#define IShareProvider_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_QueryInterface
#define IShareProvider_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_AddRef
#define IShareProvider_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_Release
#define IShareProvider_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_GetIids
#define IShareProvider_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_GetRuntimeClassName
#define IShareProvider_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_GetTrustLevel
#define IShareProvider_get_Title __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_get_Title
#define IShareProvider_get_DisplayIcon __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_get_DisplayIcon
#define IShareProvider_get_BackgroundColor __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_get_BackgroundColor
#define IShareProvider_get_Tag __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_get_Tag
#define IShareProvider_put_Tag __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_put_Tag
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IShareProviderFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory, 0x172a174c, 0xe79e, 0x4f6d, 0xb0,0x7d, 0x12,0x8f,0x46,0x9e,0x02,0x96);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("172a174c-e79e-4f6d-b07d-128f469e0296")
                IShareProviderFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE Create(
                        HSTRING title,
                        ABI::Windows::Storage::Streams::IRandomAccessStreamReference *display_icon,
                        ABI::Windows::UI::Color background_color,
                        ABI::Windows::ApplicationModel::DataTransfer::IShareProviderHandler *handler,
                        ABI::Windows::ApplicationModel::DataTransfer::IShareProvider **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory, 0x172a174c, 0xe79e, 0x4f6d, 0xb0,0x7d, 0x12,0x8f,0x46,0x9e,0x02,0x96)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory *This,
        TrustLevel *trustLevel);

    /*** IShareProviderFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *Create)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory *This,
        HSTRING title,
        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference *display_icon,
        __x_ABI_CWindows_CUI_CColor background_color,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler *handler,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider **result);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactoryVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IShareProviderFactory methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_Create(This,title,display_icon,background_color,handler,result) (This)->lpVtbl->Create(This,title,display_icon,background_color,handler,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IShareProviderFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_Create(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory* This,HSTRING title,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference *display_icon,__x_ABI_CWindows_CUI_CColor background_color,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderHandler *handler,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider **result) {
    return This->lpVtbl->Create(This,title,display_icon,background_color,handler,result);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IShareProviderFactory IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory
#define IShareProviderFactoryVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactoryVtbl
#define IShareProviderFactory __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory
#define IShareProviderFactory_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_QueryInterface
#define IShareProviderFactory_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_AddRef
#define IShareProviderFactory_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_Release
#define IShareProviderFactory_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_GetIids
#define IShareProviderFactory_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_GetRuntimeClassName
#define IShareProviderFactory_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_GetTrustLevel
#define IShareProviderFactory_Create __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_Create
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IShareProviderOperation interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation, 0x19cef937, 0xd435, 0x4179, 0xb6,0xaf, 0x14,0xe0,0x49,0x2b,0x69,0xf6);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("19cef937-d435-4179-b6af-14e0492b69f6")
                IShareProviderOperation : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Data(
                        ABI::Windows::ApplicationModel::DataTransfer::IDataPackageView **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Provider(
                        ABI::Windows::ApplicationModel::DataTransfer::IShareProvider **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE ReportCompleted(
                        ) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation, 0x19cef937, 0xd435, 0x4179, 0xb6,0xaf, 0x14,0xe0,0x49,0x2b,0x69,0xf6)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation *This,
        TrustLevel *trustLevel);

    /*** IShareProviderOperation methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Data)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView **value);

    HRESULT (STDMETHODCALLTYPE *get_Provider)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider **value);

    HRESULT (STDMETHODCALLTYPE *ReportCompleted)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation *This);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperationVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IShareProviderOperation methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_get_Data(This,value) (This)->lpVtbl->get_Data(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_get_Provider(This,value) (This)->lpVtbl->get_Provider(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_ReportCompleted(This) (This)->lpVtbl->ReportCompleted(This)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IShareProviderOperation methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_get_Data(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView **value) {
    return This->lpVtbl->get_Data(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_get_Provider(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider **value) {
    return This->lpVtbl->get_Provider(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_ReportCompleted(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation* This) {
    return This->lpVtbl->ReportCompleted(This);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IShareProviderOperation IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation
#define IShareProviderOperationVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperationVtbl
#define IShareProviderOperation __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation
#define IShareProviderOperation_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_QueryInterface
#define IShareProviderOperation_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_AddRef
#define IShareProviderOperation_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_Release
#define IShareProviderOperation_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_GetIids
#define IShareProviderOperation_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_GetRuntimeClassName
#define IShareProviderOperation_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_GetTrustLevel
#define IShareProviderOperation_get_Data __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_get_Data
#define IShareProviderOperation_get_Provider __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_get_Provider
#define IShareProviderOperation_ReportCompleted __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_ReportCompleted
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProviderOperation_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IShareProvidersRequestedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs, 0xf888f356, 0xa3f8, 0x4fce, 0x85,0xe4, 0x88,0x26,0xe6,0x3b,0xe7,0x99);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("f888f356-a3f8-4fce-85e4-8826e63be799")
                IShareProvidersRequestedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Providers(
                        ABI::Windows::Foundation::Collections::IVector<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Data(
                        ABI::Windows::ApplicationModel::DataTransfer::IDataPackageView **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetDeferral(
                        ABI::Windows::Foundation::IDeferral **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs, 0xf888f356, 0xa3f8, 0x4fce, 0x85,0xe4, 0x88,0x26,0xe6,0x3b,0xe7,0x99)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs *This,
        TrustLevel *trustLevel);

    /*** IShareProvidersRequestedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Providers)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs *This,
        __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider **value);

    HRESULT (STDMETHODCALLTYPE *get_Data)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView **value);

    HRESULT (STDMETHODCALLTYPE *GetDeferral)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs *This,
        __x_ABI_CWindows_CFoundation_CIDeferral **result);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgsVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IShareProvidersRequestedEventArgs methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_get_Providers(This,value) (This)->lpVtbl->get_Providers(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_get_Data(This,value) (This)->lpVtbl->get_Data(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_GetDeferral(This,result) (This)->lpVtbl->GetDeferral(This,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IShareProvidersRequestedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_get_Providers(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs* This,__FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider **value) {
    return This->lpVtbl->get_Providers(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_get_Data(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackageView **value) {
    return This->lpVtbl->get_Data(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_GetDeferral(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs* This,__x_ABI_CWindows_CFoundation_CIDeferral **result) {
    return This->lpVtbl->GetDeferral(This,result);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IShareProvidersRequestedEventArgs IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs
#define IShareProvidersRequestedEventArgsVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgsVtbl
#define IShareProvidersRequestedEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs
#define IShareProvidersRequestedEventArgs_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_QueryInterface
#define IShareProvidersRequestedEventArgs_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_AddRef
#define IShareProvidersRequestedEventArgs_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_Release
#define IShareProvidersRequestedEventArgs_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_GetIids
#define IShareProvidersRequestedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_GetRuntimeClassName
#define IShareProvidersRequestedEventArgs_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_GetTrustLevel
#define IShareProvidersRequestedEventArgs_get_Providers __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_get_Providers
#define IShareProvidersRequestedEventArgs_get_Data __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_get_Data
#define IShareProvidersRequestedEventArgs_GetDeferral __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_GetDeferral
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IShareTargetInfo interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo, 0x385be607, 0xc6e8, 0x4114, 0xb2,0x94, 0x28,0xf3,0xbb,0x6f,0x99,0x04);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("385be607-c6e8-4114-b294-28f3bb6f9904")
                IShareTargetInfo : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_AppUserModelId(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ShareProvider(
                        ABI::Windows::ApplicationModel::DataTransfer::IShareProvider **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo, 0x385be607, 0xc6e8, 0x4114, 0xb2,0x94, 0x28,0xf3,0xbb,0x6f,0x99,0x04)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfoVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo *This,
        TrustLevel *trustLevel);

    /*** IShareTargetInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AppUserModelId)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_ShareProvider)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider **value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfoVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IShareTargetInfo methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_get_AppUserModelId(This,value) (This)->lpVtbl->get_AppUserModelId(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_get_ShareProvider(This,value) (This)->lpVtbl->get_ShareProvider(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IShareTargetInfo methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_get_AppUserModelId(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo* This,HSTRING *value) {
    return This->lpVtbl->get_AppUserModelId(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_get_ShareProvider(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider **value) {
    return This->lpVtbl->get_ShareProvider(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IShareTargetInfo IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo
#define IShareTargetInfoVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfoVtbl
#define IShareTargetInfo __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo
#define IShareTargetInfo_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_QueryInterface
#define IShareTargetInfo_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_AddRef
#define IShareTargetInfo_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_Release
#define IShareTargetInfo_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_GetIids
#define IShareTargetInfo_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_GetRuntimeClassName
#define IShareTargetInfo_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_GetTrustLevel
#define IShareTargetInfo_get_AppUserModelId __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_get_AppUserModelId
#define IShareTargetInfo_get_ShareProvider __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_get_ShareProvider
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareTargetInfo_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IShareUIOptions interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions, 0x72fa8a80, 0x342f, 0x4d90, 0x95,0x51, 0x2a,0xe0,0x4e,0x37,0x68,0x0c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("72fa8a80-342f-4d90-9551-2ae04e37680c")
                IShareUIOptions : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Theme(
                        ABI::Windows::ApplicationModel::DataTransfer::ShareUITheme *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Theme(
                        ABI::Windows::ApplicationModel::DataTransfer::ShareUITheme value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SelectionRect(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::Rect > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_SelectionRect(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::Rect > *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions, 0x72fa8a80, 0x342f, 0x4d90, 0x95,0x51, 0x2a,0xe0,0x4e,0x37,0x68,0x0c)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptionsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions *This,
        TrustLevel *trustLevel);

    /*** IShareUIOptions methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Theme)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareUITheme *value);

    HRESULT (STDMETHODCALLTYPE *put_Theme)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareUITheme value);

    HRESULT (STDMETHODCALLTYPE *get_SelectionRect)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions *This,
        __FIReference_1_Rect **value);

    HRESULT (STDMETHODCALLTYPE *put_SelectionRect)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions *This,
        __FIReference_1_Rect *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptionsVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptionsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IShareUIOptions methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_get_Theme(This,value) (This)->lpVtbl->get_Theme(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_put_Theme(This,value) (This)->lpVtbl->put_Theme(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_get_SelectionRect(This,value) (This)->lpVtbl->get_SelectionRect(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_put_SelectionRect(This,value) (This)->lpVtbl->put_SelectionRect(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IShareUIOptions methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_get_Theme(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareUITheme *value) {
    return This->lpVtbl->get_Theme(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_put_Theme(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareUITheme value) {
    return This->lpVtbl->put_Theme(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_get_SelectionRect(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions* This,__FIReference_1_Rect **value) {
    return This->lpVtbl->get_SelectionRect(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_put_SelectionRect(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions* This,__FIReference_1_Rect *value) {
    return This->lpVtbl->put_SelectionRect(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IShareUIOptions IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions
#define IShareUIOptionsVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptionsVtbl
#define IShareUIOptions __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions
#define IShareUIOptions_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_QueryInterface
#define IShareUIOptions_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_AddRef
#define IShareUIOptions_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_Release
#define IShareUIOptions_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_GetIids
#define IShareUIOptions_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_GetRuntimeClassName
#define IShareUIOptions_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_GetTrustLevel
#define IShareUIOptions_get_Theme __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_get_Theme
#define IShareUIOptions_put_Theme __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_put_Theme
#define IShareUIOptions_get_SelectionRect __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_get_SelectionRect
#define IShareUIOptions_put_SelectionRect __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_put_SelectionRect
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareUIOptions_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */

/*****************************************************************************
 * ISharedStorageAccessManagerStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics, 0xc6132ada, 0x34b1, 0x4849, 0xbd,0x5f, 0xd0,0x9f,0xee,0x31,0x58,0xc5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("c6132ada-34b1-4849-bd5f-d09fee3158c5")
                ISharedStorageAccessManagerStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE AddFile(
                        ABI::Windows::Storage::IStorageFile *file,
                        HSTRING *out_token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RedeemTokenForFileAsync(
                        HSTRING token,
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::StorageFile* > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RemoveFile(
                        HSTRING token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics, 0xc6132ada, 0x34b1, 0x4849, 0xbd,0x5f, 0xd0,0x9f,0xee,0x31,0x58,0xc5)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics *This,
        TrustLevel *trustLevel);

    /*** ISharedStorageAccessManagerStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *AddFile)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics *This,
        __x_ABI_CWindows_CStorage_CIStorageFile *file,
        HSTRING *out_token);

    HRESULT (STDMETHODCALLTYPE *RedeemTokenForFileAsync)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics *This,
        HSTRING token,
        __FIAsyncOperation_1_Windows__CStorage__CStorageFile **operation);

    HRESULT (STDMETHODCALLTYPE *RemoveFile)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics *This,
        HSTRING token);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStaticsVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISharedStorageAccessManagerStatics methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_AddFile(This,file,out_token) (This)->lpVtbl->AddFile(This,file,out_token)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_RedeemTokenForFileAsync(This,token,operation) (This)->lpVtbl->RedeemTokenForFileAsync(This,token,operation)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_RemoveFile(This,token) (This)->lpVtbl->RemoveFile(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISharedStorageAccessManagerStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_AddFile(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics* This,__x_ABI_CWindows_CStorage_CIStorageFile *file,HSTRING *out_token) {
    return This->lpVtbl->AddFile(This,file,out_token);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_RedeemTokenForFileAsync(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics* This,HSTRING token,__FIAsyncOperation_1_Windows__CStorage__CStorageFile **operation) {
    return This->lpVtbl->RedeemTokenForFileAsync(This,token,operation);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_RemoveFile(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics* This,HSTRING token) {
    return This->lpVtbl->RemoveFile(This,token);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_ISharedStorageAccessManagerStatics IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics
#define ISharedStorageAccessManagerStaticsVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStaticsVtbl
#define ISharedStorageAccessManagerStatics __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics
#define ISharedStorageAccessManagerStatics_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_QueryInterface
#define ISharedStorageAccessManagerStatics_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_AddRef
#define ISharedStorageAccessManagerStatics_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_Release
#define ISharedStorageAccessManagerStatics_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_GetIids
#define ISharedStorageAccessManagerStatics_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_GetRuntimeClassName
#define ISharedStorageAccessManagerStatics_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_GetTrustLevel
#define ISharedStorageAccessManagerStatics_AddFile __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_AddFile
#define ISharedStorageAccessManagerStatics_RedeemTokenForFileAsync __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_RedeemTokenForFileAsync
#define ISharedStorageAccessManagerStatics_RemoveFile __x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_RemoveFile
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CISharedStorageAccessManagerStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IStandardDataFormatsStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics, 0x7ed681a1, 0xa880, 0x40c9, 0xb4,0xed, 0x0b,0xee,0x1e,0x15,0xf5,0x49);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("7ed681a1-a880-40c9-b4ed-0bee1e15f549")
                IStandardDataFormatsStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Text(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Uri(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Html(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Rtf(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Bitmap(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_StorageItems(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics, 0x7ed681a1, 0xa880, 0x40c9, 0xb4,0xed, 0x0b,0xee,0x1e,0x15,0xf5,0x49)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics *This,
        TrustLevel *trustLevel);

    /*** IStandardDataFormatsStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Text)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Uri)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Html)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Rtf)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Bitmap)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_StorageItems)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStaticsVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IStandardDataFormatsStatics methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_get_Text(This,value) (This)->lpVtbl->get_Text(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_get_Uri(This,value) (This)->lpVtbl->get_Uri(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_get_Html(This,value) (This)->lpVtbl->get_Html(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_get_Rtf(This,value) (This)->lpVtbl->get_Rtf(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_get_Bitmap(This,value) (This)->lpVtbl->get_Bitmap(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_get_StorageItems(This,value) (This)->lpVtbl->get_StorageItems(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IStandardDataFormatsStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_get_Text(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Text(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_get_Uri(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Uri(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_get_Html(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Html(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_get_Rtf(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Rtf(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_get_Bitmap(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Bitmap(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_get_StorageItems(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics* This,HSTRING *value) {
    return This->lpVtbl->get_StorageItems(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IStandardDataFormatsStatics IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics
#define IStandardDataFormatsStaticsVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStaticsVtbl
#define IStandardDataFormatsStatics __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics
#define IStandardDataFormatsStatics_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_QueryInterface
#define IStandardDataFormatsStatics_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_AddRef
#define IStandardDataFormatsStatics_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_Release
#define IStandardDataFormatsStatics_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_GetIids
#define IStandardDataFormatsStatics_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_GetRuntimeClassName
#define IStandardDataFormatsStatics_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_GetTrustLevel
#define IStandardDataFormatsStatics_get_Text __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_get_Text
#define IStandardDataFormatsStatics_get_Uri __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_get_Uri
#define IStandardDataFormatsStatics_get_Html __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_get_Html
#define IStandardDataFormatsStatics_get_Rtf __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_get_Rtf
#define IStandardDataFormatsStatics_get_Bitmap __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_get_Bitmap
#define IStandardDataFormatsStatics_get_StorageItems __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_get_StorageItems
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IStandardDataFormatsStatics2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2, 0x42a254f4, 0x9d76, 0x42e8, 0x86,0x1b, 0x47,0xc2,0x5d,0xd0,0xcf,0x71);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("42a254f4-9d76-42e8-861b-47c25dd0cf71")
                IStandardDataFormatsStatics2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_WebLink(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ApplicationLink(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2, 0x42a254f4, 0x9d76, 0x42e8, 0x86,0x1b, 0x47,0xc2,0x5d,0xd0,0xcf,0x71)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2 *This,
        TrustLevel *trustLevel);

    /*** IStandardDataFormatsStatics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_WebLink)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_ApplicationLink)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2 *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IStandardDataFormatsStatics2 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_get_WebLink(This,value) (This)->lpVtbl->get_WebLink(This,value)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_get_ApplicationLink(This,value) (This)->lpVtbl->get_ApplicationLink(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IStandardDataFormatsStatics2 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_get_WebLink(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2* This,HSTRING *value) {
    return This->lpVtbl->get_WebLink(This,value);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_get_ApplicationLink(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2* This,HSTRING *value) {
    return This->lpVtbl->get_ApplicationLink(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IStandardDataFormatsStatics2 IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2
#define IStandardDataFormatsStatics2Vtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2Vtbl
#define IStandardDataFormatsStatics2 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2
#define IStandardDataFormatsStatics2_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_QueryInterface
#define IStandardDataFormatsStatics2_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_AddRef
#define IStandardDataFormatsStatics2_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_Release
#define IStandardDataFormatsStatics2_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_GetIids
#define IStandardDataFormatsStatics2_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_GetRuntimeClassName
#define IStandardDataFormatsStatics2_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_GetTrustLevel
#define IStandardDataFormatsStatics2_get_WebLink __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_get_WebLink
#define IStandardDataFormatsStatics2_get_ApplicationLink __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_get_ApplicationLink
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IStandardDataFormatsStatics3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3, 0x3b57b069, 0x01d4, 0x474c, 0x8b,0x5f, 0xbc,0x8e,0x27,0xf3,0x8b,0x21);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("3b57b069-01d4-474c-8b5f-bc8e27f38b21")
                IStandardDataFormatsStatics3 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_UserActivityJsonArray(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3, 0x3b57b069, 0x01d4, 0x474c, 0x8b,0x5f, 0xbc,0x8e,0x27,0xf3,0x8b,0x21)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3 *This,
        TrustLevel *trustLevel);

    /*** IStandardDataFormatsStatics3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UserActivityJsonArray)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3 *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3Vtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3 {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IStandardDataFormatsStatics3 methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_get_UserActivityJsonArray(This,value) (This)->lpVtbl->get_UserActivityJsonArray(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IStandardDataFormatsStatics3 methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_get_UserActivityJsonArray(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3* This,HSTRING *value) {
    return This->lpVtbl->get_UserActivityJsonArray(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_IStandardDataFormatsStatics3 IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3
#define IStandardDataFormatsStatics3Vtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3Vtbl
#define IStandardDataFormatsStatics3 __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3
#define IStandardDataFormatsStatics3_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_QueryInterface
#define IStandardDataFormatsStatics3_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_AddRef
#define IStandardDataFormatsStatics3_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_Release
#define IStandardDataFormatsStatics3_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_GetIids
#define IStandardDataFormatsStatics3_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_GetRuntimeClassName
#define IStandardDataFormatsStatics3_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_GetTrustLevel
#define IStandardDataFormatsStatics3_get_UserActivityJsonArray __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_get_UserActivityJsonArray
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CIStandardDataFormatsStatics3_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000 */

/*****************************************************************************
 * ITargetApplicationChosenEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs, 0xca6fb8ac, 0x2987, 0x4ee3, 0x9c,0x54, 0xd8,0xaf,0xbc,0xb8,0x6c,0x1d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace ApplicationModel {
            namespace DataTransfer {
                MIDL_INTERFACE("ca6fb8ac-2987-4ee3-9c54-d8afbcb86c1d")
                ITargetApplicationChosenEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ApplicationName(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs, 0xca6fb8ac, 0x2987, 0x4ee3, 0x9c,0x54, 0xd8,0xaf,0xbc,0xb8,0x6c,0x1d)
#endif
#else
typedef struct __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs *This,
        TrustLevel *trustLevel);

    /*** ITargetApplicationChosenEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ApplicationName)(
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgsVtbl;

interface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs {
    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITargetApplicationChosenEventArgs methods ***/
#define __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_get_ApplicationName(This,value) (This)->lpVtbl->get_ApplicationName(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_QueryInterface(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_AddRef(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_Release(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_GetIids(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITargetApplicationChosenEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_get_ApplicationName(__x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs* This,HSTRING *value) {
    return This->lpVtbl->get_ApplicationName(This,value);
}
#endif
#ifdef WIDL_using_Windows_ApplicationModel_DataTransfer
#define IID_ITargetApplicationChosenEventArgs IID___x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs
#define ITargetApplicationChosenEventArgsVtbl __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgsVtbl
#define ITargetApplicationChosenEventArgs __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs
#define ITargetApplicationChosenEventArgs_QueryInterface __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_QueryInterface
#define ITargetApplicationChosenEventArgs_AddRef __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_AddRef
#define ITargetApplicationChosenEventArgs_Release __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_Release
#define ITargetApplicationChosenEventArgs_GetIids __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_GetIids
#define ITargetApplicationChosenEventArgs_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_GetRuntimeClassName
#define ITargetApplicationChosenEventArgs_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_GetTrustLevel
#define ITargetApplicationChosenEventArgs_get_ApplicationName __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_get_ApplicationName
#endif /* WIDL_using_Windows_ApplicationModel_DataTransfer */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.Clipboard
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_Clipboard_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_Clipboard_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_Clipboard[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','C','l','i','p','b','o','a','r','d',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_Clipboard[] = L"Windows.ApplicationModel.DataTransfer.Clipboard";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_Clipboard[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','C','l','i','p','b','o','a','r','d',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_Clipboard_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.ClipboardContentOptions
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ClipboardContentOptions_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ClipboardContentOptions_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ClipboardContentOptions[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','C','l','i','p','b','o','a','r','d','C','o','n','t','e','n','t','O','p','t','i','o','n','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ClipboardContentOptions[] = L"Windows.ApplicationModel.DataTransfer.ClipboardContentOptions";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ClipboardContentOptions[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','C','l','i','p','b','o','a','r','d','C','o','n','t','e','n','t','O','p','t','i','o','n','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ClipboardContentOptions_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.ClipboardHistoryChangedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ClipboardHistoryChangedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ClipboardHistoryChangedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ClipboardHistoryChangedEventArgs[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','C','l','i','p','b','o','a','r','d','H','i','s','t','o','r','y','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ClipboardHistoryChangedEventArgs[] = L"Windows.ApplicationModel.DataTransfer.ClipboardHistoryChangedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ClipboardHistoryChangedEventArgs[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','C','l','i','p','b','o','a','r','d','H','i','s','t','o','r','y','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ClipboardHistoryChangedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.ClipboardHistoryItem
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ClipboardHistoryItem_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ClipboardHistoryItem_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ClipboardHistoryItem[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','C','l','i','p','b','o','a','r','d','H','i','s','t','o','r','y','I','t','e','m',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ClipboardHistoryItem[] = L"Windows.ApplicationModel.DataTransfer.ClipboardHistoryItem";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ClipboardHistoryItem[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','C','l','i','p','b','o','a','r','d','H','i','s','t','o','r','y','I','t','e','m',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ClipboardHistoryItem_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.ClipboardHistoryItemsResult
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ClipboardHistoryItemsResult_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ClipboardHistoryItemsResult_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ClipboardHistoryItemsResult[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','C','l','i','p','b','o','a','r','d','H','i','s','t','o','r','y','I','t','e','m','s','R','e','s','u','l','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ClipboardHistoryItemsResult[] = L"Windows.ApplicationModel.DataTransfer.ClipboardHistoryItemsResult";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ClipboardHistoryItemsResult[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','C','l','i','p','b','o','a','r','d','H','i','s','t','o','r','y','I','t','e','m','s','R','e','s','u','l','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ClipboardHistoryItemsResult_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.DataPackage
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataPackage_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataPackage_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataPackage[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','D','a','t','a','P','a','c','k','a','g','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataPackage[] = L"Windows.ApplicationModel.DataTransfer.DataPackage";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataPackage[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','D','a','t','a','P','a','c','k','a','g','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataPackage_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.DataPackagePropertySet
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataPackagePropertySet_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataPackagePropertySet_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataPackagePropertySet[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','D','a','t','a','P','a','c','k','a','g','e','P','r','o','p','e','r','t','y','S','e','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataPackagePropertySet[] = L"Windows.ApplicationModel.DataTransfer.DataPackagePropertySet";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataPackagePropertySet[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','D','a','t','a','P','a','c','k','a','g','e','P','r','o','p','e','r','t','y','S','e','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataPackagePropertySet_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.DataPackagePropertySetView
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataPackagePropertySetView_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataPackagePropertySetView_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataPackagePropertySetView[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','D','a','t','a','P','a','c','k','a','g','e','P','r','o','p','e','r','t','y','S','e','t','V','i','e','w',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataPackagePropertySetView[] = L"Windows.ApplicationModel.DataTransfer.DataPackagePropertySetView";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataPackagePropertySetView[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','D','a','t','a','P','a','c','k','a','g','e','P','r','o','p','e','r','t','y','S','e','t','V','i','e','w',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataPackagePropertySetView_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.DataPackageView
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataPackageView_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataPackageView_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataPackageView[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','D','a','t','a','P','a','c','k','a','g','e','V','i','e','w',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataPackageView[] = L"Windows.ApplicationModel.DataTransfer.DataPackageView";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataPackageView[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','D','a','t','a','P','a','c','k','a','g','e','V','i','e','w',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataPackageView_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.DataProviderDeferral
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataProviderDeferral_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataProviderDeferral_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataProviderDeferral[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','D','a','t','a','P','r','o','v','i','d','e','r','D','e','f','e','r','r','a','l',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataProviderDeferral[] = L"Windows.ApplicationModel.DataTransfer.DataProviderDeferral";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataProviderDeferral[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','D','a','t','a','P','r','o','v','i','d','e','r','D','e','f','e','r','r','a','l',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataProviderDeferral_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.DataProviderRequest
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataProviderRequest_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataProviderRequest_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataProviderRequest[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','D','a','t','a','P','r','o','v','i','d','e','r','R','e','q','u','e','s','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataProviderRequest[] = L"Windows.ApplicationModel.DataTransfer.DataProviderRequest";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataProviderRequest[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','D','a','t','a','P','r','o','v','i','d','e','r','R','e','q','u','e','s','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataProviderRequest_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.DataRequest
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataRequest_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataRequest_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataRequest[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','D','a','t','a','R','e','q','u','e','s','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataRequest[] = L"Windows.ApplicationModel.DataTransfer.DataRequest";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataRequest[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','D','a','t','a','R','e','q','u','e','s','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataRequest_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.DataRequestDeferral
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataRequestDeferral_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataRequestDeferral_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataRequestDeferral[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','D','a','t','a','R','e','q','u','e','s','t','D','e','f','e','r','r','a','l',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataRequestDeferral[] = L"Windows.ApplicationModel.DataTransfer.DataRequestDeferral";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataRequestDeferral[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','D','a','t','a','R','e','q','u','e','s','t','D','e','f','e','r','r','a','l',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataRequestDeferral_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.DataRequestedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataRequestedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataRequestedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataRequestedEventArgs[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','D','a','t','a','R','e','q','u','e','s','t','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataRequestedEventArgs[] = L"Windows.ApplicationModel.DataTransfer.DataRequestedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataRequestedEventArgs[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','D','a','t','a','R','e','q','u','e','s','t','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataRequestedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.DataTransferManager
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataTransferManager_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataTransferManager_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataTransferManager[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','D','a','t','a','T','r','a','n','s','f','e','r','M','a','n','a','g','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataTransferManager[] = L"Windows.ApplicationModel.DataTransfer.DataTransferManager";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_DataTransferManager[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','D','a','t','a','T','r','a','n','s','f','e','r','M','a','n','a','g','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_DataTransferManager_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.HtmlFormatHelper
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_HtmlFormatHelper_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_HtmlFormatHelper_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_HtmlFormatHelper[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','H','t','m','l','F','o','r','m','a','t','H','e','l','p','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_HtmlFormatHelper[] = L"Windows.ApplicationModel.DataTransfer.HtmlFormatHelper";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_HtmlFormatHelper[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','H','t','m','l','F','o','r','m','a','t','H','e','l','p','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_HtmlFormatHelper_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.OperationCompletedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_OperationCompletedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_OperationCompletedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_OperationCompletedEventArgs[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','O','p','e','r','a','t','i','o','n','C','o','m','p','l','e','t','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_OperationCompletedEventArgs[] = L"Windows.ApplicationModel.DataTransfer.OperationCompletedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_OperationCompletedEventArgs[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','O','p','e','r','a','t','i','o','n','C','o','m','p','l','e','t','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_OperationCompletedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.ShareCompletedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ShareCompletedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ShareCompletedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ShareCompletedEventArgs[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','S','h','a','r','e','C','o','m','p','l','e','t','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ShareCompletedEventArgs[] = L"Windows.ApplicationModel.DataTransfer.ShareCompletedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ShareCompletedEventArgs[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','S','h','a','r','e','C','o','m','p','l','e','t','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ShareCompletedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.ShareProvider
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ShareProvider_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ShareProvider_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ShareProvider[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','S','h','a','r','e','P','r','o','v','i','d','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ShareProvider[] = L"Windows.ApplicationModel.DataTransfer.ShareProvider";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ShareProvider[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','S','h','a','r','e','P','r','o','v','i','d','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ShareProvider_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.ShareProviderOperation
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ShareProviderOperation_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ShareProviderOperation_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ShareProviderOperation[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','S','h','a','r','e','P','r','o','v','i','d','e','r','O','p','e','r','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ShareProviderOperation[] = L"Windows.ApplicationModel.DataTransfer.ShareProviderOperation";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ShareProviderOperation[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','S','h','a','r','e','P','r','o','v','i','d','e','r','O','p','e','r','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ShareProviderOperation_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.ShareProvidersRequestedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ShareProvidersRequestedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ShareProvidersRequestedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ShareProvidersRequestedEventArgs[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','S','h','a','r','e','P','r','o','v','i','d','e','r','s','R','e','q','u','e','s','t','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ShareProvidersRequestedEventArgs[] = L"Windows.ApplicationModel.DataTransfer.ShareProvidersRequestedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ShareProvidersRequestedEventArgs[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','S','h','a','r','e','P','r','o','v','i','d','e','r','s','R','e','q','u','e','s','t','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ShareProvidersRequestedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.ShareTargetInfo
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ShareTargetInfo_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ShareTargetInfo_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ShareTargetInfo[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','S','h','a','r','e','T','a','r','g','e','t','I','n','f','o',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ShareTargetInfo[] = L"Windows.ApplicationModel.DataTransfer.ShareTargetInfo";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ShareTargetInfo[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','S','h','a','r','e','T','a','r','g','e','t','I','n','f','o',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ShareTargetInfo_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.ShareUIOptions
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ShareUIOptions_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ShareUIOptions_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ShareUIOptions[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','S','h','a','r','e','U','I','O','p','t','i','o','n','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ShareUIOptions[] = L"Windows.ApplicationModel.DataTransfer.ShareUIOptions";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_ShareUIOptions[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','S','h','a','r','e','U','I','O','p','t','i','o','n','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_ShareUIOptions_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.SharedStorageAccessManager
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_SharedStorageAccessManager_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_SharedStorageAccessManager_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_SharedStorageAccessManager[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','S','h','a','r','e','d','S','t','o','r','a','g','e','A','c','c','e','s','s','M','a','n','a','g','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_SharedStorageAccessManager[] = L"Windows.ApplicationModel.DataTransfer.SharedStorageAccessManager";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_SharedStorageAccessManager[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','S','h','a','r','e','d','S','t','o','r','a','g','e','A','c','c','e','s','s','M','a','n','a','g','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_SharedStorageAccessManager_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.StandardDataFormats
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_StandardDataFormats_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_StandardDataFormats_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_StandardDataFormats[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','S','t','a','n','d','a','r','d','D','a','t','a','F','o','r','m','a','t','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_StandardDataFormats[] = L"Windows.ApplicationModel.DataTransfer.StandardDataFormats";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_StandardDataFormats[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','S','t','a','n','d','a','r','d','D','a','t','a','F','o','r','m','a','t','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_StandardDataFormats_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.ApplicationModel.DataTransfer.TargetApplicationChosenEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_TargetApplicationChosenEventArgs_DEFINED
#define RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_TargetApplicationChosenEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_TargetApplicationChosenEventArgs[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','T','a','r','g','e','t','A','p','p','l','i','c','a','t','i','o','n','C','h','o','s','e','n','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_TargetApplicationChosenEventArgs[] = L"Windows.ApplicationModel.DataTransfer.TargetApplicationChosenEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DataTransfer_TargetApplicationChosenEventArgs[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','a','t','a','T','r','a','n','s','f','e','r','.','T','a','r','g','e','t','A','p','p','l','i','c','a','t','i','o','n','C','h','o','s','e','n','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_ApplicationModel_DataTransfer_TargetApplicationChosenEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IIterable<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* > interface
 */
#ifndef ____FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem, 0x5c3705f4, 0x8e46, 0x5ae5, 0x97,0xbf, 0x88,0x22,0x0c,0xcc,0xff,0xd9);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("5c3705f4-8e46-5ae5-97bf-88220cccffd9")
                IIterable<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem*, ABI::Windows::ApplicationModel::DataTransfer::IClipboardHistoryItem* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem, 0x5c3705f4, 0x8e46, 0x5ae5, 0x97,0xbf, 0x88,0x22,0x0c,0xcc,0xff,0xd9)
#endif
#else
typedef struct __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem *This,
        __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem **value);

    END_INTERFACE
} __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemVtbl;

interface __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem {
    CONST_VTBL __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* > methods ***/
#define __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_QueryInterface(__FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_AddRef(__FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_Release(__FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetIids(__FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetRuntimeClassName(__FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetTrustLevel(__FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_First(__FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This,__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_ClipboardHistoryItem IID___FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem
#define IIterable_ClipboardHistoryItemVtbl __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemVtbl
#define IIterable_ClipboardHistoryItem __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem
#define IIterable_ClipboardHistoryItem_QueryInterface __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_QueryInterface
#define IIterable_ClipboardHistoryItem_AddRef __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_AddRef
#define IIterable_ClipboardHistoryItem_Release __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_Release
#define IIterable_ClipboardHistoryItem_GetIids __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetIids
#define IIterable_ClipboardHistoryItem_GetRuntimeClassName __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetRuntimeClassName
#define IIterable_ClipboardHistoryItem_GetTrustLevel __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetTrustLevel
#define IIterable_ClipboardHistoryItem_First __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* > interface
 */
#ifndef ____FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider, 0x0903b218, 0x5cad, 0x53e6, 0x9a,0x21, 0x6f,0x4b,0x31,0xc4,0xa4,0x09);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("0903b218-5cad-53e6-9a21-6f4b31c4a409")
                IIterable<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider*, ABI::Windows::ApplicationModel::DataTransfer::IShareProvider* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider, 0x0903b218, 0x5cad, 0x53e6, 0x9a,0x21, 0x6f,0x4b,0x31,0xc4,0xa4,0x09)
#endif
#else
typedef struct __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider **value);

    END_INTERFACE
} __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProviderVtbl;

interface __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider {
    CONST_VTBL __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* > methods ***/
#define __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_QueryInterface(__FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_AddRef(__FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_Release(__FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetIids(__FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetRuntimeClassName(__FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetTrustLevel(__FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_First(__FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_ShareProvider IID___FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider
#define IIterable_ShareProviderVtbl __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProviderVtbl
#define IIterable_ShareProvider __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider
#define IIterable_ShareProvider_QueryInterface __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_QueryInterface
#define IIterable_ShareProvider_AddRef __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_AddRef
#define IIterable_ShareProvider_Release __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_Release
#define IIterable_ShareProvider_GetIids __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetIids
#define IIterable_ShareProvider_GetRuntimeClassName __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetRuntimeClassName
#define IIterable_ShareProvider_GetTrustLevel __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetTrustLevel
#define IIterable_ShareProvider_First __FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* > interface
 */
#ifndef ____FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem, 0x63fac521, 0x1395, 0x5c95, 0xaa,0xff, 0x97,0x36,0x37,0x8a,0x4f,0x2f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("63fac521-1395-5c95-aaff-9736378a4f2f")
                IIterator<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem*, ABI::Windows::ApplicationModel::DataTransfer::IClipboardHistoryItem* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem, 0x63fac521, 0x1395, 0x5c95, 0xaa,0xff, 0x97,0x36,0x37,0x8a,0x4f,0x2f)
#endif
#else
typedef struct __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem *This,
        UINT32 items_size,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemVtbl;

interface __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem {
    CONST_VTBL __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* > methods ***/
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_QueryInterface(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_AddRef(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_Release(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetIids(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetRuntimeClassName(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetTrustLevel(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_get_Current(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_get_HasCurrent(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_MoveNext(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetMany(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This,UINT32 items_size,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_ClipboardHistoryItem IID___FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem
#define IIterator_ClipboardHistoryItemVtbl __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemVtbl
#define IIterator_ClipboardHistoryItem __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem
#define IIterator_ClipboardHistoryItem_QueryInterface __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_QueryInterface
#define IIterator_ClipboardHistoryItem_AddRef __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_AddRef
#define IIterator_ClipboardHistoryItem_Release __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_Release
#define IIterator_ClipboardHistoryItem_GetIids __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetIids
#define IIterator_ClipboardHistoryItem_GetRuntimeClassName __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetRuntimeClassName
#define IIterator_ClipboardHistoryItem_GetTrustLevel __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetTrustLevel
#define IIterator_ClipboardHistoryItem_get_Current __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_get_Current
#define IIterator_ClipboardHistoryItem_get_HasCurrent __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_get_HasCurrent
#define IIterator_ClipboardHistoryItem_MoveNext __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_MoveNext
#define IIterator_ClipboardHistoryItem_GetMany __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* > interface
 */
#ifndef ____FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider, 0x886f5642, 0xe9f9, 0x573b, 0x92,0x13, 0x58,0x40,0xb5,0x06,0x2b,0x40);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("886f5642-e9f9-573b-9213-5840b5062b40")
                IIterator<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider*, ABI::Windows::ApplicationModel::DataTransfer::IShareProvider* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider, 0x886f5642, 0xe9f9, 0x573b, 0x92,0x13, 0x58,0x40,0xb5,0x06,0x2b,0x40)
#endif
#else
typedef struct __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        UINT32 items_size,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProviderVtbl;

interface __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider {
    CONST_VTBL __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* > methods ***/
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_QueryInterface(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_AddRef(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_Release(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetIids(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetRuntimeClassName(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetTrustLevel(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_get_Current(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_get_HasCurrent(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_MoveNext(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetMany(__FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,UINT32 items_size,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_ShareProvider IID___FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider
#define IIterator_ShareProviderVtbl __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProviderVtbl
#define IIterator_ShareProvider __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider
#define IIterator_ShareProvider_QueryInterface __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_QueryInterface
#define IIterator_ShareProvider_AddRef __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_AddRef
#define IIterator_ShareProvider_Release __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_Release
#define IIterator_ShareProvider_GetIids __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetIids
#define IIterator_ShareProvider_GetRuntimeClassName __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetRuntimeClassName
#define IIterator_ShareProvider_GetTrustLevel __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetTrustLevel
#define IIterator_ShareProvider_get_Current __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_get_Current
#define IIterator_ShareProvider_get_HasCurrent __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_get_HasCurrent
#define IIterator_ShareProvider_MoveNext __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_MoveNext
#define IIterator_ShareProvider_GetMany __FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* > interface
 */
#ifndef ____FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem, 0xc91de16d, 0x13ff, 0x55b0, 0x89,0x7d, 0x18,0xa1,0x31,0xd5,0x7a,0xc9);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("c91de16d-13ff-55b0-897d-18a131d57ac9")
                IVectorView<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem*, ABI::Windows::ApplicationModel::DataTransfer::IClipboardHistoryItem* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem, 0xc91de16d, 0x13ff, 0x55b0, 0x89,0x7d, 0x18,0xa1,0x31,0xd5,0x7a,0xc9)
#endif
#else
typedef struct __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem *This,
        TrustLevel *trustLevel);

    /*** IVectorView<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem *This,
        UINT32 index,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemVtbl;

interface __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem {
    CONST_VTBL __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* > methods ***/
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_QueryInterface(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_AddRef(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_Release(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetIids(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetRuntimeClassName(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetTrustLevel(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItem* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetAt(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This,UINT32 index,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_get_Size(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_IndexOf(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetMany(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItem **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_ClipboardHistoryItem IID___FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem
#define IVectorView_ClipboardHistoryItemVtbl __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemVtbl
#define IVectorView_ClipboardHistoryItem __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem
#define IVectorView_ClipboardHistoryItem_QueryInterface __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_QueryInterface
#define IVectorView_ClipboardHistoryItem_AddRef __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_AddRef
#define IVectorView_ClipboardHistoryItem_Release __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_Release
#define IVectorView_ClipboardHistoryItem_GetIids __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetIids
#define IVectorView_ClipboardHistoryItem_GetRuntimeClassName __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetRuntimeClassName
#define IVectorView_ClipboardHistoryItem_GetTrustLevel __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetTrustLevel
#define IVectorView_ClipboardHistoryItem_GetAt __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetAt
#define IVectorView_ClipboardHistoryItem_get_Size __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_get_Size
#define IVectorView_ClipboardHistoryItem_IndexOf __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_IndexOf
#define IVectorView_ClipboardHistoryItem_GetMany __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItem_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* > interface
 */
#ifndef ____FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider, 0x946537a2, 0x932c, 0x5b77, 0xab,0x36, 0xb7,0x06,0x50,0xf0,0xbc,0xd5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("946537a2-932c-5b77-ab36-b70650f0bcd5")
                IVectorView<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider*, ABI::Windows::ApplicationModel::DataTransfer::IShareProvider* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider, 0x946537a2, 0x932c, 0x5b77, 0xab,0x36, 0xb7,0x06,0x50,0xf0,0xbc,0xd5)
#endif
#else
typedef struct __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        TrustLevel *trustLevel);

    /*** IVectorView<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        UINT32 index,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProviderVtbl;

interface __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider {
    CONST_VTBL __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* > methods ***/
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_QueryInterface(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_AddRef(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_Release(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetIids(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetRuntimeClassName(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetTrustLevel(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetAt(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,UINT32 index,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_get_Size(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_IndexOf(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetMany(__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_ShareProvider IID___FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider
#define IVectorView_ShareProviderVtbl __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProviderVtbl
#define IVectorView_ShareProvider __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider
#define IVectorView_ShareProvider_QueryInterface __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_QueryInterface
#define IVectorView_ShareProvider_AddRef __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_AddRef
#define IVectorView_ShareProvider_Release __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_Release
#define IVectorView_ShareProvider_GetIids __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetIids
#define IVectorView_ShareProvider_GetRuntimeClassName __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetRuntimeClassName
#define IVectorView_ShareProvider_GetTrustLevel __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetTrustLevel
#define IVectorView_ShareProvider_GetAt __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetAt
#define IVectorView_ShareProvider_get_Size __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_get_Size
#define IVectorView_ShareProvider_IndexOf __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_IndexOf
#define IVectorView_ShareProvider_GetMany __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVector<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* > interface
 */
#ifndef ____FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_INTERFACE_DEFINED__
#define ____FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider, 0xa1687865, 0x31e2, 0x5536, 0x97,0xec, 0x29,0x22,0x69,0xa7,0x80,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("a1687865-31e2-5536-97ec-292269a78046")
                IVector<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* > : IVector_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider*, ABI::Windows::ApplicationModel::DataTransfer::IShareProvider* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider, 0xa1687865, 0x31e2, 0x5536, 0x97,0xec, 0x29,0x22,0x69,0xa7,0x80,0x46)
#endif
#else
typedef struct __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        TrustLevel *trustLevel);

    /*** IVector<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        UINT32 index,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *GetView)(
        __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        __FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider **value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        UINT32 index,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider *value);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        UINT32 index,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *Append)(
        __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAtEnd)(
        __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider **items,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *ReplaceAll)(
        __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider *This,
        UINT32 count,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider **items);

    END_INTERFACE
} __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProviderVtbl;

interface __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider {
    CONST_VTBL __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVector<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* > methods ***/
#define __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetView(This,value) (This)->lpVtbl->GetView(This,value)
#define __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_SetAt(This,index,value) (This)->lpVtbl->SetAt(This,index,value)
#define __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_InsertAt(This,index,value) (This)->lpVtbl->InsertAt(This,index,value)
#define __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_Append(This,value) (This)->lpVtbl->Append(This,value)
#define __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_RemoveAtEnd(This) (This)->lpVtbl->RemoveAtEnd(This)
#define __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_Clear(This) (This)->lpVtbl->Clear(This)
#define __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#define __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_ReplaceAll(This,count,items) (This)->lpVtbl->ReplaceAll(This,count,items)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_QueryInterface(__FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_AddRef(__FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_Release(__FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetIids(__FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetRuntimeClassName(__FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetTrustLevel(__FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVector<ABI::Windows::ApplicationModel::DataTransfer::ShareProvider* > methods ***/
static inline HRESULT __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetAt(__FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,UINT32 index,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_get_Size(__FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetView(__FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,__FIVectorView_1_Windows__CApplicationModel__CDataTransfer__CShareProvider **value) {
    return This->lpVtbl->GetView(This,value);
}
static inline HRESULT __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_IndexOf(__FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_SetAt(__FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,UINT32 index,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider *value) {
    return This->lpVtbl->SetAt(This,index,value);
}
static inline HRESULT __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_InsertAt(__FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,UINT32 index,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider *value) {
    return This->lpVtbl->InsertAt(This,index,value);
}
static inline HRESULT __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_RemoveAt(__FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static inline HRESULT __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_Append(__FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider *value) {
    return This->lpVtbl->Append(This,value);
}
static inline HRESULT __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_RemoveAtEnd(__FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This) {
    return This->lpVtbl->RemoveAtEnd(This);
}
static inline HRESULT __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_Clear(__FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This) {
    return This->lpVtbl->Clear(This);
}
static inline HRESULT __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetMany(__FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
static inline HRESULT __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_ReplaceAll(__FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider* This,UINT32 count,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvider **items) {
    return This->lpVtbl->ReplaceAll(This,count,items);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVector_ShareProvider IID___FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider
#define IVector_ShareProviderVtbl __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProviderVtbl
#define IVector_ShareProvider __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider
#define IVector_ShareProvider_QueryInterface __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_QueryInterface
#define IVector_ShareProvider_AddRef __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_AddRef
#define IVector_ShareProvider_Release __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_Release
#define IVector_ShareProvider_GetIids __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetIids
#define IVector_ShareProvider_GetRuntimeClassName __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetRuntimeClassName
#define IVector_ShareProvider_GetTrustLevel __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetTrustLevel
#define IVector_ShareProvider_GetAt __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetAt
#define IVector_ShareProvider_get_Size __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_get_Size
#define IVector_ShareProvider_GetView __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetView
#define IVector_ShareProvider_IndexOf __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_IndexOf
#define IVector_ShareProvider_SetAt __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_SetAt
#define IVector_ShareProvider_InsertAt __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_InsertAt
#define IVector_ShareProvider_RemoveAt __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_RemoveAt
#define IVector_ShareProvider_Append __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_Append
#define IVector_ShareProvider_RemoveAtEnd __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_RemoveAtEnd
#define IVector_ShareProvider_Clear __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_Clear
#define IVector_ShareProvider_GetMany __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_GetMany
#define IVector_ShareProvider_ReplaceAll __FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_ReplaceAll
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVector_1_Windows__CApplicationModel__CDataTransfer__CShareProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEventHandler<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryChangedEventArgs* > interface
 */
#ifndef ____FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs_INTERFACE_DEFINED__
#define ____FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs, 0xdf4aac23, 0x4002, 0x5d4c, 0xa2,0x37, 0x25,0x26,0xe3,0x44,0x97,0x8d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("df4aac23-4002-5d4c-a237-2526e344978d")
            IEventHandler<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryChangedEventArgs* > : IEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryChangedEventArgs*, ABI::Windows::ApplicationModel::DataTransfer::IClipboardHistoryChangedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs, 0xdf4aac23, 0x4002, 0x5d4c, 0xa2,0x37, 0x25,0x26,0xe3,0x44,0x97,0x8d)
#endif
#else
typedef struct __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEventHandler<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryChangedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs *This,
        IInspectable *sender,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs *args);

    END_INTERFACE
} __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgsVtbl;

interface __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs {
    CONST_VTBL __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IEventHandler<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryChangedEventArgs* > methods ***/
#define __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs_QueryInterface(__FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs_AddRef(__FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs_Release(__FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IEventHandler<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryChangedEventArgs* > methods ***/
static inline HRESULT __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs_Invoke(__FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs* This,IInspectable *sender,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryChangedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IEventHandler_ClipboardHistoryChangedEventArgs IID___FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs
#define IEventHandler_ClipboardHistoryChangedEventArgsVtbl __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgsVtbl
#define IEventHandler_ClipboardHistoryChangedEventArgs __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs
#define IEventHandler_ClipboardHistoryChangedEventArgs_QueryInterface __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs_QueryInterface
#define IEventHandler_ClipboardHistoryChangedEventArgs_AddRef __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs_AddRef
#define IEventHandler_ClipboardHistoryChangedEventArgs_Release __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs_Release
#define IEventHandler_ClipboardHistoryChangedEventArgs_Invoke __FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIEventHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryChangedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItemsResult* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult, 0x841da82d, 0xa32c, 0x5997, 0x84,0x50, 0xf5,0x4a,0xf1,0xd5,0x47,0x7e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("841da82d-a32c-5997-8450-f54af1d5477e")
            IAsyncOperationCompletedHandler<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItemsResult* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItemsResult*, ABI::Windows::ApplicationModel::DataTransfer::IClipboardHistoryItemsResult* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult, 0x841da82d, 0xa32c, 0x5997, 0x84,0x50, 0xf5,0x4a,0xf1,0xd5,0x47,0x7e)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResultVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItemsResult* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult *This,
        __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResultVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItemsResult* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_Release(__FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItemsResult* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult* This,__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_ClipboardHistoryItemsResult IID___FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult
#define IAsyncOperationCompletedHandler_ClipboardHistoryItemsResultVtbl __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResultVtbl
#define IAsyncOperationCompletedHandler_ClipboardHistoryItemsResult __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult
#define IAsyncOperationCompletedHandler_ClipboardHistoryItemsResult_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_QueryInterface
#define IAsyncOperationCompletedHandler_ClipboardHistoryItemsResult_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_AddRef
#define IAsyncOperationCompletedHandler_ClipboardHistoryItemsResult_Release __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_Release
#define IAsyncOperationCompletedHandler_ClipboardHistoryItemsResult_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage, 0xa93a3b99, 0xe946, 0x57ce, 0xaa,0xd9, 0xc2,0x3d,0x13,0x8c,0x35,0x3e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("a93a3b99-e946-57ce-aad9-c23d138c353e")
            IAsyncOperationCompletedHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*, ABI::Windows::ApplicationModel::DataTransfer::IDataPackage* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage, 0xa93a3b99, 0xe946, 0x57ce, 0xaa,0xd9, 0xc2,0x3d,0x13,0x8c,0x35,0x3e)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackageVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage *This,
        __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackageVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_Release(__FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage* This,__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_DataPackage IID___FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage
#define IAsyncOperationCompletedHandler_DataPackageVtbl __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackageVtbl
#define IAsyncOperationCompletedHandler_DataPackage __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage
#define IAsyncOperationCompletedHandler_DataPackage_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_QueryInterface
#define IAsyncOperationCompletedHandler_DataPackage_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_AddRef
#define IAsyncOperationCompletedHandler_DataPackage_Release __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_Release
#define IAsyncOperationCompletedHandler_DataPackage_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackageOperation > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_DataPackageOperation_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_DataPackageOperation_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_DataPackageOperation, 0xadd21d46, 0x17df, 0x5a43, 0xa6,0x85, 0x32,0x62,0xfc,0xe8,0x46,0x43);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("add21d46-17df-5a43-a685-3262fce84643")
            IAsyncOperationCompletedHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackageOperation > : IAsyncOperationCompletedHandler_impl<ABI::Windows::ApplicationModel::DataTransfer::DataPackageOperation >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_DataPackageOperation, 0xadd21d46, 0x17df, 0x5a43, 0xa6,0x85, 0x32,0x62,0xfc,0xe8,0x46,0x43)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_DataPackageOperationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackageOperation > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_DataPackageOperation *This,
        __FIAsyncOperation_1_DataPackageOperation *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_DataPackageOperationVtbl;

interface __FIAsyncOperationCompletedHandler_1_DataPackageOperation {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_DataPackageOperationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_DataPackageOperation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_DataPackageOperation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_DataPackageOperation_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackageOperation > methods ***/
#define __FIAsyncOperationCompletedHandler_1_DataPackageOperation_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_DataPackageOperation_QueryInterface(__FIAsyncOperationCompletedHandler_1_DataPackageOperation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_DataPackageOperation_AddRef(__FIAsyncOperationCompletedHandler_1_DataPackageOperation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_DataPackageOperation_Release(__FIAsyncOperationCompletedHandler_1_DataPackageOperation* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackageOperation > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_DataPackageOperation_Invoke(__FIAsyncOperationCompletedHandler_1_DataPackageOperation* This,__FIAsyncOperation_1_DataPackageOperation *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_DataPackageOperation IID___FIAsyncOperationCompletedHandler_1_DataPackageOperation
#define IAsyncOperationCompletedHandler_DataPackageOperationVtbl __FIAsyncOperationCompletedHandler_1_DataPackageOperationVtbl
#define IAsyncOperationCompletedHandler_DataPackageOperation __FIAsyncOperationCompletedHandler_1_DataPackageOperation
#define IAsyncOperationCompletedHandler_DataPackageOperation_QueryInterface __FIAsyncOperationCompletedHandler_1_DataPackageOperation_QueryInterface
#define IAsyncOperationCompletedHandler_DataPackageOperation_AddRef __FIAsyncOperationCompletedHandler_1_DataPackageOperation_AddRef
#define IAsyncOperationCompletedHandler_DataPackageOperation_Release __FIAsyncOperationCompletedHandler_1_DataPackageOperation_Release
#define IAsyncOperationCompletedHandler_DataPackageOperation_Invoke __FIAsyncOperationCompletedHandler_1_DataPackageOperation_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_DataPackageOperation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItemsResult* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult, 0x677b06b8, 0x0134, 0x5692, 0xb4,0x87, 0x4c,0x8e,0x24,0x08,0xca,0x01);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("677b06b8-0134-5692-b487-4c8e2408ca01")
            IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItemsResult* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItemsResult*, ABI::Windows::ApplicationModel::DataTransfer::IClipboardHistoryItemsResult* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult, 0x677b06b8, 0x0134, 0x5692, 0xb4,0x87, 0x4c,0x8e,0x24,0x08,0xca,0x01)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResultVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItemsResult* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResultVtbl;

interface __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult {
    CONST_VTBL __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItemsResult* > methods ***/
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_QueryInterface(__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_AddRef(__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_Release(__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_GetIids(__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_GetTrustLevel(__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::ClipboardHistoryItemsResult* > methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_put_Completed(__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult* This,__FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_get_Completed(__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult* This,__FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_GetResults(__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIClipboardHistoryItemsResult **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_ClipboardHistoryItemsResult IID___FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult
#define IAsyncOperation_ClipboardHistoryItemsResultVtbl __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResultVtbl
#define IAsyncOperation_ClipboardHistoryItemsResult __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult
#define IAsyncOperation_ClipboardHistoryItemsResult_QueryInterface __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_QueryInterface
#define IAsyncOperation_ClipboardHistoryItemsResult_AddRef __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_AddRef
#define IAsyncOperation_ClipboardHistoryItemsResult_Release __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_Release
#define IAsyncOperation_ClipboardHistoryItemsResult_GetIids __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_GetIids
#define IAsyncOperation_ClipboardHistoryItemsResult_GetRuntimeClassName __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_GetRuntimeClassName
#define IAsyncOperation_ClipboardHistoryItemsResult_GetTrustLevel __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_GetTrustLevel
#define IAsyncOperation_ClipboardHistoryItemsResult_put_Completed __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_put_Completed
#define IAsyncOperation_ClipboardHistoryItemsResult_get_Completed __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_get_Completed
#define IAsyncOperation_ClipboardHistoryItemsResult_GetResults __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CClipboardHistoryItemsResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::DataPackage* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage, 0xa16f2d07, 0xead3, 0x53e4, 0x94,0x90, 0x75,0xbd,0xba,0xeb,0x7a,0x5b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("a16f2d07-ead3-53e4-9490-75bdbaeb7a5b")
            IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::DataPackage* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*, ABI::Windows::ApplicationModel::DataTransfer::IDataPackage* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage, 0xa16f2d07, 0xead3, 0x53e4, 0x94,0x90, 0x75,0xbd,0xba,0xeb,0x7a,0x5b)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackageVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::DataPackage* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackageVtbl;

interface __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage {
    CONST_VTBL __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::DataPackage* > methods ***/
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_QueryInterface(__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_AddRef(__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_Release(__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_GetIids(__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_GetTrustLevel(__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::DataPackage* > methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_put_Completed(__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage* This,__FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_get_Completed(__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage* This,__FIAsyncOperationCompletedHandler_1_Windows__CApplicationModel__CDataTransfer__CDataPackage **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_GetResults(__FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_DataPackage IID___FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage
#define IAsyncOperation_DataPackageVtbl __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackageVtbl
#define IAsyncOperation_DataPackage __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage
#define IAsyncOperation_DataPackage_QueryInterface __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_QueryInterface
#define IAsyncOperation_DataPackage_AddRef __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_AddRef
#define IAsyncOperation_DataPackage_Release __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_Release
#define IAsyncOperation_DataPackage_GetIids __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_GetIids
#define IAsyncOperation_DataPackage_GetRuntimeClassName __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_GetRuntimeClassName
#define IAsyncOperation_DataPackage_GetTrustLevel __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_GetTrustLevel
#define IAsyncOperation_DataPackage_put_Completed __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_put_Completed
#define IAsyncOperation_DataPackage_get_Completed __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_get_Completed
#define IAsyncOperation_DataPackage_GetResults __FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CApplicationModel__CDataTransfer__CDataPackage_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::DataPackageOperation > interface
 */
#ifndef ____FIAsyncOperation_1_DataPackageOperation_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_DataPackageOperation_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_DataPackageOperation, 0x8b98aea9, 0x64f0, 0x5672, 0xb3,0x0e, 0xdf,0xd9,0xc2,0xe4,0xf6,0xfe);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("8b98aea9-64f0-5672-b30e-dfd9c2e4f6fe")
            IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::DataPackageOperation > : IAsyncOperation_impl<ABI::Windows::ApplicationModel::DataTransfer::DataPackageOperation >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_DataPackageOperation, 0x8b98aea9, 0x64f0, 0x5672, 0xb3,0x0e, 0xdf,0xd9,0xc2,0xe4,0xf6,0xfe)
#endif
#else
typedef struct __FIAsyncOperation_1_DataPackageOperationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1_DataPackageOperation *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1_DataPackageOperation *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1_DataPackageOperation *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::DataPackageOperation > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_DataPackageOperation *This,
        __FIAsyncOperationCompletedHandler_1_DataPackageOperation *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_DataPackageOperation *This,
        __FIAsyncOperationCompletedHandler_1_DataPackageOperation **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_DataPackageOperation *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageOperation *results);

    END_INTERFACE
} __FIAsyncOperation_1_DataPackageOperationVtbl;

interface __FIAsyncOperation_1_DataPackageOperation {
    CONST_VTBL __FIAsyncOperation_1_DataPackageOperationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_DataPackageOperation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_DataPackageOperation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_DataPackageOperation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_DataPackageOperation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_DataPackageOperation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_DataPackageOperation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::DataPackageOperation > methods ***/
#define __FIAsyncOperation_1_DataPackageOperation_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_DataPackageOperation_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_DataPackageOperation_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_DataPackageOperation_QueryInterface(__FIAsyncOperation_1_DataPackageOperation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_DataPackageOperation_AddRef(__FIAsyncOperation_1_DataPackageOperation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_DataPackageOperation_Release(__FIAsyncOperation_1_DataPackageOperation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_DataPackageOperation_GetIids(__FIAsyncOperation_1_DataPackageOperation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_DataPackageOperation_GetRuntimeClassName(__FIAsyncOperation_1_DataPackageOperation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_DataPackageOperation_GetTrustLevel(__FIAsyncOperation_1_DataPackageOperation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::ApplicationModel::DataTransfer::DataPackageOperation > methods ***/
static inline HRESULT __FIAsyncOperation_1_DataPackageOperation_put_Completed(__FIAsyncOperation_1_DataPackageOperation* This,__FIAsyncOperationCompletedHandler_1_DataPackageOperation *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_DataPackageOperation_get_Completed(__FIAsyncOperation_1_DataPackageOperation* This,__FIAsyncOperationCompletedHandler_1_DataPackageOperation **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_DataPackageOperation_GetResults(__FIAsyncOperation_1_DataPackageOperation* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageOperation *results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_DataPackageOperation IID___FIAsyncOperation_1_DataPackageOperation
#define IAsyncOperation_DataPackageOperationVtbl __FIAsyncOperation_1_DataPackageOperationVtbl
#define IAsyncOperation_DataPackageOperation __FIAsyncOperation_1_DataPackageOperation
#define IAsyncOperation_DataPackageOperation_QueryInterface __FIAsyncOperation_1_DataPackageOperation_QueryInterface
#define IAsyncOperation_DataPackageOperation_AddRef __FIAsyncOperation_1_DataPackageOperation_AddRef
#define IAsyncOperation_DataPackageOperation_Release __FIAsyncOperation_1_DataPackageOperation_Release
#define IAsyncOperation_DataPackageOperation_GetIids __FIAsyncOperation_1_DataPackageOperation_GetIids
#define IAsyncOperation_DataPackageOperation_GetRuntimeClassName __FIAsyncOperation_1_DataPackageOperation_GetRuntimeClassName
#define IAsyncOperation_DataPackageOperation_GetTrustLevel __FIAsyncOperation_1_DataPackageOperation_GetTrustLevel
#define IAsyncOperation_DataPackageOperation_put_Completed __FIAsyncOperation_1_DataPackageOperation_put_Completed
#define IAsyncOperation_DataPackageOperation_get_Completed __FIAsyncOperation_1_DataPackageOperation_get_Completed
#define IAsyncOperation_DataPackageOperation_GetResults __FIAsyncOperation_1_DataPackageOperation_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_DataPackageOperation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,IInspectable* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable, 0xc156b0c3, 0x1cbc, 0x5ca4, 0x90,0x1c, 0x62,0xc5,0xa8,0xca,0x5c,0xb5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("c156b0c3-1cbc-5ca4-901c-62c5a8ca5cb5")
            ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,IInspectable* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*, ABI::Windows::ApplicationModel::DataTransfer::IDataPackage* >, IInspectable* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable, 0xc156b0c3, 0x1cbc, 0x5ca4, 0x90,0x1c, 0x62,0xc5,0xa8,0xca,0x5c,0xb5)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *sender,
        IInspectable *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectableVtbl;

interface __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable {
    CONST_VTBL __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,IInspectable* > methods ***/
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable_QueryInterface(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable_AddRef(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable_Release(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,IInspectable* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable_Invoke(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *sender,IInspectable *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_DataPackage_IInspectable IID___FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable
#define ITypedEventHandler_DataPackage_IInspectableVtbl __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectableVtbl
#define ITypedEventHandler_DataPackage_IInspectable __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable
#define ITypedEventHandler_DataPackage_IInspectable_QueryInterface __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable_QueryInterface
#define ITypedEventHandler_DataPackage_IInspectable_AddRef __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable_AddRef
#define ITypedEventHandler_DataPackage_IInspectable_Release __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable_Release
#define ITypedEventHandler_DataPackage_IInspectable_Invoke __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,ABI::Windows::ApplicationModel::DataTransfer::OperationCompletedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs, 0xdd48af6c, 0xef9a, 0x59cb, 0xb3,0x26, 0x57,0xd9,0xe2,0x41,0x1f,0x21);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("dd48af6c-ef9a-59cb-b326-57d9e2411f21")
            ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,ABI::Windows::ApplicationModel::DataTransfer::OperationCompletedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*, ABI::Windows::ApplicationModel::DataTransfer::IDataPackage* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::OperationCompletedEventArgs*, ABI::Windows::ApplicationModel::DataTransfer::IOperationCompletedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs, 0xdd48af6c, 0xef9a, 0x59cb, 0xb3,0x26, 0x57,0xd9,0xe2,0x41,0x1f,0x21)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,ABI::Windows::ApplicationModel::DataTransfer::OperationCompletedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *sender,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,ABI::Windows::ApplicationModel::DataTransfer::OperationCompletedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs_Release(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,ABI::Windows::ApplicationModel::DataTransfer::OperationCompletedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *sender,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIOperationCompletedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_DataPackage_OperationCompletedEventArgs IID___FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs
#define ITypedEventHandler_DataPackage_OperationCompletedEventArgsVtbl __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgsVtbl
#define ITypedEventHandler_DataPackage_OperationCompletedEventArgs __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs
#define ITypedEventHandler_DataPackage_OperationCompletedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs_QueryInterface
#define ITypedEventHandler_DataPackage_OperationCompletedEventArgs_AddRef __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs_AddRef
#define ITypedEventHandler_DataPackage_OperationCompletedEventArgs_Release __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs_Release
#define ITypedEventHandler_DataPackage_OperationCompletedEventArgs_Invoke __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__COperationCompletedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,ABI::Windows::ApplicationModel::DataTransfer::ShareCompletedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs, 0xf8f7e24a, 0x56fe, 0x58df, 0xbc,0x15, 0x23,0x65,0xae,0xc0,0x39,0x66);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("f8f7e24a-56fe-58df-bc15-2365aec03966")
            ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,ABI::Windows::ApplicationModel::DataTransfer::ShareCompletedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*, ABI::Windows::ApplicationModel::DataTransfer::IDataPackage* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::ShareCompletedEventArgs*, ABI::Windows::ApplicationModel::DataTransfer::IShareCompletedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs, 0xf8f7e24a, 0x56fe, 0x58df, 0xbc,0x15, 0x23,0x65,0xae,0xc0,0x39,0x66)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,ABI::Windows::ApplicationModel::DataTransfer::ShareCompletedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *sender,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,ABI::Windows::ApplicationModel::DataTransfer::ShareCompletedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs_Release(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataPackage*,ABI::Windows::ApplicationModel::DataTransfer::ShareCompletedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataPackage *sender,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareCompletedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_DataPackage_ShareCompletedEventArgs IID___FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs
#define ITypedEventHandler_DataPackage_ShareCompletedEventArgsVtbl __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgsVtbl
#define ITypedEventHandler_DataPackage_ShareCompletedEventArgs __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs
#define ITypedEventHandler_DataPackage_ShareCompletedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs_QueryInterface
#define ITypedEventHandler_DataPackage_ShareCompletedEventArgs_AddRef __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs_AddRef
#define ITypedEventHandler_DataPackage_ShareCompletedEventArgs_Release __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs_Release
#define ITypedEventHandler_DataPackage_ShareCompletedEventArgs_Invoke __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataPackage_Windows__CApplicationModel__CDataTransfer__CShareCompletedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*,ABI::Windows::ApplicationModel::DataTransfer::DataRequestedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs, 0xec6f9cc8, 0x46d0, 0x5e0e, 0xb4,0xd2, 0x7d,0x77,0x73,0xae,0x37,0xa0);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("ec6f9cc8-46d0-5e0e-b4d2-7d7773ae37a0")
            ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*,ABI::Windows::ApplicationModel::DataTransfer::DataRequestedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*, ABI::Windows::ApplicationModel::DataTransfer::IDataTransferManager* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::DataRequestedEventArgs*, ABI::Windows::ApplicationModel::DataTransfer::IDataRequestedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs, 0xec6f9cc8, 0x46d0, 0x5e0e, 0xb4,0xd2, 0x7d,0x77,0x73,0xae,0x37,0xa0)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*,ABI::Windows::ApplicationModel::DataTransfer::DataRequestedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager *sender,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*,ABI::Windows::ApplicationModel::DataTransfer::DataRequestedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs_Release(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*,ABI::Windows::ApplicationModel::DataTransfer::DataRequestedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager *sender,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataRequestedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_DataTransferManager_DataRequestedEventArgs IID___FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs
#define ITypedEventHandler_DataTransferManager_DataRequestedEventArgsVtbl __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgsVtbl
#define ITypedEventHandler_DataTransferManager_DataRequestedEventArgs __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs
#define ITypedEventHandler_DataTransferManager_DataRequestedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs_QueryInterface
#define ITypedEventHandler_DataTransferManager_DataRequestedEventArgs_AddRef __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs_AddRef
#define ITypedEventHandler_DataTransferManager_DataRequestedEventArgs_Release __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs_Release
#define ITypedEventHandler_DataTransferManager_DataRequestedEventArgs_Invoke __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CDataRequestedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*,ABI::Windows::ApplicationModel::DataTransfer::ShareProvidersRequestedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs, 0x147e2860, 0x7397, 0x582f, 0x80,0xdb, 0xb8,0x68,0x53,0x83,0xa9,0x37);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("147e2860-7397-582f-80db-b8685383a937")
            ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*,ABI::Windows::ApplicationModel::DataTransfer::ShareProvidersRequestedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*, ABI::Windows::ApplicationModel::DataTransfer::IDataTransferManager* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::ShareProvidersRequestedEventArgs*, ABI::Windows::ApplicationModel::DataTransfer::IShareProvidersRequestedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs, 0x147e2860, 0x7397, 0x582f, 0x80,0xdb, 0xb8,0x68,0x53,0x83,0xa9,0x37)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*,ABI::Windows::ApplicationModel::DataTransfer::ShareProvidersRequestedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager *sender,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*,ABI::Windows::ApplicationModel::DataTransfer::ShareProvidersRequestedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs_Release(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*,ABI::Windows::ApplicationModel::DataTransfer::ShareProvidersRequestedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager *sender,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIShareProvidersRequestedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_DataTransferManager_ShareProvidersRequestedEventArgs IID___FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs
#define ITypedEventHandler_DataTransferManager_ShareProvidersRequestedEventArgsVtbl __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgsVtbl
#define ITypedEventHandler_DataTransferManager_ShareProvidersRequestedEventArgs __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs
#define ITypedEventHandler_DataTransferManager_ShareProvidersRequestedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs_QueryInterface
#define ITypedEventHandler_DataTransferManager_ShareProvidersRequestedEventArgs_AddRef __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs_AddRef
#define ITypedEventHandler_DataTransferManager_ShareProvidersRequestedEventArgs_Release __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs_Release
#define ITypedEventHandler_DataTransferManager_ShareProvidersRequestedEventArgs_Invoke __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CShareProvidersRequestedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*,ABI::Windows::ApplicationModel::DataTransfer::TargetApplicationChosenEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs, 0xc4ac1ba2, 0x7851, 0x5a44, 0xbc,0x8d, 0x3d,0x7c,0x71,0x3f,0x1f,0x41);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("c4ac1ba2-7851-5a44-bc8d-3d7c713f1f41")
            ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*,ABI::Windows::ApplicationModel::DataTransfer::TargetApplicationChosenEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*, ABI::Windows::ApplicationModel::DataTransfer::IDataTransferManager* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::ApplicationModel::DataTransfer::TargetApplicationChosenEventArgs*, ABI::Windows::ApplicationModel::DataTransfer::ITargetApplicationChosenEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs, 0xc4ac1ba2, 0x7851, 0x5a44, 0xbc,0x8d, 0x3d,0x7c,0x71,0x3f,0x1f,0x41)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*,ABI::Windows::ApplicationModel::DataTransfer::TargetApplicationChosenEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs *This,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager *sender,
        __x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*,ABI::Windows::ApplicationModel::DataTransfer::TargetApplicationChosenEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs_AddRef(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs_Release(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::ApplicationModel::DataTransfer::DataTransferManager*,ABI::Windows::ApplicationModel::DataTransfer::TargetApplicationChosenEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs_Invoke(__FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs* This,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CIDataTransferManager *sender,__x_ABI_CWindows_CApplicationModel_CDataTransfer_CITargetApplicationChosenEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_DataTransferManager_TargetApplicationChosenEventArgs IID___FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs
#define ITypedEventHandler_DataTransferManager_TargetApplicationChosenEventArgsVtbl __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgsVtbl
#define ITypedEventHandler_DataTransferManager_TargetApplicationChosenEventArgs __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs
#define ITypedEventHandler_DataTransferManager_TargetApplicationChosenEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs_QueryInterface
#define ITypedEventHandler_DataTransferManager_TargetApplicationChosenEventArgs_AddRef __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs_AddRef
#define ITypedEventHandler_DataTransferManager_TargetApplicationChosenEventArgs_Release __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs_Release
#define ITypedEventHandler_DataTransferManager_TargetApplicationChosenEventArgs_Invoke __FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CApplicationModel__CDataTransfer__CDataTransferManager_Windows__CApplicationModel__CDataTransfer__CTargetApplicationChosenEventArgs_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER HSTRING_UserSize     (ULONG *, ULONG, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserMarshal  (ULONG *, unsigned char *, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
void            __RPC_USER HSTRING_UserFree     (ULONG *, HSTRING *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_applicationmodel_datatransfer_h__ */
