/*** Autogenerated by WIDL 8.12 from include/spellcheck.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 __spellcheck_h__
#define __spellcheck_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 __ISpellingError_FWD_DEFINED__
#define __ISpellingError_FWD_DEFINED__
typedef interface ISpellingError ISpellingError;
#ifdef __cplusplus
interface ISpellingError;
#endif /* __cplusplus */
#endif

#ifndef __IEnumSpellingError_FWD_DEFINED__
#define __IEnumSpellingError_FWD_DEFINED__
typedef interface IEnumSpellingError IEnumSpellingError;
#ifdef __cplusplus
interface IEnumSpellingError;
#endif /* __cplusplus */
#endif

#ifndef __IOptionDescription_FWD_DEFINED__
#define __IOptionDescription_FWD_DEFINED__
typedef interface IOptionDescription IOptionDescription;
#ifdef __cplusplus
interface IOptionDescription;
#endif /* __cplusplus */
#endif

#ifndef __ISpellCheckerChangedEventHandler_FWD_DEFINED__
#define __ISpellCheckerChangedEventHandler_FWD_DEFINED__
typedef interface ISpellCheckerChangedEventHandler ISpellCheckerChangedEventHandler;
#ifdef __cplusplus
interface ISpellCheckerChangedEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __ISpellChecker_FWD_DEFINED__
#define __ISpellChecker_FWD_DEFINED__
typedef interface ISpellChecker ISpellChecker;
#ifdef __cplusplus
interface ISpellChecker;
#endif /* __cplusplus */
#endif

#ifndef __ISpellChecker2_FWD_DEFINED__
#define __ISpellChecker2_FWD_DEFINED__
typedef interface ISpellChecker2 ISpellChecker2;
#ifdef __cplusplus
interface ISpellChecker2;
#endif /* __cplusplus */
#endif

#ifndef __ISpellCheckerFactory_FWD_DEFINED__
#define __ISpellCheckerFactory_FWD_DEFINED__
typedef interface ISpellCheckerFactory ISpellCheckerFactory;
#ifdef __cplusplus
interface ISpellCheckerFactory;
#endif /* __cplusplus */
#endif

#ifndef __IUserDictionariesRegistrar_FWD_DEFINED__
#define __IUserDictionariesRegistrar_FWD_DEFINED__
typedef interface IUserDictionariesRegistrar IUserDictionariesRegistrar;
#ifdef __cplusplus
interface IUserDictionariesRegistrar;
#endif /* __cplusplus */
#endif

#ifndef __SpellCheckerFactory_FWD_DEFINED__
#define __SpellCheckerFactory_FWD_DEFINED__
#ifdef __cplusplus
typedef class SpellCheckerFactory SpellCheckerFactory;
#else
typedef struct SpellCheckerFactory SpellCheckerFactory;
#endif /* defined __cplusplus */
#endif /* defined __SpellCheckerFactory_FWD_DEFINED__ */

/* Headers for imported files */

#include <oaidl.h>
#include <ocidl.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef MIN_SPELLING_NTDDI
#define MIN_SPELLING_NTDDI NTDDI_WIN8
#endif
#if NTDDI_VERSION >= MIN_SPELLING_NTDDI
#include <winapifamily.h>
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
typedef enum WORDLIST_TYPE {
    WORDLIST_TYPE_IGNORE = 0,
    WORDLIST_TYPE_ADD = 1,
    WORDLIST_TYPE_EXCLUDE = 2,
    WORDLIST_TYPE_AUTOCORRECT = 3
} WORDLIST_TYPE;
/*****************************************************************************
 * ISpellingError interface
 */
#ifndef __ISpellingError_INTERFACE_DEFINED__
#define __ISpellingError_INTERFACE_DEFINED__

typedef enum CORRECTIVE_ACTION {
    CORRECTIVE_ACTION_NONE = 0,
    CORRECTIVE_ACTION_GET_SUGGESTIONS = 1,
    CORRECTIVE_ACTION_REPLACE = 2,
    CORRECTIVE_ACTION_DELETE = 3
} CORRECTIVE_ACTION;
DEFINE_GUID(IID_ISpellingError, 0xb7c82d61, 0xfbe8, 0x4b47, 0x9b,0x27, 0x6c,0x0d,0x2e,0x0d,0xe0,0xa3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b7c82d61-fbe8-4b47-9b27-6c0d2e0de0a3")
ISpellingError : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_StartIndex(
        ULONG *val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Length(
        ULONG *val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CorrectiveAction(
        CORRECTIVE_ACTION *val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Replacement(
        LPWSTR *val) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISpellingError, 0xb7c82d61, 0xfbe8, 0x4b47, 0x9b,0x27, 0x6c,0x0d,0x2e,0x0d,0xe0,0xa3)
#endif
#else
typedef struct ISpellingErrorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ISpellingError methods ***/
    HRESULT (STDMETHODCALLTYPE *get_StartIndex)(
        ISpellingError *This,
        ULONG *val);

    HRESULT (STDMETHODCALLTYPE *get_Length)(
        ISpellingError *This,
        ULONG *val);

    HRESULT (STDMETHODCALLTYPE *get_CorrectiveAction)(
        ISpellingError *This,
        CORRECTIVE_ACTION *val);

    HRESULT (STDMETHODCALLTYPE *get_Replacement)(
        ISpellingError *This,
        LPWSTR *val);

    END_INTERFACE
} ISpellingErrorVtbl;

interface ISpellingError {
    CONST_VTBL ISpellingErrorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISpellingError_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISpellingError_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISpellingError_Release(This) (This)->lpVtbl->Release(This)
/*** ISpellingError methods ***/
#define ISpellingError_get_StartIndex(This,val) (This)->lpVtbl->get_StartIndex(This,val)
#define ISpellingError_get_Length(This,val) (This)->lpVtbl->get_Length(This,val)
#define ISpellingError_get_CorrectiveAction(This,val) (This)->lpVtbl->get_CorrectiveAction(This,val)
#define ISpellingError_get_Replacement(This,val) (This)->lpVtbl->get_Replacement(This,val)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISpellingError_QueryInterface(ISpellingError* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISpellingError_AddRef(ISpellingError* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISpellingError_Release(ISpellingError* This) {
    return This->lpVtbl->Release(This);
}
/*** ISpellingError methods ***/
static __WIDL_INLINE HRESULT ISpellingError_get_StartIndex(ISpellingError* This,ULONG *val) {
    return This->lpVtbl->get_StartIndex(This,val);
}
static __WIDL_INLINE HRESULT ISpellingError_get_Length(ISpellingError* This,ULONG *val) {
    return This->lpVtbl->get_Length(This,val);
}
static __WIDL_INLINE HRESULT ISpellingError_get_CorrectiveAction(ISpellingError* This,CORRECTIVE_ACTION *val) {
    return This->lpVtbl->get_CorrectiveAction(This,val);
}
static __WIDL_INLINE HRESULT ISpellingError_get_Replacement(ISpellingError* This,LPWSTR *val) {
    return This->lpVtbl->get_Replacement(This,val);
}
#endif
#endif

#endif


#endif  /* __ISpellingError_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEnumSpellingError interface
 */
#ifndef __IEnumSpellingError_INTERFACE_DEFINED__
#define __IEnumSpellingError_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumSpellingError, 0x803e3bd4, 0x2828, 0x4410, 0x82,0x90, 0x41,0x8d,0x1d,0x73,0xc7,0x62);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("803e3bd4-2828-4410-8290-418d1d73c762")
IEnumSpellingError : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ISpellingError **val) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumSpellingError, 0x803e3bd4, 0x2828, 0x4410, 0x82,0x90, 0x41,0x8d,0x1d,0x73,0xc7,0x62)
#endif
#else
typedef struct IEnumSpellingErrorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEnumSpellingError methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumSpellingError *This,
        ISpellingError **val);

    END_INTERFACE
} IEnumSpellingErrorVtbl;

interface IEnumSpellingError {
    CONST_VTBL IEnumSpellingErrorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumSpellingError_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumSpellingError_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumSpellingError_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumSpellingError methods ***/
#define IEnumSpellingError_Next(This,val) (This)->lpVtbl->Next(This,val)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IEnumSpellingError_QueryInterface(IEnumSpellingError* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IEnumSpellingError_AddRef(IEnumSpellingError* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IEnumSpellingError_Release(IEnumSpellingError* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumSpellingError methods ***/
static __WIDL_INLINE HRESULT IEnumSpellingError_Next(IEnumSpellingError* This,ISpellingError **val) {
    return This->lpVtbl->Next(This,val);
}
#endif
#endif

#endif


#endif  /* __IEnumSpellingError_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IOptionDescription interface
 */
#ifndef __IOptionDescription_INTERFACE_DEFINED__
#define __IOptionDescription_INTERFACE_DEFINED__

DEFINE_GUID(IID_IOptionDescription, 0x432e5f85, 0x35cf, 0x4606, 0xa8,0x01, 0x6f,0x70,0x27,0x7e,0x1d,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("432e5f85-35cf-4606-a801-6f70277e1d7a")
IOptionDescription : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_Id(
        LPWSTR *val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Heading(
        LPWSTR *val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Description(
        LPWSTR *val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Labels(
        IEnumString **val) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IOptionDescription, 0x432e5f85, 0x35cf, 0x4606, 0xa8,0x01, 0x6f,0x70,0x27,0x7e,0x1d,0x7a)
#endif
#else
typedef struct IOptionDescriptionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IOptionDescription methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IOptionDescription *This,
        LPWSTR *val);

    HRESULT (STDMETHODCALLTYPE *get_Heading)(
        IOptionDescription *This,
        LPWSTR *val);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IOptionDescription *This,
        LPWSTR *val);

    HRESULT (STDMETHODCALLTYPE *get_Labels)(
        IOptionDescription *This,
        IEnumString **val);

    END_INTERFACE
} IOptionDescriptionVtbl;

interface IOptionDescription {
    CONST_VTBL IOptionDescriptionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IOptionDescription_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IOptionDescription_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IOptionDescription_Release(This) (This)->lpVtbl->Release(This)
/*** IOptionDescription methods ***/
#define IOptionDescription_get_Id(This,val) (This)->lpVtbl->get_Id(This,val)
#define IOptionDescription_get_Heading(This,val) (This)->lpVtbl->get_Heading(This,val)
#define IOptionDescription_get_Description(This,val) (This)->lpVtbl->get_Description(This,val)
#define IOptionDescription_get_Labels(This,val) (This)->lpVtbl->get_Labels(This,val)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IOptionDescription_QueryInterface(IOptionDescription* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IOptionDescription_AddRef(IOptionDescription* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IOptionDescription_Release(IOptionDescription* This) {
    return This->lpVtbl->Release(This);
}
/*** IOptionDescription methods ***/
static __WIDL_INLINE HRESULT IOptionDescription_get_Id(IOptionDescription* This,LPWSTR *val) {
    return This->lpVtbl->get_Id(This,val);
}
static __WIDL_INLINE HRESULT IOptionDescription_get_Heading(IOptionDescription* This,LPWSTR *val) {
    return This->lpVtbl->get_Heading(This,val);
}
static __WIDL_INLINE HRESULT IOptionDescription_get_Description(IOptionDescription* This,LPWSTR *val) {
    return This->lpVtbl->get_Description(This,val);
}
static __WIDL_INLINE HRESULT IOptionDescription_get_Labels(IOptionDescription* This,IEnumString **val) {
    return This->lpVtbl->get_Labels(This,val);
}
#endif
#endif

#endif


#endif  /* __IOptionDescription_INTERFACE_DEFINED__ */

#ifndef __ISpellChecker_FWD_DEFINED__
#define __ISpellChecker_FWD_DEFINED__
typedef interface ISpellChecker ISpellChecker;
#ifdef __cplusplus
interface ISpellChecker;
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * ISpellCheckerChangedEventHandler interface
 */
#ifndef __ISpellCheckerChangedEventHandler_INTERFACE_DEFINED__
#define __ISpellCheckerChangedEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISpellCheckerChangedEventHandler, 0x0b83a5b0, 0x792f, 0x4eab, 0x97,0x99, 0xac,0xf5,0x2c,0x5e,0xd0,0x8a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0b83a5b0-792f-4eab-9799-acf52c5ed08a")
ISpellCheckerChangedEventHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Invoke(
        ISpellChecker *sender) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISpellCheckerChangedEventHandler, 0x0b83a5b0, 0x792f, 0x4eab, 0x97,0x99, 0xac,0xf5,0x2c,0x5e,0xd0,0x8a)
#endif
#else
typedef struct ISpellCheckerChangedEventHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ISpellCheckerChangedEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISpellCheckerChangedEventHandler *This,
        ISpellChecker *sender);

    END_INTERFACE
} ISpellCheckerChangedEventHandlerVtbl;

interface ISpellCheckerChangedEventHandler {
    CONST_VTBL ISpellCheckerChangedEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISpellCheckerChangedEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISpellCheckerChangedEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISpellCheckerChangedEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** ISpellCheckerChangedEventHandler methods ***/
#define ISpellCheckerChangedEventHandler_Invoke(This,sender) (This)->lpVtbl->Invoke(This,sender)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISpellCheckerChangedEventHandler_QueryInterface(ISpellCheckerChangedEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISpellCheckerChangedEventHandler_AddRef(ISpellCheckerChangedEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISpellCheckerChangedEventHandler_Release(ISpellCheckerChangedEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** ISpellCheckerChangedEventHandler methods ***/
static __WIDL_INLINE HRESULT ISpellCheckerChangedEventHandler_Invoke(ISpellCheckerChangedEventHandler* This,ISpellChecker *sender) {
    return This->lpVtbl->Invoke(This,sender);
}
#endif
#endif

#endif


#endif  /* __ISpellCheckerChangedEventHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISpellChecker interface
 */
#ifndef __ISpellChecker_INTERFACE_DEFINED__
#define __ISpellChecker_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISpellChecker, 0xb6fd0b71, 0xe2bc, 0x4653, 0x8d,0x05, 0xf1,0x97,0xe4,0x12,0x77,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b6fd0b71-e2bc-4653-8d05-f197e412770b")
ISpellChecker : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_LanguageTag(
        LPWSTR *val) = 0;

    virtual HRESULT STDMETHODCALLTYPE Check(
        LPCWSTR text,
        IEnumSpellingError **val) = 0;

    virtual HRESULT STDMETHODCALLTYPE Suggest(
        LPCWSTR word,
        IEnumString **val) = 0;

    virtual HRESULT STDMETHODCALLTYPE Add(
        LPCWSTR word) = 0;

    virtual HRESULT STDMETHODCALLTYPE Ignore(
        LPCWSTR word) = 0;

    virtual HRESULT STDMETHODCALLTYPE AutoCorrect(
        LPCWSTR from,
        LPCWSTR to) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOptionValue(
        LPCWSTR option_id,
        BYTE *val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_OptionIds(
        IEnumString **val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Id(
        LPWSTR *val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LocalizedName(
        LPWSTR *val) = 0;

    virtual HRESULT STDMETHODCALLTYPE add_SpellCheckerChanged(
        ISpellCheckerChangedEventHandler *handler,
        DWORD *event_cookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE remove_SpellCheckerChanged(
        DWORD event_cookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOptionDescription(
        LPCWSTR optionId,
        IOptionDescription **val) = 0;

    virtual HRESULT STDMETHODCALLTYPE ComprehensiveCheck(
        LPCWSTR text,
        IEnumSpellingError **val) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISpellChecker, 0xb6fd0b71, 0xe2bc, 0x4653, 0x8d,0x05, 0xf1,0x97,0xe4,0x12,0x77,0x0b)
#endif
#else
typedef struct ISpellCheckerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ISpellChecker methods ***/
    HRESULT (STDMETHODCALLTYPE *get_LanguageTag)(
        ISpellChecker *This,
        LPWSTR *val);

    HRESULT (STDMETHODCALLTYPE *Check)(
        ISpellChecker *This,
        LPCWSTR text,
        IEnumSpellingError **val);

    HRESULT (STDMETHODCALLTYPE *Suggest)(
        ISpellChecker *This,
        LPCWSTR word,
        IEnumString **val);

    HRESULT (STDMETHODCALLTYPE *Add)(
        ISpellChecker *This,
        LPCWSTR word);

    HRESULT (STDMETHODCALLTYPE *Ignore)(
        ISpellChecker *This,
        LPCWSTR word);

    HRESULT (STDMETHODCALLTYPE *AutoCorrect)(
        ISpellChecker *This,
        LPCWSTR from,
        LPCWSTR to);

    HRESULT (STDMETHODCALLTYPE *GetOptionValue)(
        ISpellChecker *This,
        LPCWSTR option_id,
        BYTE *val);

    HRESULT (STDMETHODCALLTYPE *get_OptionIds)(
        ISpellChecker *This,
        IEnumString **val);

    HRESULT (STDMETHODCALLTYPE *get_Id)(
        ISpellChecker *This,
        LPWSTR *val);

    HRESULT (STDMETHODCALLTYPE *get_LocalizedName)(
        ISpellChecker *This,
        LPWSTR *val);

    HRESULT (STDMETHODCALLTYPE *add_SpellCheckerChanged)(
        ISpellChecker *This,
        ISpellCheckerChangedEventHandler *handler,
        DWORD *event_cookie);

    HRESULT (STDMETHODCALLTYPE *remove_SpellCheckerChanged)(
        ISpellChecker *This,
        DWORD event_cookie);

    HRESULT (STDMETHODCALLTYPE *GetOptionDescription)(
        ISpellChecker *This,
        LPCWSTR optionId,
        IOptionDescription **val);

    HRESULT (STDMETHODCALLTYPE *ComprehensiveCheck)(
        ISpellChecker *This,
        LPCWSTR text,
        IEnumSpellingError **val);

    END_INTERFACE
} ISpellCheckerVtbl;

interface ISpellChecker {
    CONST_VTBL ISpellCheckerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISpellChecker_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISpellChecker_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISpellChecker_Release(This) (This)->lpVtbl->Release(This)
/*** ISpellChecker methods ***/
#define ISpellChecker_get_LanguageTag(This,val) (This)->lpVtbl->get_LanguageTag(This,val)
#define ISpellChecker_Check(This,text,val) (This)->lpVtbl->Check(This,text,val)
#define ISpellChecker_Suggest(This,word,val) (This)->lpVtbl->Suggest(This,word,val)
#define ISpellChecker_Add(This,word) (This)->lpVtbl->Add(This,word)
#define ISpellChecker_Ignore(This,word) (This)->lpVtbl->Ignore(This,word)
#define ISpellChecker_AutoCorrect(This,from,to) (This)->lpVtbl->AutoCorrect(This,from,to)
#define ISpellChecker_GetOptionValue(This,option_id,val) (This)->lpVtbl->GetOptionValue(This,option_id,val)
#define ISpellChecker_get_OptionIds(This,val) (This)->lpVtbl->get_OptionIds(This,val)
#define ISpellChecker_get_Id(This,val) (This)->lpVtbl->get_Id(This,val)
#define ISpellChecker_get_LocalizedName(This,val) (This)->lpVtbl->get_LocalizedName(This,val)
#define ISpellChecker_add_SpellCheckerChanged(This,handler,event_cookie) (This)->lpVtbl->add_SpellCheckerChanged(This,handler,event_cookie)
#define ISpellChecker_remove_SpellCheckerChanged(This,event_cookie) (This)->lpVtbl->remove_SpellCheckerChanged(This,event_cookie)
#define ISpellChecker_GetOptionDescription(This,optionId,val) (This)->lpVtbl->GetOptionDescription(This,optionId,val)
#define ISpellChecker_ComprehensiveCheck(This,text,val) (This)->lpVtbl->ComprehensiveCheck(This,text,val)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISpellChecker_QueryInterface(ISpellChecker* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISpellChecker_AddRef(ISpellChecker* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISpellChecker_Release(ISpellChecker* This) {
    return This->lpVtbl->Release(This);
}
/*** ISpellChecker methods ***/
static __WIDL_INLINE HRESULT ISpellChecker_get_LanguageTag(ISpellChecker* This,LPWSTR *val) {
    return This->lpVtbl->get_LanguageTag(This,val);
}
static __WIDL_INLINE HRESULT ISpellChecker_Check(ISpellChecker* This,LPCWSTR text,IEnumSpellingError **val) {
    return This->lpVtbl->Check(This,text,val);
}
static __WIDL_INLINE HRESULT ISpellChecker_Suggest(ISpellChecker* This,LPCWSTR word,IEnumString **val) {
    return This->lpVtbl->Suggest(This,word,val);
}
static __WIDL_INLINE HRESULT ISpellChecker_Add(ISpellChecker* This,LPCWSTR word) {
    return This->lpVtbl->Add(This,word);
}
static __WIDL_INLINE HRESULT ISpellChecker_Ignore(ISpellChecker* This,LPCWSTR word) {
    return This->lpVtbl->Ignore(This,word);
}
static __WIDL_INLINE HRESULT ISpellChecker_AutoCorrect(ISpellChecker* This,LPCWSTR from,LPCWSTR to) {
    return This->lpVtbl->AutoCorrect(This,from,to);
}
static __WIDL_INLINE HRESULT ISpellChecker_GetOptionValue(ISpellChecker* This,LPCWSTR option_id,BYTE *val) {
    return This->lpVtbl->GetOptionValue(This,option_id,val);
}
static __WIDL_INLINE HRESULT ISpellChecker_get_OptionIds(ISpellChecker* This,IEnumString **val) {
    return This->lpVtbl->get_OptionIds(This,val);
}
static __WIDL_INLINE HRESULT ISpellChecker_get_Id(ISpellChecker* This,LPWSTR *val) {
    return This->lpVtbl->get_Id(This,val);
}
static __WIDL_INLINE HRESULT ISpellChecker_get_LocalizedName(ISpellChecker* This,LPWSTR *val) {
    return This->lpVtbl->get_LocalizedName(This,val);
}
static __WIDL_INLINE HRESULT ISpellChecker_add_SpellCheckerChanged(ISpellChecker* This,ISpellCheckerChangedEventHandler *handler,DWORD *event_cookie) {
    return This->lpVtbl->add_SpellCheckerChanged(This,handler,event_cookie);
}
static __WIDL_INLINE HRESULT ISpellChecker_remove_SpellCheckerChanged(ISpellChecker* This,DWORD event_cookie) {
    return This->lpVtbl->remove_SpellCheckerChanged(This,event_cookie);
}
static __WIDL_INLINE HRESULT ISpellChecker_GetOptionDescription(ISpellChecker* This,LPCWSTR optionId,IOptionDescription **val) {
    return This->lpVtbl->GetOptionDescription(This,optionId,val);
}
static __WIDL_INLINE HRESULT ISpellChecker_ComprehensiveCheck(ISpellChecker* This,LPCWSTR text,IEnumSpellingError **val) {
    return This->lpVtbl->ComprehensiveCheck(This,text,val);
}
#endif
#endif

#endif


#endif  /* __ISpellChecker_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISpellChecker2 interface
 */
#ifndef __ISpellChecker2_INTERFACE_DEFINED__
#define __ISpellChecker2_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISpellChecker2, 0xe7ed1c71, 0x87f7, 0x4378, 0xa8,0x40, 0xc9,0x20,0x0d,0xac,0xee,0x47);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e7ed1c71-87f7-4378-a840-c9200dacee47")
ISpellChecker2 : public ISpellChecker
{
    virtual HRESULT STDMETHODCALLTYPE Remove(
        LPCWSTR word) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISpellChecker2, 0xe7ed1c71, 0x87f7, 0x4378, 0xa8,0x40, 0xc9,0x20,0x0d,0xac,0xee,0x47)
#endif
#else
typedef struct ISpellChecker2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ISpellChecker methods ***/
    HRESULT (STDMETHODCALLTYPE *get_LanguageTag)(
        ISpellChecker2 *This,
        LPWSTR *val);

    HRESULT (STDMETHODCALLTYPE *Check)(
        ISpellChecker2 *This,
        LPCWSTR text,
        IEnumSpellingError **val);

    HRESULT (STDMETHODCALLTYPE *Suggest)(
        ISpellChecker2 *This,
        LPCWSTR word,
        IEnumString **val);

    HRESULT (STDMETHODCALLTYPE *Add)(
        ISpellChecker2 *This,
        LPCWSTR word);

    HRESULT (STDMETHODCALLTYPE *Ignore)(
        ISpellChecker2 *This,
        LPCWSTR word);

    HRESULT (STDMETHODCALLTYPE *AutoCorrect)(
        ISpellChecker2 *This,
        LPCWSTR from,
        LPCWSTR to);

    HRESULT (STDMETHODCALLTYPE *GetOptionValue)(
        ISpellChecker2 *This,
        LPCWSTR option_id,
        BYTE *val);

    HRESULT (STDMETHODCALLTYPE *get_OptionIds)(
        ISpellChecker2 *This,
        IEnumString **val);

    HRESULT (STDMETHODCALLTYPE *get_Id)(
        ISpellChecker2 *This,
        LPWSTR *val);

    HRESULT (STDMETHODCALLTYPE *get_LocalizedName)(
        ISpellChecker2 *This,
        LPWSTR *val);

    HRESULT (STDMETHODCALLTYPE *add_SpellCheckerChanged)(
        ISpellChecker2 *This,
        ISpellCheckerChangedEventHandler *handler,
        DWORD *event_cookie);

    HRESULT (STDMETHODCALLTYPE *remove_SpellCheckerChanged)(
        ISpellChecker2 *This,
        DWORD event_cookie);

    HRESULT (STDMETHODCALLTYPE *GetOptionDescription)(
        ISpellChecker2 *This,
        LPCWSTR optionId,
        IOptionDescription **val);

    HRESULT (STDMETHODCALLTYPE *ComprehensiveCheck)(
        ISpellChecker2 *This,
        LPCWSTR text,
        IEnumSpellingError **val);

    /*** ISpellChecker2 methods ***/
    HRESULT (STDMETHODCALLTYPE *Remove)(
        ISpellChecker2 *This,
        LPCWSTR word);

    END_INTERFACE
} ISpellChecker2Vtbl;

interface ISpellChecker2 {
    CONST_VTBL ISpellChecker2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISpellChecker2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISpellChecker2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISpellChecker2_Release(This) (This)->lpVtbl->Release(This)
/*** ISpellChecker methods ***/
#define ISpellChecker2_get_LanguageTag(This,val) (This)->lpVtbl->get_LanguageTag(This,val)
#define ISpellChecker2_Check(This,text,val) (This)->lpVtbl->Check(This,text,val)
#define ISpellChecker2_Suggest(This,word,val) (This)->lpVtbl->Suggest(This,word,val)
#define ISpellChecker2_Add(This,word) (This)->lpVtbl->Add(This,word)
#define ISpellChecker2_Ignore(This,word) (This)->lpVtbl->Ignore(This,word)
#define ISpellChecker2_AutoCorrect(This,from,to) (This)->lpVtbl->AutoCorrect(This,from,to)
#define ISpellChecker2_GetOptionValue(This,option_id,val) (This)->lpVtbl->GetOptionValue(This,option_id,val)
#define ISpellChecker2_get_OptionIds(This,val) (This)->lpVtbl->get_OptionIds(This,val)
#define ISpellChecker2_get_Id(This,val) (This)->lpVtbl->get_Id(This,val)
#define ISpellChecker2_get_LocalizedName(This,val) (This)->lpVtbl->get_LocalizedName(This,val)
#define ISpellChecker2_add_SpellCheckerChanged(This,handler,event_cookie) (This)->lpVtbl->add_SpellCheckerChanged(This,handler,event_cookie)
#define ISpellChecker2_remove_SpellCheckerChanged(This,event_cookie) (This)->lpVtbl->remove_SpellCheckerChanged(This,event_cookie)
#define ISpellChecker2_GetOptionDescription(This,optionId,val) (This)->lpVtbl->GetOptionDescription(This,optionId,val)
#define ISpellChecker2_ComprehensiveCheck(This,text,val) (This)->lpVtbl->ComprehensiveCheck(This,text,val)
/*** ISpellChecker2 methods ***/
#define ISpellChecker2_Remove(This,word) (This)->lpVtbl->Remove(This,word)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISpellChecker2_QueryInterface(ISpellChecker2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISpellChecker2_AddRef(ISpellChecker2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISpellChecker2_Release(ISpellChecker2* This) {
    return This->lpVtbl->Release(This);
}
/*** ISpellChecker methods ***/
static __WIDL_INLINE HRESULT ISpellChecker2_get_LanguageTag(ISpellChecker2* This,LPWSTR *val) {
    return This->lpVtbl->get_LanguageTag(This,val);
}
static __WIDL_INLINE HRESULT ISpellChecker2_Check(ISpellChecker2* This,LPCWSTR text,IEnumSpellingError **val) {
    return This->lpVtbl->Check(This,text,val);
}
static __WIDL_INLINE HRESULT ISpellChecker2_Suggest(ISpellChecker2* This,LPCWSTR word,IEnumString **val) {
    return This->lpVtbl->Suggest(This,word,val);
}
static __WIDL_INLINE HRESULT ISpellChecker2_Add(ISpellChecker2* This,LPCWSTR word) {
    return This->lpVtbl->Add(This,word);
}
static __WIDL_INLINE HRESULT ISpellChecker2_Ignore(ISpellChecker2* This,LPCWSTR word) {
    return This->lpVtbl->Ignore(This,word);
}
static __WIDL_INLINE HRESULT ISpellChecker2_AutoCorrect(ISpellChecker2* This,LPCWSTR from,LPCWSTR to) {
    return This->lpVtbl->AutoCorrect(This,from,to);
}
static __WIDL_INLINE HRESULT ISpellChecker2_GetOptionValue(ISpellChecker2* This,LPCWSTR option_id,BYTE *val) {
    return This->lpVtbl->GetOptionValue(This,option_id,val);
}
static __WIDL_INLINE HRESULT ISpellChecker2_get_OptionIds(ISpellChecker2* This,IEnumString **val) {
    return This->lpVtbl->get_OptionIds(This,val);
}
static __WIDL_INLINE HRESULT ISpellChecker2_get_Id(ISpellChecker2* This,LPWSTR *val) {
    return This->lpVtbl->get_Id(This,val);
}
static __WIDL_INLINE HRESULT ISpellChecker2_get_LocalizedName(ISpellChecker2* This,LPWSTR *val) {
    return This->lpVtbl->get_LocalizedName(This,val);
}
static __WIDL_INLINE HRESULT ISpellChecker2_add_SpellCheckerChanged(ISpellChecker2* This,ISpellCheckerChangedEventHandler *handler,DWORD *event_cookie) {
    return This->lpVtbl->add_SpellCheckerChanged(This,handler,event_cookie);
}
static __WIDL_INLINE HRESULT ISpellChecker2_remove_SpellCheckerChanged(ISpellChecker2* This,DWORD event_cookie) {
    return This->lpVtbl->remove_SpellCheckerChanged(This,event_cookie);
}
static __WIDL_INLINE HRESULT ISpellChecker2_GetOptionDescription(ISpellChecker2* This,LPCWSTR optionId,IOptionDescription **val) {
    return This->lpVtbl->GetOptionDescription(This,optionId,val);
}
static __WIDL_INLINE HRESULT ISpellChecker2_ComprehensiveCheck(ISpellChecker2* This,LPCWSTR text,IEnumSpellingError **val) {
    return This->lpVtbl->ComprehensiveCheck(This,text,val);
}
/*** ISpellChecker2 methods ***/
static __WIDL_INLINE HRESULT ISpellChecker2_Remove(ISpellChecker2* This,LPCWSTR word) {
    return This->lpVtbl->Remove(This,word);
}
#endif
#endif

#endif


#endif  /* __ISpellChecker2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISpellCheckerFactory interface
 */
#ifndef __ISpellCheckerFactory_INTERFACE_DEFINED__
#define __ISpellCheckerFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISpellCheckerFactory, 0x8e018a9d, 0x2415, 0x4677, 0xbf,0x08, 0x79,0x4e,0xa6,0x1f,0x94,0xbb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8e018a9d-2415-4677-bf08-794ea61f94bb")
ISpellCheckerFactory : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_SupportedLanguages(
        IEnumString **val) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsSupported(
        LPCWSTR languageTag,
        WINBOOL *val) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSpellChecker(
        LPCWSTR languageTag,
        ISpellChecker **val) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISpellCheckerFactory, 0x8e018a9d, 0x2415, 0x4677, 0xbf,0x08, 0x79,0x4e,0xa6,0x1f,0x94,0xbb)
#endif
#else
typedef struct ISpellCheckerFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ISpellCheckerFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *get_SupportedLanguages)(
        ISpellCheckerFactory *This,
        IEnumString **val);

    HRESULT (STDMETHODCALLTYPE *IsSupported)(
        ISpellCheckerFactory *This,
        LPCWSTR languageTag,
        WINBOOL *val);

    HRESULT (STDMETHODCALLTYPE *CreateSpellChecker)(
        ISpellCheckerFactory *This,
        LPCWSTR languageTag,
        ISpellChecker **val);

    END_INTERFACE
} ISpellCheckerFactoryVtbl;

interface ISpellCheckerFactory {
    CONST_VTBL ISpellCheckerFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISpellCheckerFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISpellCheckerFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISpellCheckerFactory_Release(This) (This)->lpVtbl->Release(This)
/*** ISpellCheckerFactory methods ***/
#define ISpellCheckerFactory_get_SupportedLanguages(This,val) (This)->lpVtbl->get_SupportedLanguages(This,val)
#define ISpellCheckerFactory_IsSupported(This,languageTag,val) (This)->lpVtbl->IsSupported(This,languageTag,val)
#define ISpellCheckerFactory_CreateSpellChecker(This,languageTag,val) (This)->lpVtbl->CreateSpellChecker(This,languageTag,val)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISpellCheckerFactory_QueryInterface(ISpellCheckerFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISpellCheckerFactory_AddRef(ISpellCheckerFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISpellCheckerFactory_Release(ISpellCheckerFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** ISpellCheckerFactory methods ***/
static __WIDL_INLINE HRESULT ISpellCheckerFactory_get_SupportedLanguages(ISpellCheckerFactory* This,IEnumString **val) {
    return This->lpVtbl->get_SupportedLanguages(This,val);
}
static __WIDL_INLINE HRESULT ISpellCheckerFactory_IsSupported(ISpellCheckerFactory* This,LPCWSTR languageTag,WINBOOL *val) {
    return This->lpVtbl->IsSupported(This,languageTag,val);
}
static __WIDL_INLINE HRESULT ISpellCheckerFactory_CreateSpellChecker(ISpellCheckerFactory* This,LPCWSTR languageTag,ISpellChecker **val) {
    return This->lpVtbl->CreateSpellChecker(This,languageTag,val);
}
#endif
#endif

#endif


#endif  /* __ISpellCheckerFactory_INTERFACE_DEFINED__ */

#endif /* WINAPI_PARTITION_APP */
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
/*****************************************************************************
 * IUserDictionariesRegistrar interface
 */
#ifndef __IUserDictionariesRegistrar_INTERFACE_DEFINED__
#define __IUserDictionariesRegistrar_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUserDictionariesRegistrar, 0xaa176b85, 0x0e12, 0x4844, 0x8e,0x1a, 0xee,0xf1,0xda,0x77,0xf5,0x86);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("aa176b85-0e12-4844-8e1a-eef1da77f586")
IUserDictionariesRegistrar : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE RegisterUserDictionary(
        LPCWSTR dictionaryPath,
        LPCWSTR languageTag) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnregisterUserDictionary(
        LPCWSTR dictionaryPath,
        LPCWSTR languageTag) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUserDictionariesRegistrar, 0xaa176b85, 0x0e12, 0x4844, 0x8e,0x1a, 0xee,0xf1,0xda,0x77,0xf5,0x86)
#endif
#else
typedef struct IUserDictionariesRegistrarVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUserDictionariesRegistrar methods ***/
    HRESULT (STDMETHODCALLTYPE *RegisterUserDictionary)(
        IUserDictionariesRegistrar *This,
        LPCWSTR dictionaryPath,
        LPCWSTR languageTag);

    HRESULT (STDMETHODCALLTYPE *UnregisterUserDictionary)(
        IUserDictionariesRegistrar *This,
        LPCWSTR dictionaryPath,
        LPCWSTR languageTag);

    END_INTERFACE
} IUserDictionariesRegistrarVtbl;

interface IUserDictionariesRegistrar {
    CONST_VTBL IUserDictionariesRegistrarVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUserDictionariesRegistrar_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUserDictionariesRegistrar_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUserDictionariesRegistrar_Release(This) (This)->lpVtbl->Release(This)
/*** IUserDictionariesRegistrar methods ***/
#define IUserDictionariesRegistrar_RegisterUserDictionary(This,dictionaryPath,languageTag) (This)->lpVtbl->RegisterUserDictionary(This,dictionaryPath,languageTag)
#define IUserDictionariesRegistrar_UnregisterUserDictionary(This,dictionaryPath,languageTag) (This)->lpVtbl->UnregisterUserDictionary(This,dictionaryPath,languageTag)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUserDictionariesRegistrar_QueryInterface(IUserDictionariesRegistrar* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUserDictionariesRegistrar_AddRef(IUserDictionariesRegistrar* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUserDictionariesRegistrar_Release(IUserDictionariesRegistrar* This) {
    return This->lpVtbl->Release(This);
}
/*** IUserDictionariesRegistrar methods ***/
static __WIDL_INLINE HRESULT IUserDictionariesRegistrar_RegisterUserDictionary(IUserDictionariesRegistrar* This,LPCWSTR dictionaryPath,LPCWSTR languageTag) {
    return This->lpVtbl->RegisterUserDictionary(This,dictionaryPath,languageTag);
}
static __WIDL_INLINE HRESULT IUserDictionariesRegistrar_UnregisterUserDictionary(IUserDictionariesRegistrar* This,LPCWSTR dictionaryPath,LPCWSTR languageTag) {
    return This->lpVtbl->UnregisterUserDictionary(This,dictionaryPath,languageTag);
}
#endif
#endif

#endif


#endif  /* __IUserDictionariesRegistrar_INTERFACE_DEFINED__ */

#endif /* WINAPI_PARTITION_DESKTOP */
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
#ifndef __MsSpellCheckLib_LIBRARY_DEFINED__
#define __MsSpellCheckLib_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_MsSpellCheckLib, 0x4a250e01, 0x61ea, 0x400b, 0xa2,0x7d, 0xbf,0x37,0x44,0xbc,0xc9,0xf5);

/*****************************************************************************
 * SpellCheckerFactory coclass
 */

DEFINE_GUID(CLSID_SpellCheckerFactory, 0x7ab36653, 0x1796, 0x484b, 0xbd,0xfa, 0xe7,0x4f,0x1d,0xb7,0xc1,0xdc);

#ifdef __cplusplus
class DECLSPEC_UUID("7ab36653-1796-484b-bdfa-e74f1db7c1dc") SpellCheckerFactory;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SpellCheckerFactory, 0x7ab36653, 0x1796, 0x484b, 0xbd,0xfa, 0xe7,0x4f,0x1d,0xb7,0xc1,0xdc)
#endif
#endif

#endif /* __MsSpellCheckLib_LIBRARY_DEFINED__ */
#endif /* WINAPI_PARTITION_APP */
#endif /* MIN_SPELLING_NTDDI */
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __spellcheck_h__ */
