/*** Autogenerated by WIDL 6.4 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__

/* 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 FORCEINLINE HRESULT ISpellingError_QueryInterface(ISpellingError* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISpellingError_AddRef(ISpellingError* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISpellingError_Release(ISpellingError* This) {
    return This->lpVtbl->Release(This);
}
/*** ISpellingError methods ***/
static FORCEINLINE HRESULT ISpellingError_get_StartIndex(ISpellingError* This,ULONG *val) {
    return This->lpVtbl->get_StartIndex(This,val);
}
static FORCEINLINE HRESULT ISpellingError_get_Length(ISpellingError* This,ULONG *val) {
    return This->lpVtbl->get_Length(This,val);
}
static FORCEINLINE HRESULT ISpellingError_get_CorrectiveAction(ISpellingError* This,CORRECTIVE_ACTION *val) {
    return This->lpVtbl->get_CorrectiveAction(This,val);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IEnumSpellingError_QueryInterface(IEnumSpellingError* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumSpellingError_AddRef(IEnumSpellingError* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumSpellingError_Release(IEnumSpellingError* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumSpellingError methods ***/
static FORCEINLINE 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 FORCEINLINE HRESULT IOptionDescription_QueryInterface(IOptionDescription* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IOptionDescription_AddRef(IOptionDescription* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IOptionDescription_Release(IOptionDescription* This) {
    return This->lpVtbl->Release(This);
}
/*** IOptionDescription methods ***/
static FORCEINLINE HRESULT IOptionDescription_get_Id(IOptionDescription* This,LPWSTR *val) {
    return This->lpVtbl->get_Id(This,val);
}
static FORCEINLINE HRESULT IOptionDescription_get_Heading(IOptionDescription* This,LPWSTR *val) {
    return This->lpVtbl->get_Heading(This,val);
}
static FORCEINLINE HRESULT IOptionDescription_get_Description(IOptionDescription* This,LPWSTR *val) {
    return This->lpVtbl->get_Description(This,val);
}
static FORCEINLINE 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 FORCEINLINE HRESULT ISpellCheckerChangedEventHandler_QueryInterface(ISpellCheckerChangedEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISpellCheckerChangedEventHandler_AddRef(ISpellCheckerChangedEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISpellCheckerChangedEventHandler_Release(ISpellCheckerChangedEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** ISpellCheckerChangedEventHandler methods ***/
static FORCEINLINE 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 FORCEINLINE HRESULT ISpellChecker_QueryInterface(ISpellChecker* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISpellChecker_AddRef(ISpellChecker* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISpellChecker_Release(ISpellChecker* This) {
    return This->lpVtbl->Release(This);
}
/*** ISpellChecker methods ***/
static FORCEINLINE HRESULT ISpellChecker_get_LanguageTag(ISpellChecker* This,LPWSTR *val) {
    return This->lpVtbl->get_LanguageTag(This,val);
}
static FORCEINLINE HRESULT ISpellChecker_Check(ISpellChecker* This,LPCWSTR text,IEnumSpellingError **val) {
    return This->lpVtbl->Check(This,text,val);
}
static FORCEINLINE HRESULT ISpellChecker_Suggest(ISpellChecker* This,LPCWSTR word,IEnumString **val) {
    return This->lpVtbl->Suggest(This,word,val);
}
static FORCEINLINE HRESULT ISpellChecker_Add(ISpellChecker* This,LPCWSTR word) {
    return This->lpVtbl->Add(This,word);
}
static FORCEINLINE HRESULT ISpellChecker_Ignore(ISpellChecker* This,LPCWSTR word) {
    return This->lpVtbl->Ignore(This,word);
}
static FORCEINLINE HRESULT ISpellChecker_AutoCorrect(ISpellChecker* This,LPCWSTR from,LPCWSTR to) {
    return This->lpVtbl->AutoCorrect(This,from,to);
}
static FORCEINLINE HRESULT ISpellChecker_GetOptionValue(ISpellChecker* This,LPCWSTR option_id,BYTE *val) {
    return This->lpVtbl->GetOptionValue(This,option_id,val);
}
static FORCEINLINE HRESULT ISpellChecker_get_OptionIds(ISpellChecker* This,IEnumString **val) {
    return This->lpVtbl->get_OptionIds(This,val);
}
static FORCEINLINE HRESULT ISpellChecker_get_Id(ISpellChecker* This,LPWSTR *val) {
    return This->lpVtbl->get_Id(This,val);
}
static FORCEINLINE HRESULT ISpellChecker_get_LocalizedName(ISpellChecker* This,LPWSTR *val) {
    return This->lpVtbl->get_LocalizedName(This,val);
}
static FORCEINLINE HRESULT ISpellChecker_add_SpellCheckerChanged(ISpellChecker* This,ISpellCheckerChangedEventHandler *handler,DWORD *event_cookie) {
    return This->lpVtbl->add_SpellCheckerChanged(This,handler,event_cookie);
}
static FORCEINLINE HRESULT ISpellChecker_remove_SpellCheckerChanged(ISpellChecker* This,DWORD event_cookie) {
    return This->lpVtbl->remove_SpellCheckerChanged(This,event_cookie);
}
static FORCEINLINE HRESULT ISpellChecker_GetOptionDescription(ISpellChecker* This,LPCWSTR optionId,IOptionDescription **val) {
    return This->lpVtbl->GetOptionDescription(This,optionId,val);
}
static FORCEINLINE 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 FORCEINLINE HRESULT ISpellChecker2_QueryInterface(ISpellChecker2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISpellChecker2_AddRef(ISpellChecker2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISpellChecker2_Release(ISpellChecker2* This) {
    return This->lpVtbl->Release(This);
}
/*** ISpellChecker methods ***/
static FORCEINLINE HRESULT ISpellChecker2_get_LanguageTag(ISpellChecker2* This,LPWSTR *val) {
    return This->lpVtbl->get_LanguageTag(This,val);
}
static FORCEINLINE HRESULT ISpellChecker2_Check(ISpellChecker2* This,LPCWSTR text,IEnumSpellingError **val) {
    return This->lpVtbl->Check(This,text,val);
}
static FORCEINLINE HRESULT ISpellChecker2_Suggest(ISpellChecker2* This,LPCWSTR word,IEnumString **val) {
    return This->lpVtbl->Suggest(This,word,val);
}
static FORCEINLINE HRESULT ISpellChecker2_Add(ISpellChecker2* This,LPCWSTR word) {
    return This->lpVtbl->Add(This,word);
}
static FORCEINLINE HRESULT ISpellChecker2_Ignore(ISpellChecker2* This,LPCWSTR word) {
    return This->lpVtbl->Ignore(This,word);
}
static FORCEINLINE HRESULT ISpellChecker2_AutoCorrect(ISpellChecker2* This,LPCWSTR from,LPCWSTR to) {
    return This->lpVtbl->AutoCorrect(This,from,to);
}
static FORCEINLINE HRESULT ISpellChecker2_GetOptionValue(ISpellChecker2* This,LPCWSTR option_id,BYTE *val) {
    return This->lpVtbl->GetOptionValue(This,option_id,val);
}
static FORCEINLINE HRESULT ISpellChecker2_get_OptionIds(ISpellChecker2* This,IEnumString **val) {
    return This->lpVtbl->get_OptionIds(This,val);
}
static FORCEINLINE HRESULT ISpellChecker2_get_Id(ISpellChecker2* This,LPWSTR *val) {
    return This->lpVtbl->get_Id(This,val);
}
static FORCEINLINE HRESULT ISpellChecker2_get_LocalizedName(ISpellChecker2* This,LPWSTR *val) {
    return This->lpVtbl->get_LocalizedName(This,val);
}
static FORCEINLINE HRESULT ISpellChecker2_add_SpellCheckerChanged(ISpellChecker2* This,ISpellCheckerChangedEventHandler *handler,DWORD *event_cookie) {
    return This->lpVtbl->add_SpellCheckerChanged(This,handler,event_cookie);
}
static FORCEINLINE HRESULT ISpellChecker2_remove_SpellCheckerChanged(ISpellChecker2* This,DWORD event_cookie) {
    return This->lpVtbl->remove_SpellCheckerChanged(This,event_cookie);
}
static FORCEINLINE HRESULT ISpellChecker2_GetOptionDescription(ISpellChecker2* This,LPCWSTR optionId,IOptionDescription **val) {
    return This->lpVtbl->GetOptionDescription(This,optionId,val);
}
static FORCEINLINE HRESULT ISpellChecker2_ComprehensiveCheck(ISpellChecker2* This,LPCWSTR text,IEnumSpellingError **val) {
    return This->lpVtbl->ComprehensiveCheck(This,text,val);
}
/*** ISpellChecker2 methods ***/
static FORCEINLINE 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 FORCEINLINE HRESULT ISpellCheckerFactory_QueryInterface(ISpellCheckerFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISpellCheckerFactory_AddRef(ISpellCheckerFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISpellCheckerFactory_Release(ISpellCheckerFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** ISpellCheckerFactory methods ***/
static FORCEINLINE HRESULT ISpellCheckerFactory_get_SupportedLanguages(ISpellCheckerFactory* This,IEnumString **val) {
    return This->lpVtbl->get_SupportedLanguages(This,val);
}
static FORCEINLINE HRESULT ISpellCheckerFactory_IsSupported(ISpellCheckerFactory* This,LPCWSTR languageTag,WINBOOL *val) {
    return This->lpVtbl->IsSupported(This,languageTag,val);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IUserDictionariesRegistrar_QueryInterface(IUserDictionariesRegistrar* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUserDictionariesRegistrar_AddRef(IUserDictionariesRegistrar* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUserDictionariesRegistrar_Release(IUserDictionariesRegistrar* This) {
    return This->lpVtbl->Release(This);
}
/*** IUserDictionariesRegistrar methods ***/
static FORCEINLINE HRESULT IUserDictionariesRegistrar_RegisterUserDictionary(IUserDictionariesRegistrar* This,LPCWSTR dictionaryPath,LPCWSTR languageTag) {
    return This->lpVtbl->RegisterUserDictionary(This,dictionaryPath,languageTag);
}
static FORCEINLINE 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__ */
