/*** Autogenerated by WIDL 9.18 from include/windows.networking.connectivity.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_networking_connectivity_h__
#define __windows_networking_connectivity_h__

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

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler;
#ifdef __cplusplus
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler ABI::Windows::Networking::Connectivity::INetworkStatusChangedEventHandler
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                interface INetworkStatusChangedEventHandler;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost;
#ifdef __cplusplus
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost ABI::Windows::Networking::Connectivity::IConnectionCost
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                interface IConnectionCost;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile;
#ifdef __cplusplus
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile ABI::Windows::Networking::Connectivity::IConnectionProfile
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                interface IConnectionProfile;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus;
#ifdef __cplusplus
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus ABI::Windows::Networking::Connectivity::IDataPlanStatus
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                interface IDataPlanStatus;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage;
#ifdef __cplusplus
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage ABI::Windows::Networking::Connectivity::IDataPlanUsage
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                interface IDataPlanUsage;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage;
#ifdef __cplusplus
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage ABI::Windows::Networking::Connectivity::IDataUsage
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                interface IDataUsage;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation ABI::Windows::Networking::Connectivity::IIPInformation
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                interface IIPInformation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier;
#ifdef __cplusplus
#define __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier ABI::Windows::Networking::Connectivity::ILanIdentifier
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                interface ILanIdentifier;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData;
#ifdef __cplusplus
#define __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData ABI::Windows::Networking::Connectivity::ILanIdentifierData
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                interface ILanIdentifierData;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter;
#ifdef __cplusplus
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter ABI::Windows::Networking::Connectivity::INetworkAdapter
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                interface INetworkAdapter;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics ABI::Windows::Networking::Connectivity::INetworkInformationStatics
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                interface INetworkInformationStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem;
#ifdef __cplusplus
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem ABI::Windows::Networking::Connectivity::INetworkItem
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                interface INetworkItem;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings;
#ifdef __cplusplus
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings ABI::Windows::Networking::Connectivity::INetworkSecuritySettings
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                interface INetworkSecuritySettings;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration;
#ifdef __cplusplus
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration ABI::Windows::Networking::Connectivity::IProxyConfiguration
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                interface IProxyConfiguration;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CConnectionCost_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CConnectionCost_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                class ConnectionCost;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CConnectionCost __x_ABI_CWindows_CNetworking_CConnectivity_CConnectionCost;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CNetworking_CConnectivity_CConnectionCost_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CConnectionProfile_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CConnectionProfile_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                class ConnectionProfile;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CConnectionProfile __x_ABI_CWindows_CNetworking_CConnectivity_CConnectionProfile;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CNetworking_CConnectivity_CConnectionProfile_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CDataPlanStatus_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CDataPlanStatus_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                class DataPlanStatus;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CDataPlanStatus __x_ABI_CWindows_CNetworking_CConnectivity_CDataPlanStatus;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CNetworking_CConnectivity_CDataPlanStatus_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CDataPlanUsage_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CDataPlanUsage_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                class DataPlanUsage;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CDataPlanUsage __x_ABI_CWindows_CNetworking_CConnectivity_CDataPlanUsage;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CNetworking_CConnectivity_CDataPlanUsage_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CDataUsage_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CDataUsage_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                class DataUsage;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CDataUsage __x_ABI_CWindows_CNetworking_CConnectivity_CDataUsage;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CNetworking_CConnectivity_CDataUsage_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CIPInformation_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CIPInformation_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                class IPInformation;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CIPInformation __x_ABI_CWindows_CNetworking_CConnectivity_CIPInformation;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CNetworking_CConnectivity_CIPInformation_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CLanIdentifier_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CLanIdentifier_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                class LanIdentifier;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CLanIdentifier __x_ABI_CWindows_CNetworking_CConnectivity_CLanIdentifier;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CNetworking_CConnectivity_CLanIdentifier_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CLanIdentifierData_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CLanIdentifierData_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                class LanIdentifierData;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CLanIdentifierData __x_ABI_CWindows_CNetworking_CConnectivity_CLanIdentifierData;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CNetworking_CConnectivity_CLanIdentifierData_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CNetworkAdapter_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CNetworkAdapter_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                class NetworkAdapter;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkAdapter __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkAdapter;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CNetworking_CConnectivity_CNetworkAdapter_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CNetworkInformation_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CNetworkInformation_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                class NetworkInformation;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkInformation __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkInformation;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CNetworking_CConnectivity_CNetworkInformation_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CNetworkItem_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CNetworkItem_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                class NetworkItem;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkItem __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkItem;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CNetworking_CConnectivity_CNetworkItem_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CNetworkSecuritySettings_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CNetworkSecuritySettings_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                class NetworkSecuritySettings;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkSecuritySettings __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkSecuritySettings;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CNetworking_CConnectivity_CNetworkSecuritySettings_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CProxyConfiguration_FWD_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CProxyConfiguration_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                class ProxyConfiguration;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CProxyConfiguration __x_ABI_CWindows_CNetworking_CConnectivity_CProxyConfiguration;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CNetworking_CConnectivity_CProxyConfiguration_FWD_DEFINED__ */

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Networking::Connectivity::ConnectionProfile* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Networking::Connectivity::ProxyConfiguration* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Networking::Connectivity::ConnectionProfile* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Networking::Connectivity::ProxyConfiguration* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CNetworking__CEndpointPair_FWD_DEFINED__
#define ____FIIterable_1_Windows__CNetworking__CEndpointPair_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CNetworking__CEndpointPair __FIIterable_1_Windows__CNetworking__CEndpointPair;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CNetworking__CEndpointPair ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Networking::EndpointPair* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Networking::Connectivity::ConnectionProfile* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Networking::Connectivity::LanIdentifier* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CNetworking__CHostName_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CNetworking__CHostName_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CNetworking__CHostName __FIVectorView_1_Windows__CNetworking__CHostName;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CNetworking__CHostName ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Networking::HostName* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CNetworking__CEndpointPair_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CNetworking__CEndpointPair_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CNetworking__CEndpointPair __FIVectorView_1_Windows__CNetworking__CEndpointPair;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CNetworking__CEndpointPair ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Networking::EndpointPair* >
#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.networking.h>
#include <windows.storage.streams.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIClosable_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIClosable_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIClosable __x_ABI_CWindows_CFoundation_CIClosable;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIClosable ABI::Windows::Foundation::IClosable
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IClosable;
        }
    }
}
#endif /* __cplusplus */
#endif

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

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

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

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

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

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

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

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

#ifndef ____FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Networking::Connectivity::ConnectionProfile* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Networking::Connectivity::ProxyConfiguration* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CNetworking__CEndpointPair_FWD_DEFINED__
#define ____FIIterable_1_Windows__CNetworking__CEndpointPair_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CNetworking__CEndpointPair __FIIterable_1_Windows__CNetworking__CEndpointPair;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CNetworking__CEndpointPair ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Networking::EndpointPair* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Networking::Connectivity::ConnectionProfile* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Networking::Connectivity::LanIdentifier* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CNetworking__CHostName_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CNetworking__CHostName_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CNetworking__CHostName __FIVectorView_1_Windows__CNetworking__CHostName;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CNetworking__CHostName ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Networking::HostName* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CNetworking__CEndpointPair_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CNetworking__CEndpointPair_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CNetworking__CEndpointPair __FIVectorView_1_Windows__CNetworking__CEndpointPair;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CNetworking__CEndpointPair ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Networking::EndpointPair* >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                enum NetworkAuthenticationType {
                    NetworkAuthenticationType_None = 0,
                    NetworkAuthenticationType_Unknown = 1,
                    NetworkAuthenticationType_Open80211 = 2,
                    NetworkAuthenticationType_SharedKey80211 = 3,
                    NetworkAuthenticationType_Wpa = 4,
                    NetworkAuthenticationType_WpaPsk = 5,
                    NetworkAuthenticationType_WpaNone = 6,
                    NetworkAuthenticationType_Rsna = 7,
                    NetworkAuthenticationType_RsnaPsk = 8,
                    NetworkAuthenticationType_Ihv = 9
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkAuthenticationType {
    NetworkAuthenticationType_None = 0,
    NetworkAuthenticationType_Unknown = 1,
    NetworkAuthenticationType_Open80211 = 2,
    NetworkAuthenticationType_SharedKey80211 = 3,
    NetworkAuthenticationType_Wpa = 4,
    NetworkAuthenticationType_WpaPsk = 5,
    NetworkAuthenticationType_WpaNone = 6,
    NetworkAuthenticationType_Rsna = 7,
    NetworkAuthenticationType_RsnaPsk = 8,
    NetworkAuthenticationType_Ihv = 9
};
#ifdef WIDL_using_Windows_Networking_Connectivity
#define NetworkAuthenticationType __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkAuthenticationType
#endif /* WIDL_using_Windows_Networking_Connectivity */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                enum NetworkConnectivityLevel {
                    NetworkConnectivityLevel_None = 0,
                    NetworkConnectivityLevel_LocalAccess = 1,
                    NetworkConnectivityLevel_ConstrainedInternetAccess = 2,
                    NetworkConnectivityLevel_InternetAccess = 3
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkConnectivityLevel {
    NetworkConnectivityLevel_None = 0,
    NetworkConnectivityLevel_LocalAccess = 1,
    NetworkConnectivityLevel_ConstrainedInternetAccess = 2,
    NetworkConnectivityLevel_InternetAccess = 3
};
#ifdef WIDL_using_Windows_Networking_Connectivity
#define NetworkConnectivityLevel __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkConnectivityLevel
#endif /* WIDL_using_Windows_Networking_Connectivity */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                enum NetworkCostType {
                    NetworkCostType_Unknown = 0,
                    NetworkCostType_Unrestricted = 1,
                    NetworkCostType_Fixed = 2,
                    NetworkCostType_Variable = 3
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkCostType {
    NetworkCostType_Unknown = 0,
    NetworkCostType_Unrestricted = 1,
    NetworkCostType_Fixed = 2,
    NetworkCostType_Variable = 3
};
#ifdef WIDL_using_Windows_Networking_Connectivity
#define NetworkCostType __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkCostType
#endif /* WIDL_using_Windows_Networking_Connectivity */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                enum NetworkEncryptionType {
                    NetworkEncryptionType_None = 0,
                    NetworkEncryptionType_Unknown = 1,
                    NetworkEncryptionType_Wep = 2,
                    NetworkEncryptionType_Wep40 = 3,
                    NetworkEncryptionType_Wep104 = 4,
                    NetworkEncryptionType_Tkip = 5,
                    NetworkEncryptionType_Ccmp = 6,
                    NetworkEncryptionType_WpaUseGroup = 7,
                    NetworkEncryptionType_RsnUseGroup = 8,
                    NetworkEncryptionType_Ihv = 9
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkEncryptionType {
    NetworkEncryptionType_None = 0,
    NetworkEncryptionType_Unknown = 1,
    NetworkEncryptionType_Wep = 2,
    NetworkEncryptionType_Wep40 = 3,
    NetworkEncryptionType_Wep104 = 4,
    NetworkEncryptionType_Tkip = 5,
    NetworkEncryptionType_Ccmp = 6,
    NetworkEncryptionType_WpaUseGroup = 7,
    NetworkEncryptionType_RsnUseGroup = 8,
    NetworkEncryptionType_Ihv = 9
};
#ifdef WIDL_using_Windows_Networking_Connectivity
#define NetworkEncryptionType __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkEncryptionType
#endif /* WIDL_using_Windows_Networking_Connectivity */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                enum NetworkTypes {
                    NetworkTypes_None = 0x0,
                    NetworkTypes_Internet = 0x1,
                    NetworkTypes_PrivateNetwork = 0x2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkTypes {
    NetworkTypes_None = 0x0,
    NetworkTypes_Internet = 0x1,
    NetworkTypes_PrivateNetwork = 0x2
};
#ifdef WIDL_using_Windows_Networking_Connectivity
#define NetworkTypes __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkTypes
#endif /* WIDL_using_Windows_Networking_Connectivity */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                enum RoamingStates {
                    RoamingStates_None = 0x0,
                    RoamingStates_NotRoaming = 0x1,
                    RoamingStates_Roaming = 0x2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CNetworking_CConnectivity_CRoamingStates {
    RoamingStates_None = 0x0,
    RoamingStates_NotRoaming = 0x1,
    RoamingStates_Roaming = 0x2
};
#ifdef WIDL_using_Windows_Networking_Connectivity
#define RoamingStates __x_ABI_CWindows_CNetworking_CConnectivity_CRoamingStates
#endif /* WIDL_using_Windows_Networking_Connectivity */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
/*****************************************************************************
 * INetworkStatusChangedEventHandler interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler, 0x71ba143f, 0x598e, 0x49d0, 0x84,0xeb, 0x8f,0xeb,0xae,0xdc,0xc1,0x95);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                MIDL_INTERFACE("71ba143f-598e-49d0-84eb-8febaedcc195")
                INetworkStatusChangedEventHandler : public IUnknown
                {
                    virtual HRESULT STDMETHODCALLTYPE Invoke(
                        IInspectable *sender) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler, 0x71ba143f, 0x598e, 0x49d0, 0x84,0xeb, 0x8f,0xeb,0xae,0xdc,0xc1,0x95)
#endif
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** INetworkStatusChangedEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler *This,
        IInspectable *sender);

    END_INTERFACE
} __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandlerVtbl;

interface __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler {
    CONST_VTBL __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** INetworkStatusChangedEventHandler methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler_Invoke(This,sender) (This)->lpVtbl->Invoke(This,sender)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler_QueryInterface(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler_AddRef(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler_Release(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** INetworkStatusChangedEventHandler methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler_Invoke(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler* This,IInspectable *sender) {
    return This->lpVtbl->Invoke(This,sender);
}
#endif
#ifdef WIDL_using_Windows_Networking_Connectivity
#define IID_INetworkStatusChangedEventHandler IID___x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler
#define INetworkStatusChangedEventHandlerVtbl __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandlerVtbl
#define INetworkStatusChangedEventHandler __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler
#define INetworkStatusChangedEventHandler_QueryInterface __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler_QueryInterface
#define INetworkStatusChangedEventHandler_AddRef __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler_AddRef
#define INetworkStatusChangedEventHandler_Release __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler_Release
#define INetworkStatusChangedEventHandler_Invoke __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler_Invoke
#endif /* WIDL_using_Windows_Networking_Connectivity */
#endif

#endif

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

/*****************************************************************************
 * IConnectionCost interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost, 0xbad7d829, 0x3416, 0x4b10, 0xa2,0x02, 0xba,0xc0,0xb0,0x75,0xbd,0xae);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                MIDL_INTERFACE("bad7d829-3416-4b10-a202-bac0b075bdae")
                IConnectionCost : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_NetworkCostType(
                        ABI::Windows::Networking::Connectivity::NetworkCostType *value) = 0;

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

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

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

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost, 0xbad7d829, 0x3416, 0x4b10, 0xa2,0x02, 0xba,0xc0,0xb0,0x75,0xbd,0xae)
#endif
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCostVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IConnectionCost methods ***/
    HRESULT (STDMETHODCALLTYPE *get_NetworkCostType)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost *This,
        __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkCostType *value);

    HRESULT (STDMETHODCALLTYPE *get_Roaming)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_OverDataLimit)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_ApproachingDataLimit)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost *This,
        boolean *value);

    END_INTERFACE
} __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCostVtbl;

interface __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost {
    CONST_VTBL __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCostVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IConnectionCost methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_get_NetworkCostType(This,value) (This)->lpVtbl->get_NetworkCostType(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_get_Roaming(This,value) (This)->lpVtbl->get_Roaming(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_get_OverDataLimit(This,value) (This)->lpVtbl->get_OverDataLimit(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_get_ApproachingDataLimit(This,value) (This)->lpVtbl->get_ApproachingDataLimit(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_QueryInterface(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_AddRef(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_Release(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_GetIids(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_GetRuntimeClassName(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_GetTrustLevel(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IConnectionCost methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_get_NetworkCostType(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost* This,__x_ABI_CWindows_CNetworking_CConnectivity_CNetworkCostType *value) {
    return This->lpVtbl->get_NetworkCostType(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_get_Roaming(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost* This,boolean *value) {
    return This->lpVtbl->get_Roaming(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_get_OverDataLimit(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost* This,boolean *value) {
    return This->lpVtbl->get_OverDataLimit(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_get_ApproachingDataLimit(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost* This,boolean *value) {
    return This->lpVtbl->get_ApproachingDataLimit(This,value);
}
#endif
#ifdef WIDL_using_Windows_Networking_Connectivity
#define IID_IConnectionCost IID___x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost
#define IConnectionCostVtbl __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCostVtbl
#define IConnectionCost __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost
#define IConnectionCost_QueryInterface __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_QueryInterface
#define IConnectionCost_AddRef __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_AddRef
#define IConnectionCost_Release __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_Release
#define IConnectionCost_GetIids __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_GetIids
#define IConnectionCost_GetRuntimeClassName __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_GetRuntimeClassName
#define IConnectionCost_GetTrustLevel __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_GetTrustLevel
#define IConnectionCost_get_NetworkCostType __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_get_NetworkCostType
#define IConnectionCost_get_Roaming __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_get_Roaming
#define IConnectionCost_get_OverDataLimit __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_get_OverDataLimit
#define IConnectionCost_get_ApproachingDataLimit __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost_get_ApproachingDataLimit
#endif /* WIDL_using_Windows_Networking_Connectivity */
#endif

#endif

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

/*****************************************************************************
 * IConnectionProfile interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile, 0x71ba143c, 0x598e, 0x49d0, 0x84,0xeb, 0x8f,0xeb,0xae,0xdc,0xc1,0x95);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                MIDL_INTERFACE("71ba143c-598e-49d0-84eb-8febaedcc195")
                IConnectionProfile : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ProfileName(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetNetworkConnectivityLevel(
                        ABI::Windows::Networking::Connectivity::NetworkConnectivityLevel *value) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE GetConnectionCost(
                        ABI::Windows::Networking::Connectivity::IConnectionCost **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetDataPlanStatus(
                        ABI::Windows::Networking::Connectivity::IDataPlanStatus **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_NetworkAdapter(
                        ABI::Windows::Networking::Connectivity::INetworkAdapter **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetLocalUsage(
                        ABI::Windows::Foundation::DateTime start,
                        ABI::Windows::Foundation::DateTime end,
                        ABI::Windows::Networking::Connectivity::IDataUsage **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetLocalUsagePerRoamingStates(
                        ABI::Windows::Foundation::DateTime start,
                        ABI::Windows::Foundation::DateTime end,
                        ABI::Windows::Networking::Connectivity::RoamingStates states,
                        ABI::Windows::Networking::Connectivity::IDataUsage **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_NetworkSecuritySettings(
                        ABI::Windows::Networking::Connectivity::INetworkSecuritySettings **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile, 0x71ba143c, 0x598e, 0x49d0, 0x84,0xeb, 0x8f,0xeb,0xae,0xdc,0xc1,0x95)
#endif
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfileVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IConnectionProfile methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ProfileName)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *GetNetworkConnectivityLevel)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile *This,
        __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkConnectivityLevel *value);

    HRESULT (STDMETHODCALLTYPE *GetNetworkNames)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile *This,
        __FIVectorView_1_HSTRING **value);

    HRESULT (STDMETHODCALLTYPE *GetConnectionCost)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile *This,
        __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost **value);

    HRESULT (STDMETHODCALLTYPE *GetDataPlanStatus)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile *This,
        __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus **value);

    HRESULT (STDMETHODCALLTYPE *get_NetworkAdapter)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile *This,
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter **value);

    HRESULT (STDMETHODCALLTYPE *GetLocalUsage)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile *This,
        __x_ABI_CWindows_CFoundation_CDateTime start,
        __x_ABI_CWindows_CFoundation_CDateTime end,
        __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage **value);

    HRESULT (STDMETHODCALLTYPE *GetLocalUsagePerRoamingStates)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile *This,
        __x_ABI_CWindows_CFoundation_CDateTime start,
        __x_ABI_CWindows_CFoundation_CDateTime end,
        __x_ABI_CWindows_CNetworking_CConnectivity_CRoamingStates states,
        __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage **value);

    HRESULT (STDMETHODCALLTYPE *get_NetworkSecuritySettings)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile *This,
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings **value);

    END_INTERFACE
} __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfileVtbl;

interface __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile {
    CONST_VTBL __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfileVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IConnectionProfile methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_get_ProfileName(This,value) (This)->lpVtbl->get_ProfileName(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetNetworkConnectivityLevel(This,value) (This)->lpVtbl->GetNetworkConnectivityLevel(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetNetworkNames(This,value) (This)->lpVtbl->GetNetworkNames(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetConnectionCost(This,value) (This)->lpVtbl->GetConnectionCost(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetDataPlanStatus(This,value) (This)->lpVtbl->GetDataPlanStatus(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_get_NetworkAdapter(This,value) (This)->lpVtbl->get_NetworkAdapter(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetLocalUsage(This,start,end,value) (This)->lpVtbl->GetLocalUsage(This,start,end,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetLocalUsagePerRoamingStates(This,start,end,states,value) (This)->lpVtbl->GetLocalUsagePerRoamingStates(This,start,end,states,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_get_NetworkSecuritySettings(This,value) (This)->lpVtbl->get_NetworkSecuritySettings(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_QueryInterface(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_AddRef(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_Release(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetIids(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetRuntimeClassName(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetTrustLevel(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IConnectionProfile methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_get_ProfileName(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile* This,HSTRING *value) {
    return This->lpVtbl->get_ProfileName(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetNetworkConnectivityLevel(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile* This,__x_ABI_CWindows_CNetworking_CConnectivity_CNetworkConnectivityLevel *value) {
    return This->lpVtbl->GetNetworkConnectivityLevel(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetNetworkNames(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile* This,__FIVectorView_1_HSTRING **value) {
    return This->lpVtbl->GetNetworkNames(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetConnectionCost(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile* This,__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionCost **value) {
    return This->lpVtbl->GetConnectionCost(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetDataPlanStatus(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile* This,__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus **value) {
    return This->lpVtbl->GetDataPlanStatus(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_get_NetworkAdapter(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile* This,__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter **value) {
    return This->lpVtbl->get_NetworkAdapter(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetLocalUsage(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile* This,__x_ABI_CWindows_CFoundation_CDateTime start,__x_ABI_CWindows_CFoundation_CDateTime end,__x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage **value) {
    return This->lpVtbl->GetLocalUsage(This,start,end,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetLocalUsagePerRoamingStates(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile* This,__x_ABI_CWindows_CFoundation_CDateTime start,__x_ABI_CWindows_CFoundation_CDateTime end,__x_ABI_CWindows_CNetworking_CConnectivity_CRoamingStates states,__x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage **value) {
    return This->lpVtbl->GetLocalUsagePerRoamingStates(This,start,end,states,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_get_NetworkSecuritySettings(__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile* This,__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings **value) {
    return This->lpVtbl->get_NetworkSecuritySettings(This,value);
}
#endif
#ifdef WIDL_using_Windows_Networking_Connectivity
#define IID_IConnectionProfile IID___x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile
#define IConnectionProfileVtbl __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfileVtbl
#define IConnectionProfile __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile
#define IConnectionProfile_QueryInterface __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_QueryInterface
#define IConnectionProfile_AddRef __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_AddRef
#define IConnectionProfile_Release __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_Release
#define IConnectionProfile_GetIids __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetIids
#define IConnectionProfile_GetRuntimeClassName __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetRuntimeClassName
#define IConnectionProfile_GetTrustLevel __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetTrustLevel
#define IConnectionProfile_get_ProfileName __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_get_ProfileName
#define IConnectionProfile_GetNetworkConnectivityLevel __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetNetworkConnectivityLevel
#define IConnectionProfile_GetNetworkNames __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetNetworkNames
#define IConnectionProfile_GetConnectionCost __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetConnectionCost
#define IConnectionProfile_GetDataPlanStatus __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetDataPlanStatus
#define IConnectionProfile_get_NetworkAdapter __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_get_NetworkAdapter
#define IConnectionProfile_GetLocalUsage __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetLocalUsage
#define IConnectionProfile_GetLocalUsagePerRoamingStates __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_GetLocalUsagePerRoamingStates
#define IConnectionProfile_get_NetworkSecuritySettings __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile_get_NetworkSecuritySettings
#endif /* WIDL_using_Windows_Networking_Connectivity */
#endif

#endif

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

/*****************************************************************************
 * IDataPlanStatus interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus, 0x977a8b8c, 0x3885, 0x40f3, 0x88,0x51, 0x42,0xcd,0x2b,0xd5,0x68,0xbb);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                MIDL_INTERFACE("977a8b8c-3885-40f3-8851-42cd2bd568bb")
                IDataPlanStatus : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_DataPlanUsage(
                        ABI::Windows::Networking::Connectivity::IDataPlanUsage **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_DataLimitInMegabytes(
                        ABI::Windows::Foundation::IReference<UINT32 > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_InboundBitsPerSecond(
                        ABI::Windows::Foundation::IReference<UINT64 > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_OutboundBitsPerSecond(
                        ABI::Windows::Foundation::IReference<UINT64 > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_NextBillingCycle(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_MaxTransferSizeInMegabytes(
                        ABI::Windows::Foundation::IReference<UINT32 > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus, 0x977a8b8c, 0x3885, 0x40f3, 0x88,0x51, 0x42,0xcd,0x2b,0xd5,0x68,0xbb)
#endif
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatusVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDataPlanStatus methods ***/
    HRESULT (STDMETHODCALLTYPE *get_DataPlanUsage)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus *This,
        __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage **value);

    HRESULT (STDMETHODCALLTYPE *get_DataLimitInMegabytes)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus *This,
        __FIReference_1_UINT32 **value);

    HRESULT (STDMETHODCALLTYPE *get_InboundBitsPerSecond)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus *This,
        __FIReference_1_UINT64 **value);

    HRESULT (STDMETHODCALLTYPE *get_OutboundBitsPerSecond)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus *This,
        __FIReference_1_UINT64 **value);

    HRESULT (STDMETHODCALLTYPE *get_NextBillingCycle)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus *This,
        __FIReference_1_DateTime **value);

    HRESULT (STDMETHODCALLTYPE *get_MaxTransferSizeInMegabytes)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus *This,
        __FIReference_1_UINT32 **value);

    END_INTERFACE
} __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatusVtbl;

interface __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus {
    CONST_VTBL __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatusVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataPlanStatus methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_get_DataPlanUsage(This,value) (This)->lpVtbl->get_DataPlanUsage(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_get_DataLimitInMegabytes(This,value) (This)->lpVtbl->get_DataLimitInMegabytes(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_get_InboundBitsPerSecond(This,value) (This)->lpVtbl->get_InboundBitsPerSecond(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_get_OutboundBitsPerSecond(This,value) (This)->lpVtbl->get_OutboundBitsPerSecond(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_get_NextBillingCycle(This,value) (This)->lpVtbl->get_NextBillingCycle(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_get_MaxTransferSizeInMegabytes(This,value) (This)->lpVtbl->get_MaxTransferSizeInMegabytes(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_QueryInterface(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_AddRef(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_Release(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_GetIids(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_GetRuntimeClassName(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_GetTrustLevel(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataPlanStatus methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_get_DataPlanUsage(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus* This,__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage **value) {
    return This->lpVtbl->get_DataPlanUsage(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_get_DataLimitInMegabytes(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus* This,__FIReference_1_UINT32 **value) {
    return This->lpVtbl->get_DataLimitInMegabytes(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_get_InboundBitsPerSecond(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus* This,__FIReference_1_UINT64 **value) {
    return This->lpVtbl->get_InboundBitsPerSecond(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_get_OutboundBitsPerSecond(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus* This,__FIReference_1_UINT64 **value) {
    return This->lpVtbl->get_OutboundBitsPerSecond(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_get_NextBillingCycle(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus* This,__FIReference_1_DateTime **value) {
    return This->lpVtbl->get_NextBillingCycle(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_get_MaxTransferSizeInMegabytes(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus* This,__FIReference_1_UINT32 **value) {
    return This->lpVtbl->get_MaxTransferSizeInMegabytes(This,value);
}
#endif
#ifdef WIDL_using_Windows_Networking_Connectivity
#define IID_IDataPlanStatus IID___x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus
#define IDataPlanStatusVtbl __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatusVtbl
#define IDataPlanStatus __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus
#define IDataPlanStatus_QueryInterface __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_QueryInterface
#define IDataPlanStatus_AddRef __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_AddRef
#define IDataPlanStatus_Release __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_Release
#define IDataPlanStatus_GetIids __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_GetIids
#define IDataPlanStatus_GetRuntimeClassName __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_GetRuntimeClassName
#define IDataPlanStatus_GetTrustLevel __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_GetTrustLevel
#define IDataPlanStatus_get_DataPlanUsage __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_get_DataPlanUsage
#define IDataPlanStatus_get_DataLimitInMegabytes __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_get_DataLimitInMegabytes
#define IDataPlanStatus_get_InboundBitsPerSecond __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_get_InboundBitsPerSecond
#define IDataPlanStatus_get_OutboundBitsPerSecond __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_get_OutboundBitsPerSecond
#define IDataPlanStatus_get_NextBillingCycle __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_get_NextBillingCycle
#define IDataPlanStatus_get_MaxTransferSizeInMegabytes __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanStatus_get_MaxTransferSizeInMegabytes
#endif /* WIDL_using_Windows_Networking_Connectivity */
#endif

#endif

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

/*****************************************************************************
 * IDataPlanUsage interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage, 0xb921492d, 0x3b44, 0x47ff, 0xb3,0x61, 0xbe,0x59,0xe6,0x9e,0xd1,0xb0);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                MIDL_INTERFACE("b921492d-3b44-47ff-b361-be59e69ed1b0")
                IDataPlanUsage : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_MegabytesUsed(
                        UINT32 *value) = 0;

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

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage, 0xb921492d, 0x3b44, 0x47ff, 0xb3,0x61, 0xbe,0x59,0xe6,0x9e,0xd1,0xb0)
#endif
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsageVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDataPlanUsage methods ***/
    HRESULT (STDMETHODCALLTYPE *get_MegabytesUsed)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_LastSyncTime)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage *This,
        __x_ABI_CWindows_CFoundation_CDateTime *value);

    END_INTERFACE
} __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsageVtbl;

interface __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage {
    CONST_VTBL __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataPlanUsage methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_get_MegabytesUsed(This,value) (This)->lpVtbl->get_MegabytesUsed(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_get_LastSyncTime(This,value) (This)->lpVtbl->get_LastSyncTime(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_QueryInterface(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_AddRef(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_Release(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_GetIids(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_GetRuntimeClassName(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_GetTrustLevel(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataPlanUsage methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_get_MegabytesUsed(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage* This,UINT32 *value) {
    return This->lpVtbl->get_MegabytesUsed(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_get_LastSyncTime(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage* This,__x_ABI_CWindows_CFoundation_CDateTime *value) {
    return This->lpVtbl->get_LastSyncTime(This,value);
}
#endif
#ifdef WIDL_using_Windows_Networking_Connectivity
#define IID_IDataPlanUsage IID___x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage
#define IDataPlanUsageVtbl __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsageVtbl
#define IDataPlanUsage __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage
#define IDataPlanUsage_QueryInterface __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_QueryInterface
#define IDataPlanUsage_AddRef __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_AddRef
#define IDataPlanUsage_Release __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_Release
#define IDataPlanUsage_GetIids __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_GetIids
#define IDataPlanUsage_GetRuntimeClassName __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_GetRuntimeClassName
#define IDataPlanUsage_GetTrustLevel __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_GetTrustLevel
#define IDataPlanUsage_get_MegabytesUsed __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_get_MegabytesUsed
#define IDataPlanUsage_get_LastSyncTime __x_ABI_CWindows_CNetworking_CConnectivity_CIDataPlanUsage_get_LastSyncTime
#endif /* WIDL_using_Windows_Networking_Connectivity */
#endif

#endif

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

/*****************************************************************************
 * IDataUsage interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage, 0xc1431dd3, 0xb146, 0x4d39, 0xb9,0x59, 0x0c,0x69,0xb0,0x96,0xc5,0x12);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                MIDL_INTERFACE("c1431dd3-b146-4d39-b959-0c69b096c512")
                IDataUsage : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_BytesSent(
                        UINT64 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_BytesReceived(
                        UINT64 *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage, 0xc1431dd3, 0xb146, 0x4d39, 0xb9,0x59, 0x0c,0x69,0xb0,0x96,0xc5,0x12)
#endif
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsageVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDataUsage methods ***/
    HRESULT (STDMETHODCALLTYPE *get_BytesSent)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage *This,
        UINT64 *value);

    HRESULT (STDMETHODCALLTYPE *get_BytesReceived)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage *This,
        UINT64 *value);

    END_INTERFACE
} __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsageVtbl;

interface __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage {
    CONST_VTBL __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataUsage methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_get_BytesSent(This,value) (This)->lpVtbl->get_BytesSent(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_get_BytesReceived(This,value) (This)->lpVtbl->get_BytesReceived(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_QueryInterface(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_AddRef(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_Release(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_GetIids(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_GetRuntimeClassName(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_GetTrustLevel(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataUsage methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_get_BytesSent(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage* This,UINT64 *value) {
    return This->lpVtbl->get_BytesSent(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_get_BytesReceived(__x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage* This,UINT64 *value) {
    return This->lpVtbl->get_BytesReceived(This,value);
}
#endif
#ifdef WIDL_using_Windows_Networking_Connectivity
#define IID_IDataUsage IID___x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage
#define IDataUsageVtbl __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsageVtbl
#define IDataUsage __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage
#define IDataUsage_QueryInterface __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_QueryInterface
#define IDataUsage_AddRef __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_AddRef
#define IDataUsage_Release __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_Release
#define IDataUsage_GetIids __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_GetIids
#define IDataUsage_GetRuntimeClassName __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_GetRuntimeClassName
#define IDataUsage_GetTrustLevel __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_GetTrustLevel
#define IDataUsage_get_BytesSent __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_get_BytesSent
#define IDataUsage_get_BytesReceived __x_ABI_CWindows_CNetworking_CConnectivity_CIDataUsage_get_BytesReceived
#endif /* WIDL_using_Windows_Networking_Connectivity */
#endif

#endif

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

/*****************************************************************************
 * IIPInformation interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation, 0xd85145e0, 0x138f, 0x47d7, 0x9b,0x3a, 0x36,0xbb,0x48,0x8c,0xef,0x33);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                MIDL_INTERFACE("d85145e0-138f-47d7-9b3a-36bb488cef33")
                IIPInformation : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_NetworkAdapter(
                        ABI::Windows::Networking::Connectivity::INetworkAdapter **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_PrefixLength(
                        ABI::Windows::Foundation::IReference<BYTE > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation, 0xd85145e0, 0x138f, 0x47d7, 0x9b,0x3a, 0x36,0xbb,0x48,0x8c,0xef,0x33)
#endif
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIPInformation methods ***/
    HRESULT (STDMETHODCALLTYPE *get_NetworkAdapter)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation *This,
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter **value);

    HRESULT (STDMETHODCALLTYPE *get_PrefixLength)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation *This,
        __FIReference_1_BYTE **value);

    END_INTERFACE
} __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformationVtbl;

interface __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation {
    CONST_VTBL __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIPInformation methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_get_NetworkAdapter(This,value) (This)->lpVtbl->get_NetworkAdapter(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_get_PrefixLength(This,value) (This)->lpVtbl->get_PrefixLength(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_QueryInterface(__x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_AddRef(__x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_Release(__x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_GetIids(__x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_GetRuntimeClassName(__x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_GetTrustLevel(__x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIPInformation methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_get_NetworkAdapter(__x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation* This,__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter **value) {
    return This->lpVtbl->get_NetworkAdapter(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_get_PrefixLength(__x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation* This,__FIReference_1_BYTE **value) {
    return This->lpVtbl->get_PrefixLength(This,value);
}
#endif
#ifdef WIDL_using_Windows_Networking_Connectivity
#define IID_IIPInformation IID___x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation
#define IIPInformationVtbl __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformationVtbl
#define IIPInformation __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation
#define IIPInformation_QueryInterface __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_QueryInterface
#define IIPInformation_AddRef __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_AddRef
#define IIPInformation_Release __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_Release
#define IIPInformation_GetIids __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_GetIids
#define IIPInformation_GetRuntimeClassName __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_GetRuntimeClassName
#define IIPInformation_GetTrustLevel __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_GetTrustLevel
#define IIPInformation_get_NetworkAdapter __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_get_NetworkAdapter
#define IIPInformation_get_PrefixLength __x_ABI_CWindows_CNetworking_CConnectivity_CIIPInformation_get_PrefixLength
#endif /* WIDL_using_Windows_Networking_Connectivity */
#endif

#endif

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

/*****************************************************************************
 * ILanIdentifier interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier, 0x48aa53aa, 0x1108, 0x4546, 0xa6,0xcb, 0x9a,0x74,0xda,0x4b,0x7b,0xa0);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                MIDL_INTERFACE("48aa53aa-1108-4546-a6cb-9a74da4b7ba0")
                ILanIdentifier : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_InfrastructureId(
                        ABI::Windows::Networking::Connectivity::ILanIdentifierData **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_PortId(
                        ABI::Windows::Networking::Connectivity::ILanIdentifierData **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_NetworkAdapterId(
                        GUID *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier, 0x48aa53aa, 0x1108, 0x4546, 0xa6,0xcb, 0x9a,0x74,0xda,0x4b,0x7b,0xa0)
#endif
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ILanIdentifier methods ***/
    HRESULT (STDMETHODCALLTYPE *get_InfrastructureId)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier *This,
        __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData **value);

    HRESULT (STDMETHODCALLTYPE *get_PortId)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier *This,
        __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData **value);

    HRESULT (STDMETHODCALLTYPE *get_NetworkAdapterId)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier *This,
        GUID *value);

    END_INTERFACE
} __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierVtbl;

interface __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier {
    CONST_VTBL __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ILanIdentifier methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_get_InfrastructureId(This,value) (This)->lpVtbl->get_InfrastructureId(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_get_PortId(This,value) (This)->lpVtbl->get_PortId(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_get_NetworkAdapterId(This,value) (This)->lpVtbl->get_NetworkAdapterId(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_QueryInterface(__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_AddRef(__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_Release(__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_GetIids(__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_GetRuntimeClassName(__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_GetTrustLevel(__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ILanIdentifier methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_get_InfrastructureId(__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier* This,__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData **value) {
    return This->lpVtbl->get_InfrastructureId(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_get_PortId(__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier* This,__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData **value) {
    return This->lpVtbl->get_PortId(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_get_NetworkAdapterId(__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier* This,GUID *value) {
    return This->lpVtbl->get_NetworkAdapterId(This,value);
}
#endif
#ifdef WIDL_using_Windows_Networking_Connectivity
#define IID_ILanIdentifier IID___x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier
#define ILanIdentifierVtbl __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierVtbl
#define ILanIdentifier __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier
#define ILanIdentifier_QueryInterface __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_QueryInterface
#define ILanIdentifier_AddRef __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_AddRef
#define ILanIdentifier_Release __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_Release
#define ILanIdentifier_GetIids __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_GetIids
#define ILanIdentifier_GetRuntimeClassName __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_GetRuntimeClassName
#define ILanIdentifier_GetTrustLevel __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_GetTrustLevel
#define ILanIdentifier_get_InfrastructureId __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_get_InfrastructureId
#define ILanIdentifier_get_PortId __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_get_PortId
#define ILanIdentifier_get_NetworkAdapterId __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier_get_NetworkAdapterId
#endif /* WIDL_using_Windows_Networking_Connectivity */
#endif

#endif

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

/*****************************************************************************
 * ILanIdentifierData interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData, 0xa74e83c3, 0xd639, 0x45be, 0xa3,0x6a, 0xc4,0xe4,0xae,0xaf,0x6d,0x9b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                MIDL_INTERFACE("a74e83c3-d639-45be-a36a-c4e4aeaf6d9b")
                ILanIdentifierData : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Type(
                        UINT32 *value) = 0;

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

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData, 0xa74e83c3, 0xd639, 0x45be, 0xa3,0x6a, 0xc4,0xe4,0xae,0xaf,0x6d,0x9b)
#endif
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierDataVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ILanIdentifierData methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Type)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData *This,
        __FIVectorView_1_BYTE **value);

    END_INTERFACE
} __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierDataVtbl;

interface __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData {
    CONST_VTBL __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierDataVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ILanIdentifierData methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_get_Type(This,value) (This)->lpVtbl->get_Type(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_QueryInterface(__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_AddRef(__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_Release(__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_GetIids(__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_GetRuntimeClassName(__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_GetTrustLevel(__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ILanIdentifierData methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_get_Type(__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData* This,UINT32 *value) {
    return This->lpVtbl->get_Type(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_get_Value(__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData* This,__FIVectorView_1_BYTE **value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Networking_Connectivity
#define IID_ILanIdentifierData IID___x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData
#define ILanIdentifierDataVtbl __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierDataVtbl
#define ILanIdentifierData __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData
#define ILanIdentifierData_QueryInterface __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_QueryInterface
#define ILanIdentifierData_AddRef __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_AddRef
#define ILanIdentifierData_Release __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_Release
#define ILanIdentifierData_GetIids __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_GetIids
#define ILanIdentifierData_GetRuntimeClassName __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_GetRuntimeClassName
#define ILanIdentifierData_GetTrustLevel __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_GetTrustLevel
#define ILanIdentifierData_get_Type __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_get_Type
#define ILanIdentifierData_get_Value __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifierData_get_Value
#endif /* WIDL_using_Windows_Networking_Connectivity */
#endif

#endif

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

/*****************************************************************************
 * INetworkAdapter interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter, 0x3b542e03, 0x5388, 0x496c, 0xa8,0xa3, 0xaf,0xfd,0x39,0xae,0xc2,0xe6);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                MIDL_INTERFACE("3b542e03-5388-496c-a8a3-affd39aec2e6")
                INetworkAdapter : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_OutboundMaxBitsPerSecond(
                        UINT64 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_InboundMaxBitsPerSecond(
                        UINT64 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_IanaInterfaceType(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_NetworkItem(
                        ABI::Windows::Networking::Connectivity::INetworkItem **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_NetworkAdapterId(
                        GUID *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetConnectedProfileAsync(
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Networking::Connectivity::ConnectionProfile* > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter, 0x3b542e03, 0x5388, 0x496c, 0xa8,0xa3, 0xaf,0xfd,0x39,0xae,0xc2,0xe6)
#endif
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapterVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** INetworkAdapter methods ***/
    HRESULT (STDMETHODCALLTYPE *get_OutboundMaxBitsPerSecond)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter *This,
        UINT64 *value);

    HRESULT (STDMETHODCALLTYPE *get_InboundMaxBitsPerSecond)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter *This,
        UINT64 *value);

    HRESULT (STDMETHODCALLTYPE *get_IanaInterfaceType)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_NetworkItem)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter *This,
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem **value);

    HRESULT (STDMETHODCALLTYPE *get_NetworkAdapterId)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter *This,
        GUID *value);

    HRESULT (STDMETHODCALLTYPE *GetConnectedProfileAsync)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter *This,
        __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile **value);

    END_INTERFACE
} __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapterVtbl;

interface __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter {
    CONST_VTBL __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** INetworkAdapter methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_get_OutboundMaxBitsPerSecond(This,value) (This)->lpVtbl->get_OutboundMaxBitsPerSecond(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_get_InboundMaxBitsPerSecond(This,value) (This)->lpVtbl->get_InboundMaxBitsPerSecond(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_get_IanaInterfaceType(This,value) (This)->lpVtbl->get_IanaInterfaceType(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_get_NetworkItem(This,value) (This)->lpVtbl->get_NetworkItem(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_get_NetworkAdapterId(This,value) (This)->lpVtbl->get_NetworkAdapterId(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_GetConnectedProfileAsync(This,value) (This)->lpVtbl->GetConnectedProfileAsync(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_QueryInterface(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_AddRef(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_Release(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_GetIids(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_GetRuntimeClassName(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_GetTrustLevel(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** INetworkAdapter methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_get_OutboundMaxBitsPerSecond(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter* This,UINT64 *value) {
    return This->lpVtbl->get_OutboundMaxBitsPerSecond(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_get_InboundMaxBitsPerSecond(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter* This,UINT64 *value) {
    return This->lpVtbl->get_InboundMaxBitsPerSecond(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_get_IanaInterfaceType(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter* This,UINT32 *value) {
    return This->lpVtbl->get_IanaInterfaceType(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_get_NetworkItem(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter* This,__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem **value) {
    return This->lpVtbl->get_NetworkItem(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_get_NetworkAdapterId(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter* This,GUID *value) {
    return This->lpVtbl->get_NetworkAdapterId(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_GetConnectedProfileAsync(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter* This,__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile **value) {
    return This->lpVtbl->GetConnectedProfileAsync(This,value);
}
#endif
#ifdef WIDL_using_Windows_Networking_Connectivity
#define IID_INetworkAdapter IID___x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter
#define INetworkAdapterVtbl __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapterVtbl
#define INetworkAdapter __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter
#define INetworkAdapter_QueryInterface __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_QueryInterface
#define INetworkAdapter_AddRef __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_AddRef
#define INetworkAdapter_Release __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_Release
#define INetworkAdapter_GetIids __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_GetIids
#define INetworkAdapter_GetRuntimeClassName __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_GetRuntimeClassName
#define INetworkAdapter_GetTrustLevel __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_GetTrustLevel
#define INetworkAdapter_get_OutboundMaxBitsPerSecond __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_get_OutboundMaxBitsPerSecond
#define INetworkAdapter_get_InboundMaxBitsPerSecond __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_get_InboundMaxBitsPerSecond
#define INetworkAdapter_get_IanaInterfaceType __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_get_IanaInterfaceType
#define INetworkAdapter_get_NetworkItem __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_get_NetworkItem
#define INetworkAdapter_get_NetworkAdapterId __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_get_NetworkAdapterId
#define INetworkAdapter_GetConnectedProfileAsync __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkAdapter_GetConnectedProfileAsync
#endif /* WIDL_using_Windows_Networking_Connectivity */
#endif

#endif

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

/*****************************************************************************
 * INetworkInformationStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics, 0x5074f851, 0x950d, 0x4165, 0x9c,0x15, 0x36,0x56,0x19,0x48,0x1e,0xea);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                MIDL_INTERFACE("5074f851-950d-4165-9c15-365619481eea")
                INetworkInformationStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetConnectionProfiles(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Networking::Connectivity::ConnectionProfile* > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetInternetConnectionProfile(
                        ABI::Windows::Networking::Connectivity::IConnectionProfile **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetLanIdentifiers(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Networking::Connectivity::LanIdentifier* > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetHostNames(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Networking::HostName* > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetProxyConfigurationAsync(
                        ABI::Windows::Foundation::IUriRuntimeClass *uri,
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Networking::Connectivity::ProxyConfiguration* > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetSortedEndpointPairs(
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Networking::EndpointPair* > *endpoint,
                        ABI::Windows::Networking::HostNameSortOptions options,
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Networking::EndpointPair* > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_NetworkStatusChanged(
                        ABI::Windows::Networking::Connectivity::INetworkStatusChangedEventHandler *handler,
                        EventRegistrationToken *cookie) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_NetworkStatusChanged(
                        EventRegistrationToken cookie) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics, 0x5074f851, 0x950d, 0x4165, 0x9c,0x15, 0x36,0x56,0x19,0x48,0x1e,0xea)
#endif
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** INetworkInformationStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *GetConnectionProfiles)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics *This,
        __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile **value);

    HRESULT (STDMETHODCALLTYPE *GetInternetConnectionProfile)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics *This,
        __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile **value);

    HRESULT (STDMETHODCALLTYPE *GetLanIdentifiers)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics *This,
        __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier **value);

    HRESULT (STDMETHODCALLTYPE *GetHostNames)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics *This,
        __FIVectorView_1_Windows__CNetworking__CHostName **value);

    HRESULT (STDMETHODCALLTYPE *GetProxyConfigurationAsync)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,
        __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration **value);

    HRESULT (STDMETHODCALLTYPE *GetSortedEndpointPairs)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics *This,
        __FIIterable_1_Windows__CNetworking__CEndpointPair *endpoint,
        __x_ABI_CWindows_CNetworking_CHostNameSortOptions options,
        __FIVectorView_1_Windows__CNetworking__CEndpointPair **value);

    HRESULT (STDMETHODCALLTYPE *add_NetworkStatusChanged)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics *This,
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_NetworkStatusChanged)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics *This,
        EventRegistrationToken cookie);

    END_INTERFACE
} __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStaticsVtbl;

interface __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics {
    CONST_VTBL __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** INetworkInformationStatics methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetConnectionProfiles(This,value) (This)->lpVtbl->GetConnectionProfiles(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetInternetConnectionProfile(This,value) (This)->lpVtbl->GetInternetConnectionProfile(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetLanIdentifiers(This,value) (This)->lpVtbl->GetLanIdentifiers(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetHostNames(This,value) (This)->lpVtbl->GetHostNames(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetProxyConfigurationAsync(This,uri,value) (This)->lpVtbl->GetProxyConfigurationAsync(This,uri,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetSortedEndpointPairs(This,endpoint,options,value) (This)->lpVtbl->GetSortedEndpointPairs(This,endpoint,options,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_add_NetworkStatusChanged(This,handler,cookie) (This)->lpVtbl->add_NetworkStatusChanged(This,handler,cookie)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_remove_NetworkStatusChanged(This,cookie) (This)->lpVtbl->remove_NetworkStatusChanged(This,cookie)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_QueryInterface(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_AddRef(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_Release(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetIids(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetRuntimeClassName(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetTrustLevel(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** INetworkInformationStatics methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetConnectionProfiles(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics* This,__FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile **value) {
    return This->lpVtbl->GetConnectionProfiles(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetInternetConnectionProfile(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics* This,__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile **value) {
    return This->lpVtbl->GetInternetConnectionProfile(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetLanIdentifiers(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics* This,__FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier **value) {
    return This->lpVtbl->GetLanIdentifiers(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetHostNames(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics* This,__FIVectorView_1_Windows__CNetworking__CHostName **value) {
    return This->lpVtbl->GetHostNames(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetProxyConfigurationAsync(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration **value) {
    return This->lpVtbl->GetProxyConfigurationAsync(This,uri,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetSortedEndpointPairs(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics* This,__FIIterable_1_Windows__CNetworking__CEndpointPair *endpoint,__x_ABI_CWindows_CNetworking_CHostNameSortOptions options,__FIVectorView_1_Windows__CNetworking__CEndpointPair **value) {
    return This->lpVtbl->GetSortedEndpointPairs(This,endpoint,options,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_add_NetworkStatusChanged(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics* This,__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkStatusChangedEventHandler *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_NetworkStatusChanged(This,handler,cookie);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_remove_NetworkStatusChanged(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_NetworkStatusChanged(This,cookie);
}
#endif
#ifdef WIDL_using_Windows_Networking_Connectivity
#define IID_INetworkInformationStatics IID___x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics
#define INetworkInformationStaticsVtbl __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStaticsVtbl
#define INetworkInformationStatics __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics
#define INetworkInformationStatics_QueryInterface __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_QueryInterface
#define INetworkInformationStatics_AddRef __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_AddRef
#define INetworkInformationStatics_Release __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_Release
#define INetworkInformationStatics_GetIids __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetIids
#define INetworkInformationStatics_GetRuntimeClassName __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetRuntimeClassName
#define INetworkInformationStatics_GetTrustLevel __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetTrustLevel
#define INetworkInformationStatics_GetConnectionProfiles __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetConnectionProfiles
#define INetworkInformationStatics_GetInternetConnectionProfile __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetInternetConnectionProfile
#define INetworkInformationStatics_GetLanIdentifiers __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetLanIdentifiers
#define INetworkInformationStatics_GetHostNames __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetHostNames
#define INetworkInformationStatics_GetProxyConfigurationAsync __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetProxyConfigurationAsync
#define INetworkInformationStatics_GetSortedEndpointPairs __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_GetSortedEndpointPairs
#define INetworkInformationStatics_add_NetworkStatusChanged __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_add_NetworkStatusChanged
#define INetworkInformationStatics_remove_NetworkStatusChanged __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkInformationStatics_remove_NetworkStatusChanged
#endif /* WIDL_using_Windows_Networking_Connectivity */
#endif

#endif

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

/*****************************************************************************
 * INetworkItem interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem, 0x01bc4d39, 0xf5e0, 0x4567, 0xa2,0x8c, 0x42,0x08,0x0c,0x83,0x1b,0x2b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                MIDL_INTERFACE("01bc4d39-f5e0-4567-a28c-42080c831b2b")
                INetworkItem : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_NetworkId(
                        GUID *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetNetworkTypes(
                        ABI::Windows::Networking::Connectivity::NetworkTypes *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem, 0x01bc4d39, 0xf5e0, 0x4567, 0xa2,0x8c, 0x42,0x08,0x0c,0x83,0x1b,0x2b)
#endif
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItemVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** INetworkItem methods ***/
    HRESULT (STDMETHODCALLTYPE *get_NetworkId)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem *This,
        GUID *value);

    HRESULT (STDMETHODCALLTYPE *GetNetworkTypes)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem *This,
        __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkTypes *value);

    END_INTERFACE
} __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItemVtbl;

interface __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem {
    CONST_VTBL __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** INetworkItem methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_get_NetworkId(This,value) (This)->lpVtbl->get_NetworkId(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_GetNetworkTypes(This,value) (This)->lpVtbl->GetNetworkTypes(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_QueryInterface(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_AddRef(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_Release(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_GetIids(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_GetRuntimeClassName(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_GetTrustLevel(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** INetworkItem methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_get_NetworkId(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem* This,GUID *value) {
    return This->lpVtbl->get_NetworkId(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_GetNetworkTypes(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem* This,__x_ABI_CWindows_CNetworking_CConnectivity_CNetworkTypes *value) {
    return This->lpVtbl->GetNetworkTypes(This,value);
}
#endif
#ifdef WIDL_using_Windows_Networking_Connectivity
#define IID_INetworkItem IID___x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem
#define INetworkItemVtbl __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItemVtbl
#define INetworkItem __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem
#define INetworkItem_QueryInterface __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_QueryInterface
#define INetworkItem_AddRef __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_AddRef
#define INetworkItem_Release __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_Release
#define INetworkItem_GetIids __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_GetIids
#define INetworkItem_GetRuntimeClassName __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_GetRuntimeClassName
#define INetworkItem_GetTrustLevel __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_GetTrustLevel
#define INetworkItem_get_NetworkId __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_get_NetworkId
#define INetworkItem_GetNetworkTypes __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkItem_GetNetworkTypes
#endif /* WIDL_using_Windows_Networking_Connectivity */
#endif

#endif

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

/*****************************************************************************
 * INetworkSecuritySettings interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings, 0x7ca07e8d, 0x917b, 0x4b5f, 0xb8,0x4d, 0x28,0xf7,0xa5,0xac,0x54,0x02);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                MIDL_INTERFACE("7ca07e8d-917b-4b5f-b84d-28f7a5ac5402")
                INetworkSecuritySettings : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_NetworkAuthenticationType(
                        ABI::Windows::Networking::Connectivity::NetworkAuthenticationType *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_NetworkEncryptionType(
                        ABI::Windows::Networking::Connectivity::NetworkEncryptionType *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings, 0x7ca07e8d, 0x917b, 0x4b5f, 0xb8,0x4d, 0x28,0xf7,0xa5,0xac,0x54,0x02)
#endif
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettingsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** INetworkSecuritySettings methods ***/
    HRESULT (STDMETHODCALLTYPE *get_NetworkAuthenticationType)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings *This,
        __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkAuthenticationType *value);

    HRESULT (STDMETHODCALLTYPE *get_NetworkEncryptionType)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings *This,
        __x_ABI_CWindows_CNetworking_CConnectivity_CNetworkEncryptionType *value);

    END_INTERFACE
} __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettingsVtbl;

interface __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings {
    CONST_VTBL __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettingsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** INetworkSecuritySettings methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_get_NetworkAuthenticationType(This,value) (This)->lpVtbl->get_NetworkAuthenticationType(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_get_NetworkEncryptionType(This,value) (This)->lpVtbl->get_NetworkEncryptionType(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_QueryInterface(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_AddRef(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_Release(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_GetIids(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_GetRuntimeClassName(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_GetTrustLevel(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** INetworkSecuritySettings methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_get_NetworkAuthenticationType(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings* This,__x_ABI_CWindows_CNetworking_CConnectivity_CNetworkAuthenticationType *value) {
    return This->lpVtbl->get_NetworkAuthenticationType(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_get_NetworkEncryptionType(__x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings* This,__x_ABI_CWindows_CNetworking_CConnectivity_CNetworkEncryptionType *value) {
    return This->lpVtbl->get_NetworkEncryptionType(This,value);
}
#endif
#ifdef WIDL_using_Windows_Networking_Connectivity
#define IID_INetworkSecuritySettings IID___x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings
#define INetworkSecuritySettingsVtbl __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettingsVtbl
#define INetworkSecuritySettings __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings
#define INetworkSecuritySettings_QueryInterface __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_QueryInterface
#define INetworkSecuritySettings_AddRef __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_AddRef
#define INetworkSecuritySettings_Release __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_Release
#define INetworkSecuritySettings_GetIids __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_GetIids
#define INetworkSecuritySettings_GetRuntimeClassName __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_GetRuntimeClassName
#define INetworkSecuritySettings_GetTrustLevel __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_GetTrustLevel
#define INetworkSecuritySettings_get_NetworkAuthenticationType __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_get_NetworkAuthenticationType
#define INetworkSecuritySettings_get_NetworkEncryptionType __x_ABI_CWindows_CNetworking_CConnectivity_CINetworkSecuritySettings_get_NetworkEncryptionType
#endif /* WIDL_using_Windows_Networking_Connectivity */
#endif

#endif

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

/*****************************************************************************
 * IProxyConfiguration interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration, 0xef3a60b4, 0x9004, 0x4dd6, 0xb7,0xd8, 0xb3,0xe5,0x02,0xf4,0xaa,0xd0);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Networking {
            namespace Connectivity {
                MIDL_INTERFACE("ef3a60b4-9004-4dd6-b7d8-b3e502f4aad0")
                IProxyConfiguration : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ProxyUris(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Foundation::Uri* > **value) = 0;

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

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration, 0xef3a60b4, 0x9004, 0x4dd6, 0xb7,0xd8, 0xb3,0xe5,0x02,0xf4,0xaa,0xd0)
#endif
#else
typedef struct __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfigurationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IProxyConfiguration methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ProxyUris)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration *This,
        __FIVectorView_1_Windows__CFoundation__CUri **value);

    HRESULT (STDMETHODCALLTYPE *get_CanConnectDirectly)(
        __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration *This,
        boolean *value);

    END_INTERFACE
} __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfigurationVtbl;

interface __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration {
    CONST_VTBL __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfigurationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IProxyConfiguration methods ***/
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_get_ProxyUris(This,value) (This)->lpVtbl->get_ProxyUris(This,value)
#define __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_get_CanConnectDirectly(This,value) (This)->lpVtbl->get_CanConnectDirectly(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_QueryInterface(__x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_AddRef(__x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_Release(__x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_GetIids(__x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_GetRuntimeClassName(__x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_GetTrustLevel(__x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IProxyConfiguration methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_get_ProxyUris(__x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration* This,__FIVectorView_1_Windows__CFoundation__CUri **value) {
    return This->lpVtbl->get_ProxyUris(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_get_CanConnectDirectly(__x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration* This,boolean *value) {
    return This->lpVtbl->get_CanConnectDirectly(This,value);
}
#endif
#ifdef WIDL_using_Windows_Networking_Connectivity
#define IID_IProxyConfiguration IID___x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration
#define IProxyConfigurationVtbl __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfigurationVtbl
#define IProxyConfiguration __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration
#define IProxyConfiguration_QueryInterface __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_QueryInterface
#define IProxyConfiguration_AddRef __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_AddRef
#define IProxyConfiguration_Release __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_Release
#define IProxyConfiguration_GetIids __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_GetIids
#define IProxyConfiguration_GetRuntimeClassName __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_GetRuntimeClassName
#define IProxyConfiguration_GetTrustLevel __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_GetTrustLevel
#define IProxyConfiguration_get_ProxyUris __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_get_ProxyUris
#define IProxyConfiguration_get_CanConnectDirectly __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration_get_CanConnectDirectly
#endif /* WIDL_using_Windows_Networking_Connectivity */
#endif

#endif

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

/*
 * Class Windows.Networking.Connectivity.ConnectionCost
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Networking_Connectivity_ConnectionCost_DEFINED
#define RUNTIMECLASS_Windows_Networking_Connectivity_ConnectionCost_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Networking_Connectivity_ConnectionCost[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','C','o','n','n','e','c','t','i','o','n','C','o','s','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_ConnectionCost[] = L"Windows.Networking.Connectivity.ConnectionCost";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_ConnectionCost[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','C','o','n','n','e','c','t','i','o','n','C','o','s','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Networking_Connectivity_ConnectionCost_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Networking.Connectivity.ConnectionProfile
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Networking_Connectivity_ConnectionProfile_DEFINED
#define RUNTIMECLASS_Windows_Networking_Connectivity_ConnectionProfile_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Networking_Connectivity_ConnectionProfile[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','C','o','n','n','e','c','t','i','o','n','P','r','o','f','i','l','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_ConnectionProfile[] = L"Windows.Networking.Connectivity.ConnectionProfile";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_ConnectionProfile[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','C','o','n','n','e','c','t','i','o','n','P','r','o','f','i','l','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_Networking_Connectivity_ConnectionProfile_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Networking.Connectivity.DataPlanStatus
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Networking_Connectivity_DataPlanStatus_DEFINED
#define RUNTIMECLASS_Windows_Networking_Connectivity_DataPlanStatus_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Networking_Connectivity_DataPlanStatus[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','D','a','t','a','P','l','a','n','S','t','a','t','u','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_DataPlanStatus[] = L"Windows.Networking.Connectivity.DataPlanStatus";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_DataPlanStatus[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','D','a','t','a','P','l','a','n','S','t','a','t','u','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_Networking_Connectivity_DataPlanStatus_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Networking.Connectivity.DataPlanUsage
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Networking_Connectivity_DataPlanUsage_DEFINED
#define RUNTIMECLASS_Windows_Networking_Connectivity_DataPlanUsage_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Networking_Connectivity_DataPlanUsage[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','D','a','t','a','P','l','a','n','U','s','a','g','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_DataPlanUsage[] = L"Windows.Networking.Connectivity.DataPlanUsage";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_DataPlanUsage[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','D','a','t','a','P','l','a','n','U','s','a','g','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_Networking_Connectivity_DataPlanUsage_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Networking.Connectivity.DataUsage
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Networking_Connectivity_DataUsage_DEFINED
#define RUNTIMECLASS_Windows_Networking_Connectivity_DataUsage_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Networking_Connectivity_DataUsage[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','D','a','t','a','U','s','a','g','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_DataUsage[] = L"Windows.Networking.Connectivity.DataUsage";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_DataUsage[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','D','a','t','a','U','s','a','g','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_Networking_Connectivity_DataUsage_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Networking.Connectivity.IPInformation
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Networking_Connectivity_IPInformation_DEFINED
#define RUNTIMECLASS_Windows_Networking_Connectivity_IPInformation_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Networking_Connectivity_IPInformation[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','I','P','I','n','f','o','r','m','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_IPInformation[] = L"Windows.Networking.Connectivity.IPInformation";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_IPInformation[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','I','P','I','n','f','o','r','m','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_Networking_Connectivity_IPInformation_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Networking.Connectivity.LanIdentifier
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Networking_Connectivity_LanIdentifier_DEFINED
#define RUNTIMECLASS_Windows_Networking_Connectivity_LanIdentifier_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Networking_Connectivity_LanIdentifier[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','L','a','n','I','d','e','n','t','i','f','i','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_LanIdentifier[] = L"Windows.Networking.Connectivity.LanIdentifier";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_LanIdentifier[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','L','a','n','I','d','e','n','t','i','f','i','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_Networking_Connectivity_LanIdentifier_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Networking.Connectivity.LanIdentifierData
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Networking_Connectivity_LanIdentifierData_DEFINED
#define RUNTIMECLASS_Windows_Networking_Connectivity_LanIdentifierData_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Networking_Connectivity_LanIdentifierData[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','L','a','n','I','d','e','n','t','i','f','i','e','r','D','a','t','a',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_LanIdentifierData[] = L"Windows.Networking.Connectivity.LanIdentifierData";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_LanIdentifierData[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','L','a','n','I','d','e','n','t','i','f','i','e','r','D','a','t','a',0};
#endif
#endif /* RUNTIMECLASS_Windows_Networking_Connectivity_LanIdentifierData_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Networking.Connectivity.NetworkAdapter
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Networking_Connectivity_NetworkAdapter_DEFINED
#define RUNTIMECLASS_Windows_Networking_Connectivity_NetworkAdapter_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Networking_Connectivity_NetworkAdapter[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','N','e','t','w','o','r','k','A','d','a','p','t','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_NetworkAdapter[] = L"Windows.Networking.Connectivity.NetworkAdapter";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_NetworkAdapter[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','N','e','t','w','o','r','k','A','d','a','p','t','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_Networking_Connectivity_NetworkAdapter_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Networking.Connectivity.NetworkInformation
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Networking_Connectivity_NetworkInformation_DEFINED
#define RUNTIMECLASS_Windows_Networking_Connectivity_NetworkInformation_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Networking_Connectivity_NetworkInformation[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','N','e','t','w','o','r','k','I','n','f','o','r','m','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_NetworkInformation[] = L"Windows.Networking.Connectivity.NetworkInformation";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_NetworkInformation[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','N','e','t','w','o','r','k','I','n','f','o','r','m','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_Networking_Connectivity_NetworkInformation_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Networking.Connectivity.NetworkItem
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Networking_Connectivity_NetworkItem_DEFINED
#define RUNTIMECLASS_Windows_Networking_Connectivity_NetworkItem_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Networking_Connectivity_NetworkItem[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','N','e','t','w','o','r','k','I','t','e','m',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_NetworkItem[] = L"Windows.Networking.Connectivity.NetworkItem";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_NetworkItem[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','N','e','t','w','o','r','k','I','t','e','m',0};
#endif
#endif /* RUNTIMECLASS_Windows_Networking_Connectivity_NetworkItem_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Networking.Connectivity.NetworkSecuritySettings
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Networking_Connectivity_NetworkSecuritySettings_DEFINED
#define RUNTIMECLASS_Windows_Networking_Connectivity_NetworkSecuritySettings_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Networking_Connectivity_NetworkSecuritySettings[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','N','e','t','w','o','r','k','S','e','c','u','r','i','t','y','S','e','t','t','i','n','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_NetworkSecuritySettings[] = L"Windows.Networking.Connectivity.NetworkSecuritySettings";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_NetworkSecuritySettings[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','N','e','t','w','o','r','k','S','e','c','u','r','i','t','y','S','e','t','t','i','n','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_Networking_Connectivity_NetworkSecuritySettings_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Networking.Connectivity.ProxyConfiguration
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Networking_Connectivity_ProxyConfiguration_DEFINED
#define RUNTIMECLASS_Windows_Networking_Connectivity_ProxyConfiguration_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Networking_Connectivity_ProxyConfiguration[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','P','r','o','x','y','C','o','n','f','i','g','u','r','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_ProxyConfiguration[] = L"Windows.Networking.Connectivity.ProxyConfiguration";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Networking_Connectivity_ProxyConfiguration[] = {'W','i','n','d','o','w','s','.','N','e','t','w','o','r','k','i','n','g','.','C','o','n','n','e','c','t','i','v','i','t','y','.','P','r','o','x','y','C','o','n','f','i','g','u','r','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_Networking_Connectivity_ProxyConfiguration_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Networking::Connectivity::ConnectionProfile* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile, 0xe4f0c96a, 0x0571, 0x59f4, 0xa9,0xa9, 0xaf,0xac,0x3e,0x61,0xca,0xa0);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("e4f0c96a-0571-59f4-a9a9-afac3e61caa0")
            IAsyncOperationCompletedHandler<ABI::Windows::Networking::Connectivity::ConnectionProfile* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Networking::Connectivity::ConnectionProfile*, ABI::Windows::Networking::Connectivity::IConnectionProfile* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile, 0xe4f0c96a, 0x0571, 0x59f4, 0xa9,0xa9, 0xaf,0xac,0x3e,0x61,0xca,0xa0)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfileVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Networking::Connectivity::ConnectionProfile* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile *This,
        __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfileVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfileVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Networking::Connectivity::ConnectionProfile* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile_Release(__FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Networking::Connectivity::ConnectionProfile* > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This,__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_ConnectionProfile IID___FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile
#define IAsyncOperationCompletedHandler_ConnectionProfileVtbl __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfileVtbl
#define IAsyncOperationCompletedHandler_ConnectionProfile __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile
#define IAsyncOperationCompletedHandler_ConnectionProfile_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile_QueryInterface
#define IAsyncOperationCompletedHandler_ConnectionProfile_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile_AddRef
#define IAsyncOperationCompletedHandler_ConnectionProfile_Release __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile_Release
#define IAsyncOperationCompletedHandler_ConnectionProfile_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Networking::Connectivity::ProxyConfiguration* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration, 0x035b2567, 0xefb9, 0x5bc3, 0xb6,0x09, 0xf9,0xa8,0xc2,0x0b,0x70,0x01);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("035b2567-efb9-5bc3-b609-f9a8c20b7001")
            IAsyncOperationCompletedHandler<ABI::Windows::Networking::Connectivity::ProxyConfiguration* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Networking::Connectivity::ProxyConfiguration*, ABI::Windows::Networking::Connectivity::IProxyConfiguration* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration, 0x035b2567, 0xefb9, 0x5bc3, 0xb6,0x09, 0xf9,0xa8,0xc2,0x0b,0x70,0x01)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfigurationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Networking::Connectivity::ProxyConfiguration* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration *This,
        __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfigurationVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfigurationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Networking::Connectivity::ProxyConfiguration* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_Release(__FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Networking::Connectivity::ProxyConfiguration* > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration* This,__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_ProxyConfiguration IID___FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration
#define IAsyncOperationCompletedHandler_ProxyConfigurationVtbl __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfigurationVtbl
#define IAsyncOperationCompletedHandler_ProxyConfiguration __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration
#define IAsyncOperationCompletedHandler_ProxyConfiguration_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_QueryInterface
#define IAsyncOperationCompletedHandler_ProxyConfiguration_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_AddRef
#define IAsyncOperationCompletedHandler_ProxyConfiguration_Release __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_Release
#define IAsyncOperationCompletedHandler_ProxyConfiguration_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Networking::Connectivity::ConnectionProfile* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile, 0x5bf519ca, 0x8adb, 0x5ab5, 0xab,0xb8, 0xff,0x1b,0xbe,0x5d,0x2d,0xe8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("5bf519ca-8adb-5ab5-abb8-ff1bbe5d2de8")
            IAsyncOperation<ABI::Windows::Networking::Connectivity::ConnectionProfile* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Networking::Connectivity::ConnectionProfile*, ABI::Windows::Networking::Connectivity::IConnectionProfile* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile, 0x5bf519ca, 0x8adb, 0x5ab5, 0xab,0xb8, 0xff,0x1b,0xbe,0x5d,0x2d,0xe8)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfileVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::Networking::Connectivity::ConnectionProfile* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile *This,
        __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfileVtbl;

interface __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile {
    CONST_VTBL __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfileVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Networking::Connectivity::ConnectionProfile* > methods ***/
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_QueryInterface(__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_AddRef(__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_Release(__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetIids(__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetTrustLevel(__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Networking::Connectivity::ConnectionProfile* > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_put_Completed(__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This,__FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_get_Completed(__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This,__FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CConnectionProfile **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetResults(__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This,__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_ConnectionProfile IID___FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile
#define IAsyncOperation_ConnectionProfileVtbl __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfileVtbl
#define IAsyncOperation_ConnectionProfile __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile
#define IAsyncOperation_ConnectionProfile_QueryInterface __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_QueryInterface
#define IAsyncOperation_ConnectionProfile_AddRef __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_AddRef
#define IAsyncOperation_ConnectionProfile_Release __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_Release
#define IAsyncOperation_ConnectionProfile_GetIids __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetIids
#define IAsyncOperation_ConnectionProfile_GetRuntimeClassName __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetRuntimeClassName
#define IAsyncOperation_ConnectionProfile_GetTrustLevel __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetTrustLevel
#define IAsyncOperation_ConnectionProfile_put_Completed __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_put_Completed
#define IAsyncOperation_ConnectionProfile_get_Completed __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_get_Completed
#define IAsyncOperation_ConnectionProfile_GetResults __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CConnectionProfile_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Networking::Connectivity::ProxyConfiguration* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration, 0x1e7651f6, 0x6562, 0x59c7, 0x9a,0xf3, 0x87,0x56,0x63,0x6e,0xee,0xe2);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("1e7651f6-6562-59c7-9af3-8756636eeee2")
            IAsyncOperation<ABI::Windows::Networking::Connectivity::ProxyConfiguration* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Networking::Connectivity::ProxyConfiguration*, ABI::Windows::Networking::Connectivity::IProxyConfiguration* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration, 0x1e7651f6, 0x6562, 0x59c7, 0x9a,0xf3, 0x87,0x56,0x63,0x6e,0xee,0xe2)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfigurationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::Networking::Connectivity::ProxyConfiguration* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration *This,
        __x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfigurationVtbl;

interface __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration {
    CONST_VTBL __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfigurationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Networking::Connectivity::ProxyConfiguration* > methods ***/
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_QueryInterface(__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_AddRef(__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_Release(__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_GetIids(__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_GetTrustLevel(__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Networking::Connectivity::ProxyConfiguration* > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_put_Completed(__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration* This,__FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_get_Completed(__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration* This,__FIAsyncOperationCompletedHandler_1_Windows__CNetworking__CConnectivity__CProxyConfiguration **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_GetResults(__FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration* This,__x_ABI_CWindows_CNetworking_CConnectivity_CIProxyConfiguration **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_ProxyConfiguration IID___FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration
#define IAsyncOperation_ProxyConfigurationVtbl __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfigurationVtbl
#define IAsyncOperation_ProxyConfiguration __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration
#define IAsyncOperation_ProxyConfiguration_QueryInterface __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_QueryInterface
#define IAsyncOperation_ProxyConfiguration_AddRef __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_AddRef
#define IAsyncOperation_ProxyConfiguration_Release __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_Release
#define IAsyncOperation_ProxyConfiguration_GetIids __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_GetIids
#define IAsyncOperation_ProxyConfiguration_GetRuntimeClassName __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_GetRuntimeClassName
#define IAsyncOperation_ProxyConfiguration_GetTrustLevel __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_GetTrustLevel
#define IAsyncOperation_ProxyConfiguration_put_Completed __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_put_Completed
#define IAsyncOperation_ProxyConfiguration_get_Completed __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_get_Completed
#define IAsyncOperation_ProxyConfiguration_GetResults __FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CNetworking__CConnectivity__CProxyConfiguration_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::Networking::EndpointPair* > interface
 */
#ifndef ____FIIterable_1_Windows__CNetworking__CEndpointPair_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CNetworking__CEndpointPair_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CNetworking__CEndpointPair, 0xd7ec83c4, 0xa17b, 0x51bf, 0x89,0x97, 0xaa,0x33,0xb9,0x10,0x2d,0xc9);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("d7ec83c4-a17b-51bf-8997-aa33b9102dc9")
                IIterable<ABI::Windows::Networking::EndpointPair* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Networking::EndpointPair*, ABI::Windows::Networking::IEndpointPair* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CNetworking__CEndpointPair, 0xd7ec83c4, 0xa17b, 0x51bf, 0x89,0x97, 0xaa,0x33,0xb9,0x10,0x2d,0xc9)
#endif
#else
typedef struct __FIIterable_1_Windows__CNetworking__CEndpointPairVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Networking::EndpointPair* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CNetworking__CEndpointPair *This,
        __FIIterator_1_Windows__CNetworking__CEndpointPair **value);

    END_INTERFACE
} __FIIterable_1_Windows__CNetworking__CEndpointPairVtbl;

interface __FIIterable_1_Windows__CNetworking__CEndpointPair {
    CONST_VTBL __FIIterable_1_Windows__CNetworking__CEndpointPairVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CNetworking__CEndpointPair_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CNetworking__CEndpointPair_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CNetworking__CEndpointPair_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CNetworking__CEndpointPair_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CNetworking__CEndpointPair_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CNetworking__CEndpointPair_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Networking::EndpointPair* > methods ***/
#define __FIIterable_1_Windows__CNetworking__CEndpointPair_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CNetworking__CEndpointPair_QueryInterface(__FIIterable_1_Windows__CNetworking__CEndpointPair* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CNetworking__CEndpointPair_AddRef(__FIIterable_1_Windows__CNetworking__CEndpointPair* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CNetworking__CEndpointPair_Release(__FIIterable_1_Windows__CNetworking__CEndpointPair* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CNetworking__CEndpointPair_GetIids(__FIIterable_1_Windows__CNetworking__CEndpointPair* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CNetworking__CEndpointPair_GetRuntimeClassName(__FIIterable_1_Windows__CNetworking__CEndpointPair* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CNetworking__CEndpointPair_GetTrustLevel(__FIIterable_1_Windows__CNetworking__CEndpointPair* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Networking::EndpointPair* > methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CNetworking__CEndpointPair_First(__FIIterable_1_Windows__CNetworking__CEndpointPair* This,__FIIterator_1_Windows__CNetworking__CEndpointPair **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_EndpointPair IID___FIIterable_1_Windows__CNetworking__CEndpointPair
#define IIterable_EndpointPairVtbl __FIIterable_1_Windows__CNetworking__CEndpointPairVtbl
#define IIterable_EndpointPair __FIIterable_1_Windows__CNetworking__CEndpointPair
#define IIterable_EndpointPair_QueryInterface __FIIterable_1_Windows__CNetworking__CEndpointPair_QueryInterface
#define IIterable_EndpointPair_AddRef __FIIterable_1_Windows__CNetworking__CEndpointPair_AddRef
#define IIterable_EndpointPair_Release __FIIterable_1_Windows__CNetworking__CEndpointPair_Release
#define IIterable_EndpointPair_GetIids __FIIterable_1_Windows__CNetworking__CEndpointPair_GetIids
#define IIterable_EndpointPair_GetRuntimeClassName __FIIterable_1_Windows__CNetworking__CEndpointPair_GetRuntimeClassName
#define IIterable_EndpointPair_GetTrustLevel __FIIterable_1_Windows__CNetworking__CEndpointPair_GetTrustLevel
#define IIterable_EndpointPair_First __FIIterable_1_Windows__CNetworking__CEndpointPair_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CNetworking__CEndpointPair_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Networking::Connectivity::ConnectionProfile* > interface
 */
#ifndef ____FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile, 0x6db1b492, 0x3852, 0x5df8, 0xa2,0x9d, 0x69,0x44,0x00,0x2f,0x58,0xd4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("6db1b492-3852-5df8-a29d-6944002f58d4")
                IVectorView<ABI::Windows::Networking::Connectivity::ConnectionProfile* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Networking::Connectivity::ConnectionProfile*, ABI::Windows::Networking::Connectivity::IConnectionProfile* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile, 0x6db1b492, 0x3852, 0x5df8, 0xa2,0x9d, 0x69,0x44,0x00,0x2f,0x58,0xd4)
#endif
#else
typedef struct __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfileVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::Networking::Connectivity::ConnectionProfile* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile *This,
        UINT32 index,
        __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile *This,
        __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfileVtbl;

interface __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile {
    CONST_VTBL __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfileVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Networking::Connectivity::ConnectionProfile* > methods ***/
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_QueryInterface(__FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_AddRef(__FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_Release(__FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetIids(__FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetRuntimeClassName(__FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetTrustLevel(__FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Networking::Connectivity::ConnectionProfile* > methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetAt(__FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This,UINT32 index,__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_get_Size(__FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_IndexOf(__FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This,__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetMany(__FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CNetworking_CConnectivity_CIConnectionProfile **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_ConnectionProfile IID___FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile
#define IVectorView_ConnectionProfileVtbl __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfileVtbl
#define IVectorView_ConnectionProfile __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile
#define IVectorView_ConnectionProfile_QueryInterface __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_QueryInterface
#define IVectorView_ConnectionProfile_AddRef __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_AddRef
#define IVectorView_ConnectionProfile_Release __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_Release
#define IVectorView_ConnectionProfile_GetIids __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetIids
#define IVectorView_ConnectionProfile_GetRuntimeClassName __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetRuntimeClassName
#define IVectorView_ConnectionProfile_GetTrustLevel __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetTrustLevel
#define IVectorView_ConnectionProfile_GetAt __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetAt
#define IVectorView_ConnectionProfile_get_Size __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_get_Size
#define IVectorView_ConnectionProfile_IndexOf __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_IndexOf
#define IVectorView_ConnectionProfile_GetMany __FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CNetworking__CConnectivity__CConnectionProfile_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Networking::Connectivity::LanIdentifier* > interface
 */
#ifndef ____FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier, 0x41286159, 0xb91d, 0x5736, 0xad,0x8b, 0xe1,0x6f,0xcf,0x8a,0xce,0xd0);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("41286159-b91d-5736-ad8b-e16fcf8aced0")
                IVectorView<ABI::Windows::Networking::Connectivity::LanIdentifier* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Networking::Connectivity::LanIdentifier*, ABI::Windows::Networking::Connectivity::ILanIdentifier* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier, 0x41286159, 0xb91d, 0x5736, 0xad,0x8b, 0xe1,0x6f,0xcf,0x8a,0xce,0xd0)
#endif
#else
typedef struct __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifierVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::Networking::Connectivity::LanIdentifier* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier *This,
        UINT32 index,
        __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier *This,
        __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifierVtbl;

interface __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier {
    CONST_VTBL __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifierVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Networking::Connectivity::LanIdentifier* > methods ***/
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_QueryInterface(__FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_AddRef(__FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_Release(__FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_GetIids(__FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_GetRuntimeClassName(__FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_GetTrustLevel(__FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Networking::Connectivity::LanIdentifier* > methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_GetAt(__FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier* This,UINT32 index,__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_get_Size(__FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_IndexOf(__FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier* This,__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_GetMany(__FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CNetworking_CConnectivity_CILanIdentifier **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_LanIdentifier IID___FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier
#define IVectorView_LanIdentifierVtbl __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifierVtbl
#define IVectorView_LanIdentifier __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier
#define IVectorView_LanIdentifier_QueryInterface __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_QueryInterface
#define IVectorView_LanIdentifier_AddRef __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_AddRef
#define IVectorView_LanIdentifier_Release __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_Release
#define IVectorView_LanIdentifier_GetIids __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_GetIids
#define IVectorView_LanIdentifier_GetRuntimeClassName __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_GetRuntimeClassName
#define IVectorView_LanIdentifier_GetTrustLevel __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_GetTrustLevel
#define IVectorView_LanIdentifier_GetAt __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_GetAt
#define IVectorView_LanIdentifier_get_Size __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_get_Size
#define IVectorView_LanIdentifier_IndexOf __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_IndexOf
#define IVectorView_LanIdentifier_GetMany __FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CNetworking__CConnectivity__CLanIdentifier_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Networking::HostName* > interface
 */
#ifndef ____FIVectorView_1_Windows__CNetworking__CHostName_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CNetworking__CHostName_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CNetworking__CHostName, 0xf4706ab1, 0x55a3, 0x5270, 0xaf,0xb2, 0x73,0x29,0x88,0xfe,0x82,0x27);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("f4706ab1-55a3-5270-afb2-732988fe8227")
                IVectorView<ABI::Windows::Networking::HostName* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Networking::HostName*, ABI::Windows::Networking::IHostName* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CNetworking__CHostName, 0xf4706ab1, 0x55a3, 0x5270, 0xaf,0xb2, 0x73,0x29,0x88,0xfe,0x82,0x27)
#endif
#else
typedef struct __FIVectorView_1_Windows__CNetworking__CHostNameVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::Networking::HostName* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CNetworking__CHostName *This,
        UINT32 index,
        __x_ABI_CWindows_CNetworking_CIHostName **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CNetworking__CHostName *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CNetworking__CHostName *This,
        __x_ABI_CWindows_CNetworking_CIHostName *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CNetworking__CHostName *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CNetworking_CIHostName **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CNetworking__CHostNameVtbl;

interface __FIVectorView_1_Windows__CNetworking__CHostName {
    CONST_VTBL __FIVectorView_1_Windows__CNetworking__CHostNameVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CNetworking__CHostName_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CNetworking__CHostName_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CNetworking__CHostName_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CNetworking__CHostName_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CNetworking__CHostName_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CNetworking__CHostName_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Networking::HostName* > methods ***/
#define __FIVectorView_1_Windows__CNetworking__CHostName_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CNetworking__CHostName_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CNetworking__CHostName_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CNetworking__CHostName_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CHostName_QueryInterface(__FIVectorView_1_Windows__CNetworking__CHostName* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CNetworking__CHostName_AddRef(__FIVectorView_1_Windows__CNetworking__CHostName* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CNetworking__CHostName_Release(__FIVectorView_1_Windows__CNetworking__CHostName* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CHostName_GetIids(__FIVectorView_1_Windows__CNetworking__CHostName* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CHostName_GetRuntimeClassName(__FIVectorView_1_Windows__CNetworking__CHostName* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CHostName_GetTrustLevel(__FIVectorView_1_Windows__CNetworking__CHostName* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Networking::HostName* > methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CHostName_GetAt(__FIVectorView_1_Windows__CNetworking__CHostName* This,UINT32 index,__x_ABI_CWindows_CNetworking_CIHostName **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CHostName_get_Size(__FIVectorView_1_Windows__CNetworking__CHostName* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CHostName_IndexOf(__FIVectorView_1_Windows__CNetworking__CHostName* This,__x_ABI_CWindows_CNetworking_CIHostName *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CHostName_GetMany(__FIVectorView_1_Windows__CNetworking__CHostName* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CNetworking_CIHostName **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_HostName IID___FIVectorView_1_Windows__CNetworking__CHostName
#define IVectorView_HostNameVtbl __FIVectorView_1_Windows__CNetworking__CHostNameVtbl
#define IVectorView_HostName __FIVectorView_1_Windows__CNetworking__CHostName
#define IVectorView_HostName_QueryInterface __FIVectorView_1_Windows__CNetworking__CHostName_QueryInterface
#define IVectorView_HostName_AddRef __FIVectorView_1_Windows__CNetworking__CHostName_AddRef
#define IVectorView_HostName_Release __FIVectorView_1_Windows__CNetworking__CHostName_Release
#define IVectorView_HostName_GetIids __FIVectorView_1_Windows__CNetworking__CHostName_GetIids
#define IVectorView_HostName_GetRuntimeClassName __FIVectorView_1_Windows__CNetworking__CHostName_GetRuntimeClassName
#define IVectorView_HostName_GetTrustLevel __FIVectorView_1_Windows__CNetworking__CHostName_GetTrustLevel
#define IVectorView_HostName_GetAt __FIVectorView_1_Windows__CNetworking__CHostName_GetAt
#define IVectorView_HostName_get_Size __FIVectorView_1_Windows__CNetworking__CHostName_get_Size
#define IVectorView_HostName_IndexOf __FIVectorView_1_Windows__CNetworking__CHostName_IndexOf
#define IVectorView_HostName_GetMany __FIVectorView_1_Windows__CNetworking__CHostName_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CNetworking__CHostName_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Networking::EndpointPair* > interface
 */
#ifndef ____FIVectorView_1_Windows__CNetworking__CEndpointPair_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CNetworking__CEndpointPair_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CNetworking__CEndpointPair, 0x8780a851, 0x6d48, 0x5006, 0x92,0x88, 0x81,0xf3,0xd7,0x04,0x5a,0x96);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("8780a851-6d48-5006-9288-81f3d7045a96")
                IVectorView<ABI::Windows::Networking::EndpointPair* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Networking::EndpointPair*, ABI::Windows::Networking::IEndpointPair* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CNetworking__CEndpointPair, 0x8780a851, 0x6d48, 0x5006, 0x92,0x88, 0x81,0xf3,0xd7,0x04,0x5a,0x96)
#endif
#else
typedef struct __FIVectorView_1_Windows__CNetworking__CEndpointPairVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::Networking::EndpointPair* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CNetworking__CEndpointPair *This,
        UINT32 index,
        __x_ABI_CWindows_CNetworking_CIEndpointPair **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CNetworking__CEndpointPair *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CNetworking__CEndpointPair *This,
        __x_ABI_CWindows_CNetworking_CIEndpointPair *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CNetworking__CEndpointPair *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CNetworking_CIEndpointPair **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CNetworking__CEndpointPairVtbl;

interface __FIVectorView_1_Windows__CNetworking__CEndpointPair {
    CONST_VTBL __FIVectorView_1_Windows__CNetworking__CEndpointPairVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CNetworking__CEndpointPair_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CNetworking__CEndpointPair_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CNetworking__CEndpointPair_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CNetworking__CEndpointPair_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CNetworking__CEndpointPair_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CNetworking__CEndpointPair_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Networking::EndpointPair* > methods ***/
#define __FIVectorView_1_Windows__CNetworking__CEndpointPair_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CNetworking__CEndpointPair_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CNetworking__CEndpointPair_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CNetworking__CEndpointPair_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CEndpointPair_QueryInterface(__FIVectorView_1_Windows__CNetworking__CEndpointPair* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CNetworking__CEndpointPair_AddRef(__FIVectorView_1_Windows__CNetworking__CEndpointPair* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CNetworking__CEndpointPair_Release(__FIVectorView_1_Windows__CNetworking__CEndpointPair* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CEndpointPair_GetIids(__FIVectorView_1_Windows__CNetworking__CEndpointPair* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CEndpointPair_GetRuntimeClassName(__FIVectorView_1_Windows__CNetworking__CEndpointPair* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CEndpointPair_GetTrustLevel(__FIVectorView_1_Windows__CNetworking__CEndpointPair* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Networking::EndpointPair* > methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CEndpointPair_GetAt(__FIVectorView_1_Windows__CNetworking__CEndpointPair* This,UINT32 index,__x_ABI_CWindows_CNetworking_CIEndpointPair **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CEndpointPair_get_Size(__FIVectorView_1_Windows__CNetworking__CEndpointPair* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CEndpointPair_IndexOf(__FIVectorView_1_Windows__CNetworking__CEndpointPair* This,__x_ABI_CWindows_CNetworking_CIEndpointPair *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CNetworking__CEndpointPair_GetMany(__FIVectorView_1_Windows__CNetworking__CEndpointPair* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CNetworking_CIEndpointPair **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_EndpointPair IID___FIVectorView_1_Windows__CNetworking__CEndpointPair
#define IVectorView_EndpointPairVtbl __FIVectorView_1_Windows__CNetworking__CEndpointPairVtbl
#define IVectorView_EndpointPair __FIVectorView_1_Windows__CNetworking__CEndpointPair
#define IVectorView_EndpointPair_QueryInterface __FIVectorView_1_Windows__CNetworking__CEndpointPair_QueryInterface
#define IVectorView_EndpointPair_AddRef __FIVectorView_1_Windows__CNetworking__CEndpointPair_AddRef
#define IVectorView_EndpointPair_Release __FIVectorView_1_Windows__CNetworking__CEndpointPair_Release
#define IVectorView_EndpointPair_GetIids __FIVectorView_1_Windows__CNetworking__CEndpointPair_GetIids
#define IVectorView_EndpointPair_GetRuntimeClassName __FIVectorView_1_Windows__CNetworking__CEndpointPair_GetRuntimeClassName
#define IVectorView_EndpointPair_GetTrustLevel __FIVectorView_1_Windows__CNetworking__CEndpointPair_GetTrustLevel
#define IVectorView_EndpointPair_GetAt __FIVectorView_1_Windows__CNetworking__CEndpointPair_GetAt
#define IVectorView_EndpointPair_get_Size __FIVectorView_1_Windows__CNetworking__CEndpointPair_get_Size
#define IVectorView_EndpointPair_IndexOf __FIVectorView_1_Windows__CNetworking__CEndpointPair_IndexOf
#define IVectorView_EndpointPair_GetMany __FIVectorView_1_Windows__CNetworking__CEndpointPair_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CNetworking__CEndpointPair_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_networking_connectivity_h__ */
