/*** Autogenerated by WIDL 11.6 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 ____FIKeyValuePair_2_HSTRING_IInspectable_FWD_DEFINED__
#define ____FIKeyValuePair_2_HSTRING_IInspectable_FWD_DEFINED__
typedef interface __FIKeyValuePair_2_HSTRING_IInspectable __FIKeyValuePair_2_HSTRING_IInspectable;
#ifdef __cplusplus
#define __FIKeyValuePair_2_HSTRING_IInspectable ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIMap_2_HSTRING_IInspectable_FWD_DEFINED__
#define ____FIMap_2_HSTRING_IInspectable_FWD_DEFINED__
typedef interface __FIMap_2_HSTRING_IInspectable __FIMap_2_HSTRING_IInspectable;
#ifdef __cplusplus
#define __FIMap_2_HSTRING_IInspectable ABI::Windows::Foundation::Collections::IMap<HSTRING,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIMapView_2_HSTRING_IInspectable_FWD_DEFINED__
#define ____FIMapView_2_HSTRING_IInspectable_FWD_DEFINED__
typedef interface __FIMapView_2_HSTRING_IInspectable __FIMapView_2_HSTRING_IInspectable;
#ifdef __cplusplus
#define __FIMapView_2_HSTRING_IInspectable ABI::Windows::Foundation::Collections::IMapView<HSTRING,IInspectable* >
#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 ____FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_FWD_DEFINED__
#define ____FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_FWD_DEFINED__
typedef interface __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable;
#ifdef __cplusplus
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* >
#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

#if !defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)
#define WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION 0xe0000
#endif // defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryItemsResultStatus_ENUM_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryItemsResultStatus_ENUM_DEFINED__
#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 /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryItemsResultStatus_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryItemsResultStatus __x_ABI_CWindows_CApplicationModel_CDataTransfer_CClipboardHistoryItemsResultStatus;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageOperation_ENUM_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageOperation_ENUM_DEFINED__
#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 /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageOperation_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageOperation __x_ABI_CWindows_CApplicationModel_CDataTransfer_CDataPackageOperation;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CSetHistoryItemAsContentStatus_ENUM_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CSetHistoryItemAsContentStatus_ENUM_DEFINED__
#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 /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CSetHistoryItemAsContentStatus_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CApplicationModel_CDataTransfer_CSetHistoryItemAsContentStatus __x_ABI_CWindows_CApplicationModel_CDataTransfer_CSetHistoryItemAsContentStatus;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
#ifndef ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareUITheme_ENUM_DEFINED__
#define ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareUITheme_ENUM_DEFINED__
#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 /* ____x_ABI_CWindows_CApplicationModel_CDataTransfer_CShareUITheme_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */
#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 ____FIKeyValuePair_2_HSTRING_IInspectable_FWD_DEFINED__
#define ____FIKeyValuePair_2_HSTRING_IInspectable_FWD_DEFINED__
typedef interface __FIKeyValuePair_2_HSTRING_IInspectable __FIKeyValuePair_2_HSTRING_IInspectable;
#ifdef __cplusplus
#define __FIKeyValuePair_2_HSTRING_IInspectable ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIMap_2_HSTRING_IInspectable_FWD_DEFINED__
#define ____FIMap_2_HSTRING_IInspectable_FWD_DEFINED__
typedef interface __FIMap_2_HSTRING_IInspectable __FIMap_2_HSTRING_IInspectable;
#ifdef __cplusplus
#define __FIMap_2_HSTRING_IInspectable ABI::Windows::Foundation::Collections::IMap<HSTRING,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIMapView_2_HSTRING_IInspectable_FWD_DEFINED__
#define ____FIMapView_2_HSTRING_IInspectable_FWD_DEFINED__
typedef interface __FIMapView_2_HSTRING_IInspectable __FIMapView_2_HSTRING_IInspectable;
#ifdef __cplusplus
#define __FIMapView_2_HSTRING_IInspectable ABI::Windows::Foundation::Collections::IMapView<HSTRING,IInspectable* >
#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 ____FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_FWD_DEFINED__
#define ____FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_FWD_DEFINED__
typedef interface __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable;
#ifdef __cplusplus
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* >
#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

/*****************************************************************************
 * 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 */

/*****************************************************************************
 * IKeyValuePair<HSTRING,IInspectable* > interface
 */
#ifndef ____FIKeyValuePair_2_HSTRING_IInspectable_INTERFACE_DEFINED__
#define ____FIKeyValuePair_2_HSTRING_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIKeyValuePair_2_HSTRING_IInspectable, 0x09335560, 0x6c6b, 0x5a26, 0x93,0x48, 0x97,0xb7,0x81,0x13,0x2b,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("09335560-6c6b-5a26-9348-97b781132b20")
                IKeyValuePair<HSTRING,IInspectable* > : IKeyValuePair_impl<HSTRING, IInspectable* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIKeyValuePair_2_HSTRING_IInspectable, 0x09335560, 0x6c6b, 0x5a26, 0x93,0x48, 0x97,0xb7,0x81,0x13,0x2b,0x20)
#endif
#else
typedef struct __FIKeyValuePair_2_HSTRING_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IKeyValuePair<HSTRING,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Key)(
        __FIKeyValuePair_2_HSTRING_IInspectable *This,
        HSTRING *key);

    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __FIKeyValuePair_2_HSTRING_IInspectable *This,
        IInspectable **value);

    END_INTERFACE
} __FIKeyValuePair_2_HSTRING_IInspectableVtbl;

interface __FIKeyValuePair_2_HSTRING_IInspectable {
    CONST_VTBL __FIKeyValuePair_2_HSTRING_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIKeyValuePair_2_HSTRING_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIKeyValuePair_2_HSTRING_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIKeyValuePair_2_HSTRING_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIKeyValuePair_2_HSTRING_IInspectable_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIKeyValuePair_2_HSTRING_IInspectable_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIKeyValuePair_2_HSTRING_IInspectable_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IKeyValuePair<HSTRING,IInspectable* > methods ***/
#define __FIKeyValuePair_2_HSTRING_IInspectable_get_Key(This,key) (This)->lpVtbl->get_Key(This,key)
#define __FIKeyValuePair_2_HSTRING_IInspectable_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIKeyValuePair_2_HSTRING_IInspectable_QueryInterface(__FIKeyValuePair_2_HSTRING_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIKeyValuePair_2_HSTRING_IInspectable_AddRef(__FIKeyValuePair_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIKeyValuePair_2_HSTRING_IInspectable_Release(__FIKeyValuePair_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIKeyValuePair_2_HSTRING_IInspectable_GetIids(__FIKeyValuePair_2_HSTRING_IInspectable* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIKeyValuePair_2_HSTRING_IInspectable_GetRuntimeClassName(__FIKeyValuePair_2_HSTRING_IInspectable* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIKeyValuePair_2_HSTRING_IInspectable_GetTrustLevel(__FIKeyValuePair_2_HSTRING_IInspectable* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IKeyValuePair<HSTRING,IInspectable* > methods ***/
static inline HRESULT __FIKeyValuePair_2_HSTRING_IInspectable_get_Key(__FIKeyValuePair_2_HSTRING_IInspectable* This,HSTRING *key) {
    return This->lpVtbl->get_Key(This,key);
}
static inline HRESULT __FIKeyValuePair_2_HSTRING_IInspectable_get_Value(__FIKeyValuePair_2_HSTRING_IInspectable* This,IInspectable **value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IKeyValuePair_HSTRING_IInspectable IID___FIKeyValuePair_2_HSTRING_IInspectable
#define IKeyValuePair_HSTRING_IInspectableVtbl __FIKeyValuePair_2_HSTRING_IInspectableVtbl
#define IKeyValuePair_HSTRING_IInspectable __FIKeyValuePair_2_HSTRING_IInspectable
#define IKeyValuePair_HSTRING_IInspectable_QueryInterface __FIKeyValuePair_2_HSTRING_IInspectable_QueryInterface
#define IKeyValuePair_HSTRING_IInspectable_AddRef __FIKeyValuePair_2_HSTRING_IInspectable_AddRef
#define IKeyValuePair_HSTRING_IInspectable_Release __FIKeyValuePair_2_HSTRING_IInspectable_Release
#define IKeyValuePair_HSTRING_IInspectable_GetIids __FIKeyValuePair_2_HSTRING_IInspectable_GetIids
#define IKeyValuePair_HSTRING_IInspectable_GetRuntimeClassName __FIKeyValuePair_2_HSTRING_IInspectable_GetRuntimeClassName
#define IKeyValuePair_HSTRING_IInspectable_GetTrustLevel __FIKeyValuePair_2_HSTRING_IInspectable_GetTrustLevel
#define IKeyValuePair_HSTRING_IInspectable_get_Key __FIKeyValuePair_2_HSTRING_IInspectable_get_Key
#define IKeyValuePair_HSTRING_IInspectable_get_Value __FIKeyValuePair_2_HSTRING_IInspectable_get_Value
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIKeyValuePair_2_HSTRING_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMap<HSTRING,IInspectable* > interface
 */
#ifndef ____FIMap_2_HSTRING_IInspectable_INTERFACE_DEFINED__
#define ____FIMap_2_HSTRING_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIMap_2_HSTRING_IInspectable, 0x1b0d3570, 0x0877, 0x5ec2, 0x8a,0x2c, 0x3b,0x95,0x39,0x50,0x6a,0xca);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("1b0d3570-0877-5ec2-8a2c-3b9539506aca")
                IMap<HSTRING,IInspectable* > : IMap_impl<HSTRING, IInspectable* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIMap_2_HSTRING_IInspectable, 0x1b0d3570, 0x0877, 0x5ec2, 0x8a,0x2c, 0x3b,0x95,0x39,0x50,0x6a,0xca)
#endif
#else
typedef struct __FIMap_2_HSTRING_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IMap<HSTRING,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Lookup)(
        __FIMap_2_HSTRING_IInspectable *This,
        HSTRING key,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIMap_2_HSTRING_IInspectable *This,
        unsigned int *size);

    HRESULT (STDMETHODCALLTYPE *HasKey)(
        __FIMap_2_HSTRING_IInspectable *This,
        HSTRING key,
        boolean *found);

    HRESULT (STDMETHODCALLTYPE *GetView)(
        __FIMap_2_HSTRING_IInspectable *This,
        __FIMapView_2_HSTRING_IInspectable **view);

    HRESULT (STDMETHODCALLTYPE *Insert)(
        __FIMap_2_HSTRING_IInspectable *This,
        HSTRING key,
        IInspectable *value,
        boolean *replaced);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        __FIMap_2_HSTRING_IInspectable *This,
        HSTRING key);

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

    END_INTERFACE
} __FIMap_2_HSTRING_IInspectableVtbl;

interface __FIMap_2_HSTRING_IInspectable {
    CONST_VTBL __FIMap_2_HSTRING_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIMap_2_HSTRING_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIMap_2_HSTRING_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIMap_2_HSTRING_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIMap_2_HSTRING_IInspectable_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIMap_2_HSTRING_IInspectable_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIMap_2_HSTRING_IInspectable_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMap<HSTRING,IInspectable* > methods ***/
#define __FIMap_2_HSTRING_IInspectable_Lookup(This,key,value) (This)->lpVtbl->Lookup(This,key,value)
#define __FIMap_2_HSTRING_IInspectable_get_Size(This,size) (This)->lpVtbl->get_Size(This,size)
#define __FIMap_2_HSTRING_IInspectable_HasKey(This,key,found) (This)->lpVtbl->HasKey(This,key,found)
#define __FIMap_2_HSTRING_IInspectable_GetView(This,view) (This)->lpVtbl->GetView(This,view)
#define __FIMap_2_HSTRING_IInspectable_Insert(This,key,value,replaced) (This)->lpVtbl->Insert(This,key,value,replaced)
#define __FIMap_2_HSTRING_IInspectable_Remove(This,key) (This)->lpVtbl->Remove(This,key)
#define __FIMap_2_HSTRING_IInspectable_Clear(This) (This)->lpVtbl->Clear(This)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIMap_2_HSTRING_IInspectable_QueryInterface(__FIMap_2_HSTRING_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIMap_2_HSTRING_IInspectable_AddRef(__FIMap_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIMap_2_HSTRING_IInspectable_Release(__FIMap_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIMap_2_HSTRING_IInspectable_GetIids(__FIMap_2_HSTRING_IInspectable* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIMap_2_HSTRING_IInspectable_GetRuntimeClassName(__FIMap_2_HSTRING_IInspectable* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIMap_2_HSTRING_IInspectable_GetTrustLevel(__FIMap_2_HSTRING_IInspectable* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMap<HSTRING,IInspectable* > methods ***/
static inline HRESULT __FIMap_2_HSTRING_IInspectable_Lookup(__FIMap_2_HSTRING_IInspectable* This,HSTRING key,IInspectable **value) {
    return This->lpVtbl->Lookup(This,key,value);
}
static inline HRESULT __FIMap_2_HSTRING_IInspectable_get_Size(__FIMap_2_HSTRING_IInspectable* This,unsigned int *size) {
    return This->lpVtbl->get_Size(This,size);
}
static inline HRESULT __FIMap_2_HSTRING_IInspectable_HasKey(__FIMap_2_HSTRING_IInspectable* This,HSTRING key,boolean *found) {
    return This->lpVtbl->HasKey(This,key,found);
}
static inline HRESULT __FIMap_2_HSTRING_IInspectable_GetView(__FIMap_2_HSTRING_IInspectable* This,__FIMapView_2_HSTRING_IInspectable **view) {
    return This->lpVtbl->GetView(This,view);
}
static inline HRESULT __FIMap_2_HSTRING_IInspectable_Insert(__FIMap_2_HSTRING_IInspectable* This,HSTRING key,IInspectable *value,boolean *replaced) {
    return This->lpVtbl->Insert(This,key,value,replaced);
}
static inline HRESULT __FIMap_2_HSTRING_IInspectable_Remove(__FIMap_2_HSTRING_IInspectable* This,HSTRING key) {
    return This->lpVtbl->Remove(This,key);
}
static inline HRESULT __FIMap_2_HSTRING_IInspectable_Clear(__FIMap_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->Clear(This);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IMap_HSTRING_IInspectable IID___FIMap_2_HSTRING_IInspectable
#define IMap_HSTRING_IInspectableVtbl __FIMap_2_HSTRING_IInspectableVtbl
#define IMap_HSTRING_IInspectable __FIMap_2_HSTRING_IInspectable
#define IMap_HSTRING_IInspectable_QueryInterface __FIMap_2_HSTRING_IInspectable_QueryInterface
#define IMap_HSTRING_IInspectable_AddRef __FIMap_2_HSTRING_IInspectable_AddRef
#define IMap_HSTRING_IInspectable_Release __FIMap_2_HSTRING_IInspectable_Release
#define IMap_HSTRING_IInspectable_GetIids __FIMap_2_HSTRING_IInspectable_GetIids
#define IMap_HSTRING_IInspectable_GetRuntimeClassName __FIMap_2_HSTRING_IInspectable_GetRuntimeClassName
#define IMap_HSTRING_IInspectable_GetTrustLevel __FIMap_2_HSTRING_IInspectable_GetTrustLevel
#define IMap_HSTRING_IInspectable_Lookup __FIMap_2_HSTRING_IInspectable_Lookup
#define IMap_HSTRING_IInspectable_get_Size __FIMap_2_HSTRING_IInspectable_get_Size
#define IMap_HSTRING_IInspectable_HasKey __FIMap_2_HSTRING_IInspectable_HasKey
#define IMap_HSTRING_IInspectable_GetView __FIMap_2_HSTRING_IInspectable_GetView
#define IMap_HSTRING_IInspectable_Insert __FIMap_2_HSTRING_IInspectable_Insert
#define IMap_HSTRING_IInspectable_Remove __FIMap_2_HSTRING_IInspectable_Remove
#define IMap_HSTRING_IInspectable_Clear __FIMap_2_HSTRING_IInspectable_Clear
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIMap_2_HSTRING_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMapView<HSTRING,IInspectable* > interface
 */
#ifndef ____FIMapView_2_HSTRING_IInspectable_INTERFACE_DEFINED__
#define ____FIMapView_2_HSTRING_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIMapView_2_HSTRING_IInspectable, 0xbb78502a, 0xf79d, 0x54fa, 0x92,0xc9, 0x90,0xc5,0x03,0x9f,0xdf,0x7e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("bb78502a-f79d-54fa-92c9-90c5039fdf7e")
                IMapView<HSTRING,IInspectable* > : IMapView_impl<HSTRING, IInspectable* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIMapView_2_HSTRING_IInspectable, 0xbb78502a, 0xf79d, 0x54fa, 0x92,0xc9, 0x90,0xc5,0x03,0x9f,0xdf,0x7e)
#endif
#else
typedef struct __FIMapView_2_HSTRING_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IMapView<HSTRING,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Lookup)(
        __FIMapView_2_HSTRING_IInspectable *This,
        HSTRING key,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIMapView_2_HSTRING_IInspectable *This,
        unsigned int *size);

    HRESULT (STDMETHODCALLTYPE *HasKey)(
        __FIMapView_2_HSTRING_IInspectable *This,
        HSTRING key,
        boolean *found);

    HRESULT (STDMETHODCALLTYPE *Split)(
        __FIMapView_2_HSTRING_IInspectable *This,
        __FIMapView_2_HSTRING_IInspectable **first,
        __FIMapView_2_HSTRING_IInspectable **second);

    END_INTERFACE
} __FIMapView_2_HSTRING_IInspectableVtbl;

interface __FIMapView_2_HSTRING_IInspectable {
    CONST_VTBL __FIMapView_2_HSTRING_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIMapView_2_HSTRING_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIMapView_2_HSTRING_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIMapView_2_HSTRING_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIMapView_2_HSTRING_IInspectable_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIMapView_2_HSTRING_IInspectable_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIMapView_2_HSTRING_IInspectable_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMapView<HSTRING,IInspectable* > methods ***/
#define __FIMapView_2_HSTRING_IInspectable_Lookup(This,key,value) (This)->lpVtbl->Lookup(This,key,value)
#define __FIMapView_2_HSTRING_IInspectable_get_Size(This,size) (This)->lpVtbl->get_Size(This,size)
#define __FIMapView_2_HSTRING_IInspectable_HasKey(This,key,found) (This)->lpVtbl->HasKey(This,key,found)
#define __FIMapView_2_HSTRING_IInspectable_Split(This,first,second) (This)->lpVtbl->Split(This,first,second)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIMapView_2_HSTRING_IInspectable_QueryInterface(__FIMapView_2_HSTRING_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIMapView_2_HSTRING_IInspectable_AddRef(__FIMapView_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIMapView_2_HSTRING_IInspectable_Release(__FIMapView_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIMapView_2_HSTRING_IInspectable_GetIids(__FIMapView_2_HSTRING_IInspectable* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIMapView_2_HSTRING_IInspectable_GetRuntimeClassName(__FIMapView_2_HSTRING_IInspectable* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIMapView_2_HSTRING_IInspectable_GetTrustLevel(__FIMapView_2_HSTRING_IInspectable* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMapView<HSTRING,IInspectable* > methods ***/
static inline HRESULT __FIMapView_2_HSTRING_IInspectable_Lookup(__FIMapView_2_HSTRING_IInspectable* This,HSTRING key,IInspectable **value) {
    return This->lpVtbl->Lookup(This,key,value);
}
static inline HRESULT __FIMapView_2_HSTRING_IInspectable_get_Size(__FIMapView_2_HSTRING_IInspectable* This,unsigned int *size) {
    return This->lpVtbl->get_Size(This,size);
}
static inline HRESULT __FIMapView_2_HSTRING_IInspectable_HasKey(__FIMapView_2_HSTRING_IInspectable* This,HSTRING key,boolean *found) {
    return This->lpVtbl->HasKey(This,key,found);
}
static inline HRESULT __FIMapView_2_HSTRING_IInspectable_Split(__FIMapView_2_HSTRING_IInspectable* This,__FIMapView_2_HSTRING_IInspectable **first,__FIMapView_2_HSTRING_IInspectable **second) {
    return This->lpVtbl->Split(This,first,second);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IMapView_HSTRING_IInspectable IID___FIMapView_2_HSTRING_IInspectable
#define IMapView_HSTRING_IInspectableVtbl __FIMapView_2_HSTRING_IInspectableVtbl
#define IMapView_HSTRING_IInspectable __FIMapView_2_HSTRING_IInspectable
#define IMapView_HSTRING_IInspectable_QueryInterface __FIMapView_2_HSTRING_IInspectable_QueryInterface
#define IMapView_HSTRING_IInspectable_AddRef __FIMapView_2_HSTRING_IInspectable_AddRef
#define IMapView_HSTRING_IInspectable_Release __FIMapView_2_HSTRING_IInspectable_Release
#define IMapView_HSTRING_IInspectable_GetIids __FIMapView_2_HSTRING_IInspectable_GetIids
#define IMapView_HSTRING_IInspectable_GetRuntimeClassName __FIMapView_2_HSTRING_IInspectable_GetRuntimeClassName
#define IMapView_HSTRING_IInspectable_GetTrustLevel __FIMapView_2_HSTRING_IInspectable_GetTrustLevel
#define IMapView_HSTRING_IInspectable_Lookup __FIMapView_2_HSTRING_IInspectable_Lookup
#define IMapView_HSTRING_IInspectable_get_Size __FIMapView_2_HSTRING_IInspectable_get_Size
#define IMapView_HSTRING_IInspectable_HasKey __FIMapView_2_HSTRING_IInspectable_HasKey
#define IMapView_HSTRING_IInspectable_Split __FIMapView_2_HSTRING_IInspectable_Split
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIMapView_2_HSTRING_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * 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__ */

/*****************************************************************************
 * IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* > interface
 */
#ifndef ____FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_INTERFACE_DEFINED__
#define ____FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable, 0xfe2f3d47, 0x5d47, 0x5499, 0x83,0x74, 0x43,0x0c,0x7c,0xda,0x02,0x04);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("fe2f3d47-5d47-5499-8374-430c7cda0204")
                IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* > : IIterable_impl<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable, 0xfe2f3d47, 0x5d47, 0x5499, 0x83,0x74, 0x43,0x0c,0x7c,0xda,0x02,0x04)
#endif
#else
typedef struct __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable *This,
        __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable **value);

    END_INTERFACE
} __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectableVtbl;

interface __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable {
    CONST_VTBL __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* > methods ***/
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_QueryInterface(__FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_AddRef(__FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_Release(__FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_GetIids(__FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_GetRuntimeClassName(__FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_GetTrustLevel(__FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* > methods ***/
static inline HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_First(__FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable* This,__FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_IKeyValuePair_HSTRING_IInspectable IID___FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable
#define IIterable_IKeyValuePair_HSTRING_IInspectableVtbl __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectableVtbl
#define IIterable_IKeyValuePair_HSTRING_IInspectable __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable
#define IIterable_IKeyValuePair_HSTRING_IInspectable_QueryInterface __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_QueryInterface
#define IIterable_IKeyValuePair_HSTRING_IInspectable_AddRef __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_AddRef
#define IIterable_IKeyValuePair_HSTRING_IInspectable_Release __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_Release
#define IIterable_IKeyValuePair_HSTRING_IInspectable_GetIids __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_GetIids
#define IIterable_IKeyValuePair_HSTRING_IInspectable_GetRuntimeClassName __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_GetRuntimeClassName
#define IIterable_IKeyValuePair_HSTRING_IInspectable_GetTrustLevel __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_GetTrustLevel
#define IIterable_IKeyValuePair_HSTRING_IInspectable_First __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_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__ */
