/*** Autogenerated by WIDL 9.8 from include/windows.gaming.input.forcefeedback.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_gaming_input_forcefeedback_h__
#define __windows_gaming_input_forcefeedback_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_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect ABI::Windows::Gaming::Input::ForceFeedback::IForceFeedbackEffect
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    interface IForceFeedbackEffect;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor ABI::Windows::Gaming::Input::ForceFeedback::IForceFeedbackMotor
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    interface IForceFeedbackMotor;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect ABI::Windows::Gaming::Input::ForceFeedback::IPeriodicForceEffect
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    interface IPeriodicForceEffect;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory ABI::Windows::Gaming::Input::ForceFeedback::IPeriodicForceEffectFactory
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    interface IPeriodicForceEffectFactory;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect ABI::Windows::Gaming::Input::ForceFeedback::IConditionForceEffect
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    interface IConditionForceEffect;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory ABI::Windows::Gaming::Input::ForceFeedback::IConditionForceEffectFactory
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    interface IConditionForceEffectFactory;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect ABI::Windows::Gaming::Input::ForceFeedback::IConstantForceEffect
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    interface IConstantForceEffect;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect ABI::Windows::Gaming::Input::ForceFeedback::IRampForceEffect
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    interface IRampForceEffect;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CForceFeedbackMotor_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CForceFeedbackMotor_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    class ForceFeedbackMotor;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CForceFeedbackMotor __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CForceFeedbackMotor;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CForceFeedbackMotor_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CPeriodicForceEffect_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CPeriodicForceEffect_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    class PeriodicForceEffect;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CPeriodicForceEffect __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CPeriodicForceEffect;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CPeriodicForceEffect_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CConditionForceEffect_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CConditionForceEffect_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    class ConditionForceEffect;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CConditionForceEffect __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CConditionForceEffect;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CConditionForceEffect_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CConstantForceEffect_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CConstantForceEffect_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    class ConstantForceEffect;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CConstantForceEffect __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CConstantForceEffect;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CConstantForceEffect_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CRampForceEffect_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CRampForceEffect_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    class RampForceEffect;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CRampForceEffect __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CRampForceEffect;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CRampForceEffect_FWD_DEFINED__ */

#ifndef ____FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackLoadEffectResult >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_ForceFeedbackLoadEffectResult_FWD_DEFINED__
#define ____FIAsyncOperation_1_ForceFeedbackLoadEffectResult_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_ForceFeedbackLoadEffectResult __FIAsyncOperation_1_ForceFeedbackLoadEffectResult;
#ifdef __cplusplus
#define __FIAsyncOperation_1_ForceFeedbackLoadEffectResult ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackLoadEffectResult >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_FWD_DEFINED__
#define ____FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_FWD_DEFINED__
#define ____FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_FWD_DEFINED__
#define ____FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor;
#ifdef __cplusplus
#define __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* >
#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.foundation.numerics.h>

#ifdef __cplusplus
extern "C" {
#endif

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

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

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

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

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

#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect ABI::Windows::Gaming::Input::ForceFeedback::IForceFeedbackEffect
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    interface IForceFeedbackEffect;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect ABI::Windows::Gaming::Input::ForceFeedback::IPeriodicForceEffect
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    interface IPeriodicForceEffect;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory ABI::Windows::Gaming::Input::ForceFeedback::IPeriodicForceEffectFactory
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    interface IPeriodicForceEffectFactory;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect ABI::Windows::Gaming::Input::ForceFeedback::IConditionForceEffect
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    interface IConditionForceEffect;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory ABI::Windows::Gaming::Input::ForceFeedback::IConditionForceEffectFactory
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    interface IConditionForceEffectFactory;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect ABI::Windows::Gaming::Input::ForceFeedback::IConstantForceEffect
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    interface IConstantForceEffect;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect ABI::Windows::Gaming::Input::ForceFeedback::IRampForceEffect
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    interface IRampForceEffect;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_ForceFeedbackLoadEffectResult_FWD_DEFINED__
#define ____FIAsyncOperation_1_ForceFeedbackLoadEffectResult_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_ForceFeedbackLoadEffectResult __FIAsyncOperation_1_ForceFeedbackLoadEffectResult;
#ifdef __cplusplus
#define __FIAsyncOperation_1_ForceFeedbackLoadEffectResult ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackLoadEffectResult >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_FWD_DEFINED__
#define ____FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_FWD_DEFINED__
#define ____FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_FWD_DEFINED__
#define ____FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor;
#ifdef __cplusplus
#define __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    enum ForceFeedbackEffectAxes {
                        ForceFeedbackEffectAxes_None = 0x0,
                        ForceFeedbackEffectAxes_X = 0x1,
                        ForceFeedbackEffectAxes_Y = 0x2,
                        ForceFeedbackEffectAxes_Z = 0x4
                    };
                }
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CForceFeedbackEffectAxes {
    ForceFeedbackEffectAxes_None = 0x0,
    ForceFeedbackEffectAxes_X = 0x1,
    ForceFeedbackEffectAxes_Y = 0x2,
    ForceFeedbackEffectAxes_Z = 0x4
};
#ifdef WIDL_using_Windows_Gaming_Input_ForceFeedback
#define ForceFeedbackEffectAxes __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CForceFeedbackEffectAxes
#endif /* WIDL_using_Windows_Gaming_Input_ForceFeedback */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    enum ForceFeedbackEffectState {
                        ForceFeedbackEffectState_Stopped = 0,
                        ForceFeedbackEffectState_Running = 1,
                        ForceFeedbackEffectState_Paused = 2,
                        ForceFeedbackEffectState_Faulted = 3
                    };
                }
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CForceFeedbackEffectState {
    ForceFeedbackEffectState_Stopped = 0,
    ForceFeedbackEffectState_Running = 1,
    ForceFeedbackEffectState_Paused = 2,
    ForceFeedbackEffectState_Faulted = 3
};
#ifdef WIDL_using_Windows_Gaming_Input_ForceFeedback
#define ForceFeedbackEffectState __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CForceFeedbackEffectState
#endif /* WIDL_using_Windows_Gaming_Input_ForceFeedback */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    enum ForceFeedbackLoadEffectResult {
                        ForceFeedbackLoadEffectResult_Succeeded = 0,
                        ForceFeedbackLoadEffectResult_EffectStorageFull = 1,
                        ForceFeedbackLoadEffectResult_EffectNotSupported = 2
                    };
                }
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CForceFeedbackLoadEffectResult {
    ForceFeedbackLoadEffectResult_Succeeded = 0,
    ForceFeedbackLoadEffectResult_EffectStorageFull = 1,
    ForceFeedbackLoadEffectResult_EffectNotSupported = 2
};
#ifdef WIDL_using_Windows_Gaming_Input_ForceFeedback
#define ForceFeedbackLoadEffectResult __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CForceFeedbackLoadEffectResult
#endif /* WIDL_using_Windows_Gaming_Input_ForceFeedback */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    enum PeriodicForceEffectKind {
                        PeriodicForceEffectKind_SquareWave = 0,
                        PeriodicForceEffectKind_SineWave = 1,
                        PeriodicForceEffectKind_TriangleWave = 2,
                        PeriodicForceEffectKind_SawtoothWaveUp = 3,
                        PeriodicForceEffectKind_SawtoothWaveDown = 4
                    };
                }
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CPeriodicForceEffectKind {
    PeriodicForceEffectKind_SquareWave = 0,
    PeriodicForceEffectKind_SineWave = 1,
    PeriodicForceEffectKind_TriangleWave = 2,
    PeriodicForceEffectKind_SawtoothWaveUp = 3,
    PeriodicForceEffectKind_SawtoothWaveDown = 4
};
#ifdef WIDL_using_Windows_Gaming_Input_ForceFeedback
#define PeriodicForceEffectKind __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CPeriodicForceEffectKind
#endif /* WIDL_using_Windows_Gaming_Input_ForceFeedback */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    enum ConditionForceEffectKind {
                        ConditionForceEffectKind_Spring = 0,
                        ConditionForceEffectKind_Damper = 1,
                        ConditionForceEffectKind_Inertia = 2,
                        ConditionForceEffectKind_Friction = 3
                    };
                }
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CConditionForceEffectKind {
    ConditionForceEffectKind_Spring = 0,
    ConditionForceEffectKind_Damper = 1,
    ConditionForceEffectKind_Inertia = 2,
    ConditionForceEffectKind_Friction = 3
};
#ifdef WIDL_using_Windows_Gaming_Input_ForceFeedback
#define ConditionForceEffectKind __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CConditionForceEffectKind
#endif /* WIDL_using_Windows_Gaming_Input_ForceFeedback */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
/*****************************************************************************
 * IForceFeedbackEffect interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect, 0xa17fba0c, 0x2ae4, 0x48c2, 0x80,0x63, 0xea,0xbd,0x07,0x77,0xcb,0x89);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    MIDL_INTERFACE("a17fba0c-2ae4-48c2-8063-eabd0777cb89")
                    IForceFeedbackEffect : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Gain(
                            DOUBLE *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_Gain(
                            DOUBLE value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_State(
                            enum ForceFeedbackEffectState *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE Start(
                            ) = 0;

                        virtual HRESULT STDMETHODCALLTYPE Stop(
                            ) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect, 0xa17fba0c, 0x2ae4, 0x48c2, 0x80,0x63, 0xea,0xbd,0x07,0x77,0xcb,0x89)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffectVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IForceFeedbackEffect methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Gain)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect *This,
        DOUBLE *value);

    HRESULT (STDMETHODCALLTYPE *put_Gain)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect *This,
        DOUBLE value);

    HRESULT (STDMETHODCALLTYPE *get_State)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect *This,
        enum __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CForceFeedbackEffectState *value);

    HRESULT (STDMETHODCALLTYPE *Start)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect *This);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect *This);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffectVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IForceFeedbackEffect methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_get_Gain(This,value) (This)->lpVtbl->get_Gain(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_put_Gain(This,value) (This)->lpVtbl->put_Gain(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_get_State(This,value) (This)->lpVtbl->get_State(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_Start(This) (This)->lpVtbl->Start(This)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_Stop(This) (This)->lpVtbl->Stop(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_AddRef(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_Release(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_GetIids(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IForceFeedbackEffect methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_get_Gain(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect* This,DOUBLE *value) {
    return This->lpVtbl->get_Gain(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_put_Gain(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect* This,DOUBLE value) {
    return This->lpVtbl->put_Gain(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_get_State(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect* This,enum __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CForceFeedbackEffectState *value) {
    return This->lpVtbl->get_State(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_Start(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect* This) {
    return This->lpVtbl->Start(This);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_Stop(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect* This) {
    return This->lpVtbl->Stop(This);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input_ForceFeedback
#define IID_IForceFeedbackEffect IID___x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect
#define IForceFeedbackEffectVtbl __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffectVtbl
#define IForceFeedbackEffect __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect
#define IForceFeedbackEffect_QueryInterface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_QueryInterface
#define IForceFeedbackEffect_AddRef __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_AddRef
#define IForceFeedbackEffect_Release __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_Release
#define IForceFeedbackEffect_GetIids __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_GetIids
#define IForceFeedbackEffect_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_GetRuntimeClassName
#define IForceFeedbackEffect_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_GetTrustLevel
#define IForceFeedbackEffect_get_Gain __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_get_Gain
#define IForceFeedbackEffect_put_Gain __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_put_Gain
#define IForceFeedbackEffect_get_State __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_get_State
#define IForceFeedbackEffect_Start __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_Start
#define IForceFeedbackEffect_Stop __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect_Stop
#endif /* WIDL_using_Windows_Gaming_Input_ForceFeedback */
#endif

#endif

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

/*****************************************************************************
 * IForceFeedbackMotor interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor, 0x8d3d417c, 0xa5ea, 0x4516, 0x80,0x26, 0x2b,0x00,0xf7,0x4e,0xf6,0xe5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    MIDL_INTERFACE("8d3d417c-a5ea-4516-8026-2b00f74ef6e5")
                    IForceFeedbackMotor : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_AreEffectsPaused(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_MasterGain(
                            DOUBLE *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_MasterGain(
                            DOUBLE value) = 0;

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

                        virtual HRESULT STDMETHODCALLTYPE get_SupportedAxes(
                            enum ForceFeedbackEffectAxes *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE LoadEffectAsync(
                            ABI::Windows::Gaming::Input::ForceFeedback::IForceFeedbackEffect *effect,
                            ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackLoadEffectResult > **async_op) = 0;

                        virtual HRESULT STDMETHODCALLTYPE PauseAllEffects(
                            ) = 0;

                        virtual HRESULT STDMETHODCALLTYPE ResumeAllEffects(
                            ) = 0;

                        virtual HRESULT STDMETHODCALLTYPE StopAllEffects(
                            ) = 0;

                        virtual HRESULT STDMETHODCALLTYPE TryDisableAsync(
                            ABI::Windows::Foundation::IAsyncOperation<boolean > **async_op) = 0;

                        virtual HRESULT STDMETHODCALLTYPE TryEnableAsync(
                            ABI::Windows::Foundation::IAsyncOperation<boolean > **async_op) = 0;

                        virtual HRESULT STDMETHODCALLTYPE TryResetAsync(
                            ABI::Windows::Foundation::IAsyncOperation<boolean > **async_op) = 0;

                        virtual HRESULT STDMETHODCALLTYPE TryUnloadEffectAsync(
                            ABI::Windows::Gaming::Input::ForceFeedback::IForceFeedbackEffect *effect,
                            ABI::Windows::Foundation::IAsyncOperation<boolean > **async_op) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor, 0x8d3d417c, 0xa5ea, 0x4516, 0x80,0x26, 0x2b,0x00,0xf7,0x4e,0xf6,0xe5)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IForceFeedbackMotor methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AreEffectsPaused)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_MasterGain)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *This,
        DOUBLE *value);

    HRESULT (STDMETHODCALLTYPE *put_MasterGain)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *This,
        DOUBLE value);

    HRESULT (STDMETHODCALLTYPE *get_IsEnabled)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_SupportedAxes)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *This,
        enum __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CForceFeedbackEffectAxes *value);

    HRESULT (STDMETHODCALLTYPE *LoadEffectAsync)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *This,
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect *effect,
        __FIAsyncOperation_1_ForceFeedbackLoadEffectResult **async_op);

    HRESULT (STDMETHODCALLTYPE *PauseAllEffects)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *This);

    HRESULT (STDMETHODCALLTYPE *ResumeAllEffects)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *This);

    HRESULT (STDMETHODCALLTYPE *StopAllEffects)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *This);

    HRESULT (STDMETHODCALLTYPE *TryDisableAsync)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *This,
        __FIAsyncOperation_1_boolean **async_op);

    HRESULT (STDMETHODCALLTYPE *TryEnableAsync)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *This,
        __FIAsyncOperation_1_boolean **async_op);

    HRESULT (STDMETHODCALLTYPE *TryResetAsync)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *This,
        __FIAsyncOperation_1_boolean **async_op);

    HRESULT (STDMETHODCALLTYPE *TryUnloadEffectAsync)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *This,
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect *effect,
        __FIAsyncOperation_1_boolean **async_op);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotorVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IForceFeedbackMotor methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_get_AreEffectsPaused(This,value) (This)->lpVtbl->get_AreEffectsPaused(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_get_MasterGain(This,value) (This)->lpVtbl->get_MasterGain(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_put_MasterGain(This,value) (This)->lpVtbl->put_MasterGain(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_get_IsEnabled(This,value) (This)->lpVtbl->get_IsEnabled(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_get_SupportedAxes(This,value) (This)->lpVtbl->get_SupportedAxes(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_LoadEffectAsync(This,effect,async_op) (This)->lpVtbl->LoadEffectAsync(This,effect,async_op)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_PauseAllEffects(This) (This)->lpVtbl->PauseAllEffects(This)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_ResumeAllEffects(This) (This)->lpVtbl->ResumeAllEffects(This)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_StopAllEffects(This) (This)->lpVtbl->StopAllEffects(This)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_TryDisableAsync(This,async_op) (This)->lpVtbl->TryDisableAsync(This,async_op)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_TryEnableAsync(This,async_op) (This)->lpVtbl->TryEnableAsync(This,async_op)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_TryResetAsync(This,async_op) (This)->lpVtbl->TryResetAsync(This,async_op)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_TryUnloadEffectAsync(This,effect,async_op) (This)->lpVtbl->TryUnloadEffectAsync(This,effect,async_op)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_AddRef(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_Release(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_GetIids(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IForceFeedbackMotor methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_get_AreEffectsPaused(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor* This,boolean *value) {
    return This->lpVtbl->get_AreEffectsPaused(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_get_MasterGain(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor* This,DOUBLE *value) {
    return This->lpVtbl->get_MasterGain(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_put_MasterGain(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor* This,DOUBLE value) {
    return This->lpVtbl->put_MasterGain(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_get_IsEnabled(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor* This,boolean *value) {
    return This->lpVtbl->get_IsEnabled(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_get_SupportedAxes(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor* This,enum __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CForceFeedbackEffectAxes *value) {
    return This->lpVtbl->get_SupportedAxes(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_LoadEffectAsync(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor* This,__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect *effect,__FIAsyncOperation_1_ForceFeedbackLoadEffectResult **async_op) {
    return This->lpVtbl->LoadEffectAsync(This,effect,async_op);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_PauseAllEffects(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor* This) {
    return This->lpVtbl->PauseAllEffects(This);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_ResumeAllEffects(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor* This) {
    return This->lpVtbl->ResumeAllEffects(This);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_StopAllEffects(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor* This) {
    return This->lpVtbl->StopAllEffects(This);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_TryDisableAsync(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor* This,__FIAsyncOperation_1_boolean **async_op) {
    return This->lpVtbl->TryDisableAsync(This,async_op);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_TryEnableAsync(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor* This,__FIAsyncOperation_1_boolean **async_op) {
    return This->lpVtbl->TryEnableAsync(This,async_op);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_TryResetAsync(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor* This,__FIAsyncOperation_1_boolean **async_op) {
    return This->lpVtbl->TryResetAsync(This,async_op);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_TryUnloadEffectAsync(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor* This,__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect *effect,__FIAsyncOperation_1_boolean **async_op) {
    return This->lpVtbl->TryUnloadEffectAsync(This,effect,async_op);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input_ForceFeedback
#define IID_IForceFeedbackMotor IID___x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor
#define IForceFeedbackMotorVtbl __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotorVtbl
#define IForceFeedbackMotor __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor
#define IForceFeedbackMotor_QueryInterface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_QueryInterface
#define IForceFeedbackMotor_AddRef __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_AddRef
#define IForceFeedbackMotor_Release __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_Release
#define IForceFeedbackMotor_GetIids __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_GetIids
#define IForceFeedbackMotor_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_GetRuntimeClassName
#define IForceFeedbackMotor_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_GetTrustLevel
#define IForceFeedbackMotor_get_AreEffectsPaused __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_get_AreEffectsPaused
#define IForceFeedbackMotor_get_MasterGain __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_get_MasterGain
#define IForceFeedbackMotor_put_MasterGain __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_put_MasterGain
#define IForceFeedbackMotor_get_IsEnabled __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_get_IsEnabled
#define IForceFeedbackMotor_get_SupportedAxes __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_get_SupportedAxes
#define IForceFeedbackMotor_LoadEffectAsync __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_LoadEffectAsync
#define IForceFeedbackMotor_PauseAllEffects __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_PauseAllEffects
#define IForceFeedbackMotor_ResumeAllEffects __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_ResumeAllEffects
#define IForceFeedbackMotor_StopAllEffects __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_StopAllEffects
#define IForceFeedbackMotor_TryDisableAsync __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_TryDisableAsync
#define IForceFeedbackMotor_TryEnableAsync __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_TryEnableAsync
#define IForceFeedbackMotor_TryResetAsync __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_TryResetAsync
#define IForceFeedbackMotor_TryUnloadEffectAsync __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor_TryUnloadEffectAsync
#endif /* WIDL_using_Windows_Gaming_Input_ForceFeedback */
#endif

#endif

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

/*****************************************************************************
 * IPeriodicForceEffect interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect, 0x5c5138d7, 0xfc75, 0x4d52, 0x9a,0x0a, 0xef,0xe4,0xca,0xb5,0xfe,0x64);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    MIDL_INTERFACE("5c5138d7-fc75-4d52-9a0a-efe4cab5fe64")
                    IPeriodicForceEffect : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Kind(
                            enum PeriodicForceEffectKind *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SetParameters(
                            struct Vector3 vector,
                            FLOAT frequency,
                            FLOAT phase,
                            FLOAT bias,
                            struct TimeSpan duration) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SetParametersWithEnvelope(
                            struct Vector3 vector,
                            FLOAT frequency,
                            FLOAT phase,
                            FLOAT bias,
                            FLOAT attack_gain,
                            FLOAT sustain_gain,
                            FLOAT release_gain,
                            struct TimeSpan start_delay,
                            struct TimeSpan attack_duration,
                            struct TimeSpan sustain_duration,
                            struct TimeSpan release_duration,
                            UINT32 repeat_count) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect, 0x5c5138d7, 0xfc75, 0x4d52, 0x9a,0x0a, 0xef,0xe4,0xca,0xb5,0xfe,0x64)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IPeriodicForceEffect methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Kind)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect *This,
        enum __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CPeriodicForceEffectKind *value);

    HRESULT (STDMETHODCALLTYPE *SetParameters)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 vector,
        FLOAT frequency,
        FLOAT phase,
        FLOAT bias,
        struct __x_ABI_CWindows_CFoundation_CTimeSpan duration);

    HRESULT (STDMETHODCALLTYPE *SetParametersWithEnvelope)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 vector,
        FLOAT frequency,
        FLOAT phase,
        FLOAT bias,
        FLOAT attack_gain,
        FLOAT sustain_gain,
        FLOAT release_gain,
        struct __x_ABI_CWindows_CFoundation_CTimeSpan start_delay,
        struct __x_ABI_CWindows_CFoundation_CTimeSpan attack_duration,
        struct __x_ABI_CWindows_CFoundation_CTimeSpan sustain_duration,
        struct __x_ABI_CWindows_CFoundation_CTimeSpan release_duration,
        UINT32 repeat_count);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPeriodicForceEffect methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_get_Kind(This,value) (This)->lpVtbl->get_Kind(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_SetParameters(This,vector,frequency,phase,bias,duration) (This)->lpVtbl->SetParameters(This,vector,frequency,phase,bias,duration)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_SetParametersWithEnvelope(This,vector,frequency,phase,bias,attack_gain,sustain_gain,release_gain,start_delay,attack_duration,sustain_duration,release_duration,repeat_count) (This)->lpVtbl->SetParametersWithEnvelope(This,vector,frequency,phase,bias,attack_gain,sustain_gain,release_gain,start_delay,attack_duration,sustain_duration,release_duration,repeat_count)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_AddRef(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_Release(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_GetIids(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPeriodicForceEffect methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_get_Kind(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect* This,enum __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CPeriodicForceEffectKind *value) {
    return This->lpVtbl->get_Kind(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_SetParameters(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 vector,FLOAT frequency,FLOAT phase,FLOAT bias,struct __x_ABI_CWindows_CFoundation_CTimeSpan duration) {
    return This->lpVtbl->SetParameters(This,vector,frequency,phase,bias,duration);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_SetParametersWithEnvelope(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 vector,FLOAT frequency,FLOAT phase,FLOAT bias,FLOAT attack_gain,FLOAT sustain_gain,FLOAT release_gain,struct __x_ABI_CWindows_CFoundation_CTimeSpan start_delay,struct __x_ABI_CWindows_CFoundation_CTimeSpan attack_duration,struct __x_ABI_CWindows_CFoundation_CTimeSpan sustain_duration,struct __x_ABI_CWindows_CFoundation_CTimeSpan release_duration,UINT32 repeat_count) {
    return This->lpVtbl->SetParametersWithEnvelope(This,vector,frequency,phase,bias,attack_gain,sustain_gain,release_gain,start_delay,attack_duration,sustain_duration,release_duration,repeat_count);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input_ForceFeedback
#define IID_IPeriodicForceEffect IID___x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect
#define IPeriodicForceEffectVtbl __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectVtbl
#define IPeriodicForceEffect __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect
#define IPeriodicForceEffect_QueryInterface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_QueryInterface
#define IPeriodicForceEffect_AddRef __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_AddRef
#define IPeriodicForceEffect_Release __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_Release
#define IPeriodicForceEffect_GetIids __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_GetIids
#define IPeriodicForceEffect_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_GetRuntimeClassName
#define IPeriodicForceEffect_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_GetTrustLevel
#define IPeriodicForceEffect_get_Kind __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_get_Kind
#define IPeriodicForceEffect_SetParameters __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_SetParameters
#define IPeriodicForceEffect_SetParametersWithEnvelope __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffect_SetParametersWithEnvelope
#endif /* WIDL_using_Windows_Gaming_Input_ForceFeedback */
#endif

#endif

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

/*****************************************************************************
 * IPeriodicForceEffectFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory, 0x6f62eb1a, 0x9851, 0x477b, 0xb3,0x18, 0x35,0xec,0xaa,0x15,0x07,0x0f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    MIDL_INTERFACE("6f62eb1a-9851-477b-b318-35ecaa15070f")
                    IPeriodicForceEffectFactory : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE CreateInstance(
                            enum PeriodicForceEffectKind kind,
                            ABI::Windows::Gaming::Input::ForceFeedback::IForceFeedbackEffect **value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory, 0x6f62eb1a, 0x9851, 0x477b, 0xb3,0x18, 0x35,0xec,0xaa,0x15,0x07,0x0f)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IPeriodicForceEffectFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateInstance)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory *This,
        enum __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CPeriodicForceEffectKind kind,
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect **value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactoryVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPeriodicForceEffectFactory methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_CreateInstance(This,kind,value) (This)->lpVtbl->CreateInstance(This,kind,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_AddRef(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_Release(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_GetIids(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPeriodicForceEffectFactory methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_CreateInstance(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory* This,enum __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CPeriodicForceEffectKind kind,__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect **value) {
    return This->lpVtbl->CreateInstance(This,kind,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input_ForceFeedback
#define IID_IPeriodicForceEffectFactory IID___x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory
#define IPeriodicForceEffectFactoryVtbl __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactoryVtbl
#define IPeriodicForceEffectFactory __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory
#define IPeriodicForceEffectFactory_QueryInterface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_QueryInterface
#define IPeriodicForceEffectFactory_AddRef __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_AddRef
#define IPeriodicForceEffectFactory_Release __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_Release
#define IPeriodicForceEffectFactory_GetIids __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_GetIids
#define IPeriodicForceEffectFactory_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_GetRuntimeClassName
#define IPeriodicForceEffectFactory_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_GetTrustLevel
#define IPeriodicForceEffectFactory_CreateInstance __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIPeriodicForceEffectFactory_CreateInstance
#endif /* WIDL_using_Windows_Gaming_Input_ForceFeedback */
#endif

#endif

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

/*****************************************************************************
 * IConditionForceEffect interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect, 0x32d1ea68, 0x3695, 0x4e69, 0x85,0xc0, 0xcd,0x19,0x44,0x18,0x91,0x40);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    MIDL_INTERFACE("32d1ea68-3695-4e69-85c0-cd1944189140")
                    IConditionForceEffect : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Kind(
                            enum ConditionForceEffectKind *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SetParameters(
                            struct Vector3 direction,
                            FLOAT positive_coeff,
                            FLOAT negative_coeff,
                            FLOAT max_positive_magnitude,
                            FLOAT max_negative_magnitude,
                            FLOAT deadzone,
                            FLOAT bias) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect, 0x32d1ea68, 0x3695, 0x4e69, 0x85,0xc0, 0xcd,0x19,0x44,0x18,0x91,0x40)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IConditionForceEffect methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Kind)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect *This,
        enum __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CConditionForceEffectKind *value);

    HRESULT (STDMETHODCALLTYPE *SetParameters)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 direction,
        FLOAT positive_coeff,
        FLOAT negative_coeff,
        FLOAT max_positive_magnitude,
        FLOAT max_negative_magnitude,
        FLOAT deadzone,
        FLOAT bias);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IConditionForceEffect methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_get_Kind(This,value) (This)->lpVtbl->get_Kind(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_SetParameters(This,direction,positive_coeff,negative_coeff,max_positive_magnitude,max_negative_magnitude,deadzone,bias) (This)->lpVtbl->SetParameters(This,direction,positive_coeff,negative_coeff,max_positive_magnitude,max_negative_magnitude,deadzone,bias)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_AddRef(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_Release(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_GetIids(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IConditionForceEffect methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_get_Kind(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect* This,enum __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CConditionForceEffectKind *value) {
    return This->lpVtbl->get_Kind(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_SetParameters(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 direction,FLOAT positive_coeff,FLOAT negative_coeff,FLOAT max_positive_magnitude,FLOAT max_negative_magnitude,FLOAT deadzone,FLOAT bias) {
    return This->lpVtbl->SetParameters(This,direction,positive_coeff,negative_coeff,max_positive_magnitude,max_negative_magnitude,deadzone,bias);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input_ForceFeedback
#define IID_IConditionForceEffect IID___x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect
#define IConditionForceEffectVtbl __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectVtbl
#define IConditionForceEffect __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect
#define IConditionForceEffect_QueryInterface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_QueryInterface
#define IConditionForceEffect_AddRef __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_AddRef
#define IConditionForceEffect_Release __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_Release
#define IConditionForceEffect_GetIids __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_GetIids
#define IConditionForceEffect_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_GetRuntimeClassName
#define IConditionForceEffect_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_GetTrustLevel
#define IConditionForceEffect_get_Kind __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_get_Kind
#define IConditionForceEffect_SetParameters __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffect_SetParameters
#endif /* WIDL_using_Windows_Gaming_Input_ForceFeedback */
#endif

#endif

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

/*****************************************************************************
 * IConditionForceEffectFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory, 0x91a99264, 0x1810, 0x4eb6, 0xa7,0x73, 0xbf,0xd3,0xb8,0xcd,0xdb,0xab);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    MIDL_INTERFACE("91a99264-1810-4eb6-a773-bfd3b8cddbab")
                    IConditionForceEffectFactory : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE CreateInstance(
                            enum ConditionForceEffectKind kind,
                            ABI::Windows::Gaming::Input::ForceFeedback::IForceFeedbackEffect **value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory, 0x91a99264, 0x1810, 0x4eb6, 0xa7,0x73, 0xbf,0xd3,0xb8,0xcd,0xdb,0xab)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IConditionForceEffectFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateInstance)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory *This,
        enum __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CConditionForceEffectKind kind,
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect **value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactoryVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IConditionForceEffectFactory methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_CreateInstance(This,kind,value) (This)->lpVtbl->CreateInstance(This,kind,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_AddRef(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_Release(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_GetIids(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IConditionForceEffectFactory methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_CreateInstance(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory* This,enum __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CConditionForceEffectKind kind,__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackEffect **value) {
    return This->lpVtbl->CreateInstance(This,kind,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input_ForceFeedback
#define IID_IConditionForceEffectFactory IID___x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory
#define IConditionForceEffectFactoryVtbl __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactoryVtbl
#define IConditionForceEffectFactory __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory
#define IConditionForceEffectFactory_QueryInterface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_QueryInterface
#define IConditionForceEffectFactory_AddRef __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_AddRef
#define IConditionForceEffectFactory_Release __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_Release
#define IConditionForceEffectFactory_GetIids __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_GetIids
#define IConditionForceEffectFactory_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_GetRuntimeClassName
#define IConditionForceEffectFactory_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_GetTrustLevel
#define IConditionForceEffectFactory_CreateInstance __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConditionForceEffectFactory_CreateInstance
#endif /* WIDL_using_Windows_Gaming_Input_ForceFeedback */
#endif

#endif

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

/*****************************************************************************
 * IConstantForceEffect interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect, 0x9bfa0140, 0xf3c7, 0x415c, 0xb0,0x68, 0x0f,0x06,0x87,0x34,0xbc,0xe0);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    MIDL_INTERFACE("9bfa0140-f3c7-415c-b068-0f068734bce0")
                    IConstantForceEffect : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE SetParameters(
                            struct Vector3 vector,
                            struct TimeSpan duration) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SetParametersWithEnvelope(
                            struct Vector3 vector,
                            FLOAT attack_gain,
                            FLOAT sustain_gain,
                            FLOAT release_gain,
                            struct TimeSpan start_delay,
                            struct TimeSpan attack_duration,
                            struct TimeSpan sustain_duration,
                            struct TimeSpan release_duration,
                            UINT32 repeat_count) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect, 0x9bfa0140, 0xf3c7, 0x415c, 0xb0,0x68, 0x0f,0x06,0x87,0x34,0xbc,0xe0)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffectVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IConstantForceEffect methods ***/
    HRESULT (STDMETHODCALLTYPE *SetParameters)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 vector,
        struct __x_ABI_CWindows_CFoundation_CTimeSpan duration);

    HRESULT (STDMETHODCALLTYPE *SetParametersWithEnvelope)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 vector,
        FLOAT attack_gain,
        FLOAT sustain_gain,
        FLOAT release_gain,
        struct __x_ABI_CWindows_CFoundation_CTimeSpan start_delay,
        struct __x_ABI_CWindows_CFoundation_CTimeSpan attack_duration,
        struct __x_ABI_CWindows_CFoundation_CTimeSpan sustain_duration,
        struct __x_ABI_CWindows_CFoundation_CTimeSpan release_duration,
        UINT32 repeat_count);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffectVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IConstantForceEffect methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_SetParameters(This,vector,duration) (This)->lpVtbl->SetParameters(This,vector,duration)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_SetParametersWithEnvelope(This,vector,attack_gain,sustain_gain,release_gain,start_delay,attack_duration,sustain_duration,release_duration,repeat_count) (This)->lpVtbl->SetParametersWithEnvelope(This,vector,attack_gain,sustain_gain,release_gain,start_delay,attack_duration,sustain_duration,release_duration,repeat_count)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_AddRef(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_Release(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_GetIids(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IConstantForceEffect methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_SetParameters(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 vector,struct __x_ABI_CWindows_CFoundation_CTimeSpan duration) {
    return This->lpVtbl->SetParameters(This,vector,duration);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_SetParametersWithEnvelope(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 vector,FLOAT attack_gain,FLOAT sustain_gain,FLOAT release_gain,struct __x_ABI_CWindows_CFoundation_CTimeSpan start_delay,struct __x_ABI_CWindows_CFoundation_CTimeSpan attack_duration,struct __x_ABI_CWindows_CFoundation_CTimeSpan sustain_duration,struct __x_ABI_CWindows_CFoundation_CTimeSpan release_duration,UINT32 repeat_count) {
    return This->lpVtbl->SetParametersWithEnvelope(This,vector,attack_gain,sustain_gain,release_gain,start_delay,attack_duration,sustain_duration,release_duration,repeat_count);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input_ForceFeedback
#define IID_IConstantForceEffect IID___x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect
#define IConstantForceEffectVtbl __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffectVtbl
#define IConstantForceEffect __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect
#define IConstantForceEffect_QueryInterface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_QueryInterface
#define IConstantForceEffect_AddRef __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_AddRef
#define IConstantForceEffect_Release __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_Release
#define IConstantForceEffect_GetIids __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_GetIids
#define IConstantForceEffect_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_GetRuntimeClassName
#define IConstantForceEffect_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_GetTrustLevel
#define IConstantForceEffect_SetParameters __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_SetParameters
#define IConstantForceEffect_SetParametersWithEnvelope __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIConstantForceEffect_SetParametersWithEnvelope
#endif /* WIDL_using_Windows_Gaming_Input_ForceFeedback */
#endif

#endif

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

/*****************************************************************************
 * IRampForceEffect interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect, 0xf1f81259, 0x1ca6, 0x4080, 0xb5,0x6d, 0xb4,0x3f,0x33,0x54,0xd0,0x52);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace ForceFeedback {
                    MIDL_INTERFACE("f1f81259-1ca6-4080-b56d-b43f3354d052")
                    IRampForceEffect : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE SetParameters(
                            struct Vector3 start_vector,
                            struct Vector3 end_vector,
                            struct TimeSpan duration) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SetParametersWithEnvelope(
                            struct Vector3 start_vector,
                            struct Vector3 end_vector,
                            FLOAT attack_gain,
                            FLOAT sustain_gain,
                            FLOAT release_gain,
                            struct TimeSpan start_delay,
                            struct TimeSpan attack_duration,
                            struct TimeSpan sustain_duration,
                            struct TimeSpan release_duration,
                            UINT32 repeat_count) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect, 0xf1f81259, 0x1ca6, 0x4080, 0xb5,0x6d, 0xb4,0x3f,0x33,0x54,0xd0,0x52)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffectVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IRampForceEffect methods ***/
    HRESULT (STDMETHODCALLTYPE *SetParameters)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 start_vector,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 end_vector,
        struct __x_ABI_CWindows_CFoundation_CTimeSpan duration);

    HRESULT (STDMETHODCALLTYPE *SetParametersWithEnvelope)(
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 start_vector,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 end_vector,
        FLOAT attack_gain,
        FLOAT sustain_gain,
        FLOAT release_gain,
        struct __x_ABI_CWindows_CFoundation_CTimeSpan start_delay,
        struct __x_ABI_CWindows_CFoundation_CTimeSpan attack_duration,
        struct __x_ABI_CWindows_CFoundation_CTimeSpan sustain_duration,
        struct __x_ABI_CWindows_CFoundation_CTimeSpan release_duration,
        UINT32 repeat_count);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffectVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IRampForceEffect methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_SetParameters(This,start_vector,end_vector,duration) (This)->lpVtbl->SetParameters(This,start_vector,end_vector,duration)
#define __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_SetParametersWithEnvelope(This,start_vector,end_vector,attack_gain,sustain_gain,release_gain,start_delay,attack_duration,sustain_duration,release_duration,repeat_count) (This)->lpVtbl->SetParametersWithEnvelope(This,start_vector,end_vector,attack_gain,sustain_gain,release_gain,start_delay,attack_duration,sustain_duration,release_duration,repeat_count)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_AddRef(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_Release(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_GetIids(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IRampForceEffect methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_SetParameters(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 start_vector,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 end_vector,struct __x_ABI_CWindows_CFoundation_CTimeSpan duration) {
    return This->lpVtbl->SetParameters(This,start_vector,end_vector,duration);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_SetParametersWithEnvelope(__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 start_vector,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 end_vector,FLOAT attack_gain,FLOAT sustain_gain,FLOAT release_gain,struct __x_ABI_CWindows_CFoundation_CTimeSpan start_delay,struct __x_ABI_CWindows_CFoundation_CTimeSpan attack_duration,struct __x_ABI_CWindows_CFoundation_CTimeSpan sustain_duration,struct __x_ABI_CWindows_CFoundation_CTimeSpan release_duration,UINT32 repeat_count) {
    return This->lpVtbl->SetParametersWithEnvelope(This,start_vector,end_vector,attack_gain,sustain_gain,release_gain,start_delay,attack_duration,sustain_duration,release_duration,repeat_count);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input_ForceFeedback
#define IID_IRampForceEffect IID___x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect
#define IRampForceEffectVtbl __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffectVtbl
#define IRampForceEffect __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect
#define IRampForceEffect_QueryInterface __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_QueryInterface
#define IRampForceEffect_AddRef __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_AddRef
#define IRampForceEffect_Release __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_Release
#define IRampForceEffect_GetIids __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_GetIids
#define IRampForceEffect_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_GetRuntimeClassName
#define IRampForceEffect_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_GetTrustLevel
#define IRampForceEffect_SetParameters __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_SetParameters
#define IRampForceEffect_SetParametersWithEnvelope __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIRampForceEffect_SetParametersWithEnvelope
#endif /* WIDL_using_Windows_Gaming_Input_ForceFeedback */
#endif

#endif

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

/*
 * Class Windows.Gaming.Input.ForceFeedback.ForceFeedbackMotor
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_Gaming_Input_ForceFeedback_ForceFeedbackMotor_DEFINED
#define RUNTIMECLASS_Windows_Gaming_Input_ForceFeedback_ForceFeedbackMotor_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Gaming_Input_ForceFeedback_ForceFeedbackMotor[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','F','o','r','c','e','F','e','e','d','b','a','c','k','.','F','o','r','c','e','F','e','e','d','b','a','c','k','M','o','t','o','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_ForceFeedback_ForceFeedbackMotor[] = L"Windows.Gaming.Input.ForceFeedback.ForceFeedbackMotor";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_ForceFeedback_ForceFeedbackMotor[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','F','o','r','c','e','F','e','e','d','b','a','c','k','.','F','o','r','c','e','F','e','e','d','b','a','c','k','M','o','t','o','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_Gaming_Input_ForceFeedback_ForceFeedbackMotor_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.Gaming.Input.ForceFeedback.PeriodicForceEffect
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_Gaming_Input_ForceFeedback_PeriodicForceEffect_DEFINED
#define RUNTIMECLASS_Windows_Gaming_Input_ForceFeedback_PeriodicForceEffect_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Gaming_Input_ForceFeedback_PeriodicForceEffect[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','F','o','r','c','e','F','e','e','d','b','a','c','k','.','P','e','r','i','o','d','i','c','F','o','r','c','e','E','f','f','e','c','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_ForceFeedback_PeriodicForceEffect[] = L"Windows.Gaming.Input.ForceFeedback.PeriodicForceEffect";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_ForceFeedback_PeriodicForceEffect[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','F','o','r','c','e','F','e','e','d','b','a','c','k','.','P','e','r','i','o','d','i','c','F','o','r','c','e','E','f','f','e','c','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Gaming_Input_ForceFeedback_PeriodicForceEffect_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.Gaming.Input.ForceFeedback.ConditionForceEffect
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_Gaming_Input_ForceFeedback_ConditionForceEffect_DEFINED
#define RUNTIMECLASS_Windows_Gaming_Input_ForceFeedback_ConditionForceEffect_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Gaming_Input_ForceFeedback_ConditionForceEffect[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','F','o','r','c','e','F','e','e','d','b','a','c','k','.','C','o','n','d','i','t','i','o','n','F','o','r','c','e','E','f','f','e','c','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_ForceFeedback_ConditionForceEffect[] = L"Windows.Gaming.Input.ForceFeedback.ConditionForceEffect";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_ForceFeedback_ConditionForceEffect[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','F','o','r','c','e','F','e','e','d','b','a','c','k','.','C','o','n','d','i','t','i','o','n','F','o','r','c','e','E','f','f','e','c','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Gaming_Input_ForceFeedback_ConditionForceEffect_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.Gaming.Input.ForceFeedback.ConstantForceEffect
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_Gaming_Input_ForceFeedback_ConstantForceEffect_DEFINED
#define RUNTIMECLASS_Windows_Gaming_Input_ForceFeedback_ConstantForceEffect_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Gaming_Input_ForceFeedback_ConstantForceEffect[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','F','o','r','c','e','F','e','e','d','b','a','c','k','.','C','o','n','s','t','a','n','t','F','o','r','c','e','E','f','f','e','c','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_ForceFeedback_ConstantForceEffect[] = L"Windows.Gaming.Input.ForceFeedback.ConstantForceEffect";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_ForceFeedback_ConstantForceEffect[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','F','o','r','c','e','F','e','e','d','b','a','c','k','.','C','o','n','s','t','a','n','t','F','o','r','c','e','E','f','f','e','c','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Gaming_Input_ForceFeedback_ConstantForceEffect_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.Gaming.Input.ForceFeedback.RampForceEffect
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_Gaming_Input_ForceFeedback_RampForceEffect_DEFINED
#define RUNTIMECLASS_Windows_Gaming_Input_ForceFeedback_RampForceEffect_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Gaming_Input_ForceFeedback_RampForceEffect[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','F','o','r','c','e','F','e','e','d','b','a','c','k','.','R','a','m','p','F','o','r','c','e','E','f','f','e','c','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_ForceFeedback_RampForceEffect[] = L"Windows.Gaming.Input.ForceFeedback.RampForceEffect";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_ForceFeedback_RampForceEffect[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','F','o','r','c','e','F','e','e','d','b','a','c','k','.','R','a','m','p','F','o','r','c','e','E','f','f','e','c','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Gaming_Input_ForceFeedback_RampForceEffect_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackLoadEffectResult > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult, 0xf8220a41, 0xf738, 0x51e8, 0x89,0xba, 0x76,0xbb,0xd6,0x61,0x58,0xcb);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("f8220a41-f738-51e8-89ba-76bbd66158cb")
            IAsyncOperationCompletedHandler<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackLoadEffectResult > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackLoadEffectResult >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult, 0xf8220a41, 0xf738, 0x51e8, 0x89,0xba, 0x76,0xbb,0xd6,0x61,0x58,0xcb)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResultVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackLoadEffectResult > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult *This,
        __FIAsyncOperation_1_ForceFeedbackLoadEffectResult *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResultVtbl;

interface __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackLoadEffectResult > methods ***/
#define __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult_QueryInterface(__FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult_AddRef(__FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult_Release(__FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackLoadEffectResult > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult_Invoke(__FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult* This,__FIAsyncOperation_1_ForceFeedbackLoadEffectResult *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_ForceFeedbackLoadEffectResult IID___FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult
#define IAsyncOperationCompletedHandler_ForceFeedbackLoadEffectResultVtbl __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResultVtbl
#define IAsyncOperationCompletedHandler_ForceFeedbackLoadEffectResult __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult
#define IAsyncOperationCompletedHandler_ForceFeedbackLoadEffectResult_QueryInterface __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult_QueryInterface
#define IAsyncOperationCompletedHandler_ForceFeedbackLoadEffectResult_AddRef __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult_AddRef
#define IAsyncOperationCompletedHandler_ForceFeedbackLoadEffectResult_Release __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult_Release
#define IAsyncOperationCompletedHandler_ForceFeedbackLoadEffectResult_Invoke __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackLoadEffectResult > interface
 */
#ifndef ____FIAsyncOperation_1_ForceFeedbackLoadEffectResult_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_ForceFeedbackLoadEffectResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_ForceFeedbackLoadEffectResult, 0x21f834fc, 0xe845, 0x5ab9, 0xbf,0x85, 0x95,0x34,0xe2,0x39,0x77,0x98);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("21f834fc-e845-5ab9-bf85-9534e2397798")
            IAsyncOperation<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackLoadEffectResult > : IAsyncOperation_impl<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackLoadEffectResult >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_ForceFeedbackLoadEffectResult, 0x21f834fc, 0xe845, 0x5ab9, 0xbf,0x85, 0x95,0x34,0xe2,0x39,0x77,0x98)
#endif
#else
typedef struct __FIAsyncOperation_1_ForceFeedbackLoadEffectResultVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackLoadEffectResult > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_ForceFeedbackLoadEffectResult *This,
        __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_ForceFeedbackLoadEffectResult *This,
        __FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_ForceFeedbackLoadEffectResult *This,
        enum __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CForceFeedbackLoadEffectResult *results);

    END_INTERFACE
} __FIAsyncOperation_1_ForceFeedbackLoadEffectResultVtbl;

interface __FIAsyncOperation_1_ForceFeedbackLoadEffectResult {
    CONST_VTBL __FIAsyncOperation_1_ForceFeedbackLoadEffectResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackLoadEffectResult > methods ***/
#define __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_QueryInterface(__FIAsyncOperation_1_ForceFeedbackLoadEffectResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_AddRef(__FIAsyncOperation_1_ForceFeedbackLoadEffectResult* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_Release(__FIAsyncOperation_1_ForceFeedbackLoadEffectResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_GetIids(__FIAsyncOperation_1_ForceFeedbackLoadEffectResult* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_GetRuntimeClassName(__FIAsyncOperation_1_ForceFeedbackLoadEffectResult* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_GetTrustLevel(__FIAsyncOperation_1_ForceFeedbackLoadEffectResult* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackLoadEffectResult > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_put_Completed(__FIAsyncOperation_1_ForceFeedbackLoadEffectResult* This,__FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_get_Completed(__FIAsyncOperation_1_ForceFeedbackLoadEffectResult* This,__FIAsyncOperationCompletedHandler_1_ForceFeedbackLoadEffectResult **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_GetResults(__FIAsyncOperation_1_ForceFeedbackLoadEffectResult* This,enum __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CForceFeedbackLoadEffectResult *results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_ForceFeedbackLoadEffectResult IID___FIAsyncOperation_1_ForceFeedbackLoadEffectResult
#define IAsyncOperation_ForceFeedbackLoadEffectResultVtbl __FIAsyncOperation_1_ForceFeedbackLoadEffectResultVtbl
#define IAsyncOperation_ForceFeedbackLoadEffectResult __FIAsyncOperation_1_ForceFeedbackLoadEffectResult
#define IAsyncOperation_ForceFeedbackLoadEffectResult_QueryInterface __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_QueryInterface
#define IAsyncOperation_ForceFeedbackLoadEffectResult_AddRef __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_AddRef
#define IAsyncOperation_ForceFeedbackLoadEffectResult_Release __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_Release
#define IAsyncOperation_ForceFeedbackLoadEffectResult_GetIids __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_GetIids
#define IAsyncOperation_ForceFeedbackLoadEffectResult_GetRuntimeClassName __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_GetRuntimeClassName
#define IAsyncOperation_ForceFeedbackLoadEffectResult_GetTrustLevel __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_GetTrustLevel
#define IAsyncOperation_ForceFeedbackLoadEffectResult_put_Completed __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_put_Completed
#define IAsyncOperation_ForceFeedbackLoadEffectResult_get_Completed __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_get_Completed
#define IAsyncOperation_ForceFeedbackLoadEffectResult_GetResults __FIAsyncOperation_1_ForceFeedbackLoadEffectResult_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_ForceFeedbackLoadEffectResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* > interface
 */
#ifndef ____FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor, 0x64cf69e0, 0x5464, 0x5b72, 0xbd,0x4b, 0x82,0xf7,0xc3,0xd0,0x38,0x6d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("64cf69e0-5464-5b72-bd4b-82f7c3d0386d")
                IIterator<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor*, ABI::Windows::Gaming::Input::ForceFeedback::IForceFeedbackMotor* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor, 0x64cf69e0, 0x5464, 0x5b72, 0xbd,0x4b, 0x82,0xf7,0xc3,0xd0,0x38,0x6d)
#endif
#else
typedef struct __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor *This,
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor *This,
        UINT32 items_size,
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotorVtbl;

interface __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor {
    CONST_VTBL __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* > methods ***/
#define __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_QueryInterface(__FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_AddRef(__FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_Release(__FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetIids(__FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetRuntimeClassName(__FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetTrustLevel(__FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* > methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_get_Current(__FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor **value) {
    return This->lpVtbl->get_Current(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_get_HasCurrent(__FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_MoveNext(__FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetMany(__FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,UINT32 items_size,__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_ForceFeedbackMotor IID___FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor
#define IIterator_ForceFeedbackMotorVtbl __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotorVtbl
#define IIterator_ForceFeedbackMotor __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor
#define IIterator_ForceFeedbackMotor_QueryInterface __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_QueryInterface
#define IIterator_ForceFeedbackMotor_AddRef __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_AddRef
#define IIterator_ForceFeedbackMotor_Release __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_Release
#define IIterator_ForceFeedbackMotor_GetIids __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetIids
#define IIterator_ForceFeedbackMotor_GetRuntimeClassName __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetRuntimeClassName
#define IIterator_ForceFeedbackMotor_GetTrustLevel __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetTrustLevel
#define IIterator_ForceFeedbackMotor_get_Current __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_get_Current
#define IIterator_ForceFeedbackMotor_get_HasCurrent __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_get_HasCurrent
#define IIterator_ForceFeedbackMotor_MoveNext __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_MoveNext
#define IIterator_ForceFeedbackMotor_GetMany __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* > interface
 */
#ifndef ____FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor, 0xc14440d1, 0xfea0, 0x5147, 0xae,0xd8, 0x9b,0x85,0x23,0x9d,0xa8,0x82);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("c14440d1-fea0-5147-aed8-9b85239da882")
                IIterable<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor*, ABI::Windows::Gaming::Input::ForceFeedback::IForceFeedbackMotor* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor, 0xc14440d1, 0xfea0, 0x5147, 0xae,0xd8, 0x9b,0x85,0x23,0x9d,0xa8,0x82)
#endif
#else
typedef struct __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor *This,
        __FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor **value);

    END_INTERFACE
} __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotorVtbl;

interface __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor {
    CONST_VTBL __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* > methods ***/
#define __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_QueryInterface(__FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_AddRef(__FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_Release(__FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetIids(__FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetRuntimeClassName(__FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetTrustLevel(__FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* > methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_First(__FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,__FIIterator_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_ForceFeedbackMotor IID___FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor
#define IIterable_ForceFeedbackMotorVtbl __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotorVtbl
#define IIterable_ForceFeedbackMotor __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor
#define IIterable_ForceFeedbackMotor_QueryInterface __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_QueryInterface
#define IIterable_ForceFeedbackMotor_AddRef __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_AddRef
#define IIterable_ForceFeedbackMotor_Release __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_Release
#define IIterable_ForceFeedbackMotor_GetIids __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetIids
#define IIterable_ForceFeedbackMotor_GetRuntimeClassName __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetRuntimeClassName
#define IIterable_ForceFeedbackMotor_GetTrustLevel __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetTrustLevel
#define IIterable_ForceFeedbackMotor_First __FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* > interface
 */
#ifndef ____FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor, 0x5bfc5070, 0x101d, 0x5fbb, 0x8d,0x5f, 0xce,0x5c,0x23,0xbe,0xcd,0xd9);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("5bfc5070-101d-5fbb-8d5f-ce5c23becdd9")
                IVectorView<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor*, ABI::Windows::Gaming::Input::ForceFeedback::IForceFeedbackMotor* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor, 0x5bfc5070, 0x101d, 0x5fbb, 0x8d,0x5f, 0xce,0x5c,0x23,0xbe,0xcd,0xd9)
#endif
#else
typedef struct __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor *This,
        UINT32 index,
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor **value);

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

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor *This,
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotorVtbl;

interface __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor {
    CONST_VTBL __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* > methods ***/
#define __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_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__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_QueryInterface(__FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_AddRef(__FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_Release(__FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetIids(__FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetRuntimeClassName(__FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetTrustLevel(__FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* > methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetAt(__FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,UINT32 index,__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_get_Size(__FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_IndexOf(__FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetMany(__FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_ForceFeedbackMotor IID___FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor
#define IVectorView_ForceFeedbackMotorVtbl __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotorVtbl
#define IVectorView_ForceFeedbackMotor __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor
#define IVectorView_ForceFeedbackMotor_QueryInterface __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_QueryInterface
#define IVectorView_ForceFeedbackMotor_AddRef __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_AddRef
#define IVectorView_ForceFeedbackMotor_Release __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_Release
#define IVectorView_ForceFeedbackMotor_GetIids __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetIids
#define IVectorView_ForceFeedbackMotor_GetRuntimeClassName __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetRuntimeClassName
#define IVectorView_ForceFeedbackMotor_GetTrustLevel __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetTrustLevel
#define IVectorView_ForceFeedbackMotor_GetAt __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetAt
#define IVectorView_ForceFeedbackMotor_get_Size __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_get_Size
#define IVectorView_ForceFeedbackMotor_IndexOf __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_IndexOf
#define IVectorView_ForceFeedbackMotor_GetMany __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVector<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* > interface
 */
#ifndef ____FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_INTERFACE_DEFINED__
#define ____FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor, 0xb695f739, 0x4ebe, 0x5fd0, 0xa1,0xff, 0x5b,0xa3,0x23,0xb1,0x63,0x55);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("b695f739-4ebe-5fd0-a1ff-5ba323b16355")
                IVector<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* > : IVector_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor*, ABI::Windows::Gaming::Input::ForceFeedback::IForceFeedbackMotor* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor, 0xb695f739, 0x4ebe, 0x5fd0, 0xa1,0xff, 0x5b,0xa3,0x23,0xb1,0x63,0x55)
#endif
#else
typedef struct __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVector<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor *This,
        UINT32 index,
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor **value);

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

    HRESULT (STDMETHODCALLTYPE *GetView)(
        __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor *This,
        __FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor **value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor *This,
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor *This,
        UINT32 index,
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *value);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor *This,
        UINT32 index,
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *Append)(
        __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor *This,
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAtEnd)(
        __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor *This);

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

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor **items,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *ReplaceAll)(
        __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor *This,
        UINT32 count,
        __x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor **items);

    END_INTERFACE
} __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotorVtbl;

interface __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor {
    CONST_VTBL __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVector<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* > methods ***/
#define __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetView(This,value) (This)->lpVtbl->GetView(This,value)
#define __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_SetAt(This,index,value) (This)->lpVtbl->SetAt(This,index,value)
#define __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_InsertAt(This,index,value) (This)->lpVtbl->InsertAt(This,index,value)
#define __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_Append(This,value) (This)->lpVtbl->Append(This,value)
#define __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_RemoveAtEnd(This) (This)->lpVtbl->RemoveAtEnd(This)
#define __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_Clear(This) (This)->lpVtbl->Clear(This)
#define __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#define __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_ReplaceAll(This,count,items) (This)->lpVtbl->ReplaceAll(This,count,items)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_QueryInterface(__FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_AddRef(__FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_Release(__FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetIids(__FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetRuntimeClassName(__FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetTrustLevel(__FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVector<ABI::Windows::Gaming::Input::ForceFeedback::ForceFeedbackMotor* > methods ***/
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetAt(__FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,UINT32 index,__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_get_Size(__FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetView(__FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,__FIVectorView_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor **value) {
    return This->lpVtbl->GetView(This,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_IndexOf(__FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_SetAt(__FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,UINT32 index,__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *value) {
    return This->lpVtbl->SetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_InsertAt(__FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,UINT32 index,__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *value) {
    return This->lpVtbl->InsertAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_RemoveAt(__FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_Append(__FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor *value) {
    return This->lpVtbl->Append(This,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_RemoveAtEnd(__FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This) {
    return This->lpVtbl->RemoveAtEnd(This);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_Clear(__FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This) {
    return This->lpVtbl->Clear(This);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetMany(__FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_ReplaceAll(__FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor* This,UINT32 count,__x_ABI_CWindows_CGaming_CInput_CForceFeedback_CIForceFeedbackMotor **items) {
    return This->lpVtbl->ReplaceAll(This,count,items);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVector_ForceFeedbackMotor IID___FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor
#define IVector_ForceFeedbackMotorVtbl __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotorVtbl
#define IVector_ForceFeedbackMotor __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor
#define IVector_ForceFeedbackMotor_QueryInterface __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_QueryInterface
#define IVector_ForceFeedbackMotor_AddRef __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_AddRef
#define IVector_ForceFeedbackMotor_Release __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_Release
#define IVector_ForceFeedbackMotor_GetIids __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetIids
#define IVector_ForceFeedbackMotor_GetRuntimeClassName __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetRuntimeClassName
#define IVector_ForceFeedbackMotor_GetTrustLevel __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetTrustLevel
#define IVector_ForceFeedbackMotor_GetAt __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetAt
#define IVector_ForceFeedbackMotor_get_Size __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_get_Size
#define IVector_ForceFeedbackMotor_GetView __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetView
#define IVector_ForceFeedbackMotor_IndexOf __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_IndexOf
#define IVector_ForceFeedbackMotor_SetAt __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_SetAt
#define IVector_ForceFeedbackMotor_InsertAt __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_InsertAt
#define IVector_ForceFeedbackMotor_RemoveAt __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_RemoveAt
#define IVector_ForceFeedbackMotor_Append __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_Append
#define IVector_ForceFeedbackMotor_RemoveAtEnd __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_RemoveAtEnd
#define IVector_ForceFeedbackMotor_Clear __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_Clear
#define IVector_ForceFeedbackMotor_GetMany __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_GetMany
#define IVector_ForceFeedbackMotor_ReplaceAll __FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_ReplaceAll
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVector_1_Windows__CGaming__CInput__CForceFeedback__CForceFeedbackMotor_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_gaming_input_forcefeedback_h__ */
