/*** Autogenerated by WIDL 0.1 from mlang.idl - Do not edit ***/
#include <rpc.h>
#include <rpcndr.h>

#ifndef __WIDL_MLANG_H
#define __WIDL_MLANG_H
#ifdef __cplusplus
extern "C" {
#endif
#include <unknwn.h>
#ifndef __IStream_FWD_DEFINED__
#define __IStream_FWD_DEFINED__
typedef struct IStream IStream;
#endif

#ifndef __WINE_WINNT_H
typedef WORD LANGID;

#endif
#ifndef __IMLangCodePages_FWD_DEFINED__
#define __IMLangCodePages_FWD_DEFINED__
typedef struct IMLangCodePages IMLangCodePages;
#endif

/*****************************************************************************
 * IMLangCodePages interface
 */
#ifndef __IMLangCodePages_INTERFACE_DEFINED__
#define __IMLangCodePages_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
struct IMLangCodePages : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCharCodePages(
        WCHAR chSrc,
        DWORD* pdwCodePages) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStrCodePages(
        const WCHAR* pszSrc,
        long cchSrc,
        DWORD dwPriorityCodePages,
        DWORD* pdwCodePages,
        long* pcchCodePages) = 0;

    virtual HRESULT STDMETHODCALLTYPE CodePageToCodePages(
        UINT uCodePage,
        DWORD* pdwCodePages) = 0;

    virtual HRESULT STDMETHODCALLTYPE CodePagesToCodePage(
        DWORD dwCodePages,
        UINT uDefaultCodePage,
        UINT* puCodePage) = 0;

};
#else
typedef struct IMLangCodePagesVtbl IMLangCodePagesVtbl;
struct IMLangCodePages {
    const IMLangCodePagesVtbl* lpVtbl;
};
struct IMLangCodePagesVtbl {
    ICOM_MSVTABLE_COMPAT_FIELDS

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

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

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

    /*** IMLangCodePages methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCharCodePages)(
        IMLangCodePages* This,
        WCHAR chSrc,
        DWORD* pdwCodePages);

    HRESULT (STDMETHODCALLTYPE *GetStrCodePages)(
        IMLangCodePages* This,
        const WCHAR* pszSrc,
        long cchSrc,
        DWORD dwPriorityCodePages,
        DWORD* pdwCodePages,
        long* pcchCodePages);

    HRESULT (STDMETHODCALLTYPE *CodePageToCodePages)(
        IMLangCodePages* This,
        UINT uCodePage,
        DWORD* pdwCodePages);

    HRESULT (STDMETHODCALLTYPE *CodePagesToCodePage)(
        IMLangCodePages* This,
        DWORD dwCodePages,
        UINT uDefaultCodePage,
        UINT* puCodePage);

};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IMLangCodePages_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IMLangCodePages_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IMLangCodePages_Release(p) (p)->lpVtbl->Release(p)
/*** IMLangCodePages methods ***/
#define IMLangCodePages_GetCharCodePages(p,a,b) (p)->lpVtbl->GetCharCodePages(p,a,b)
#define IMLangCodePages_GetStrCodePages(p,a,b,c,d,e) (p)->lpVtbl->GetStrCodePages(p,a,b,c,d,e)
#define IMLangCodePages_CodePageToCodePages(p,a,b) (p)->lpVtbl->CodePageToCodePages(p,a,b)
#define IMLangCodePages_CodePagesToCodePage(p,a,b,c) (p)->lpVtbl->CodePagesToCodePage(p,a,b,c)
#endif

#endif

#define IMLangCodePages_METHODS \
    ICOM_MSVTABLE_COMPAT_FIELDS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IMLangCodePages methods ***/ \
    STDMETHOD_(HRESULT,GetCharCodePages)(THIS_ WCHAR chSrc, DWORD* pdwCodePages) PURE; \
    STDMETHOD_(HRESULT,GetStrCodePages)(THIS_ const WCHAR* pszSrc, long cchSrc, DWORD dwPriorityCodePages, DWORD* pdwCodePages, long* pcchCodePages) PURE; \
    STDMETHOD_(HRESULT,CodePageToCodePages)(THIS_ UINT uCodePage, DWORD* pdwCodePages) PURE; \
    STDMETHOD_(HRESULT,CodePagesToCodePage)(THIS_ DWORD dwCodePages, UINT uDefaultCodePage, UINT* puCodePage) PURE;

HRESULT CALLBACK IMLangCodePages_GetCharCodePages_Proxy(
    IMLangCodePages* This,
    WCHAR chSrc,
    DWORD* pdwCodePages);
void __RPC_STUB IMLangCodePages_GetCharCodePages_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMLangCodePages_GetStrCodePages_Proxy(
    IMLangCodePages* This,
    const WCHAR* pszSrc,
    long cchSrc,
    DWORD dwPriorityCodePages,
    DWORD* pdwCodePages,
    long* pcchCodePages);
void __RPC_STUB IMLangCodePages_GetStrCodePages_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMLangCodePages_CodePageToCodePages_Proxy(
    IMLangCodePages* This,
    UINT uCodePage,
    DWORD* pdwCodePages);
void __RPC_STUB IMLangCodePages_CodePageToCodePages_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMLangCodePages_CodePagesToCodePage_Proxy(
    IMLangCodePages* This,
    DWORD dwCodePages,
    UINT uDefaultCodePage,
    UINT* puCodePage);
void __RPC_STUB IMLangCodePages_CodePagesToCodePage_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IMLangCodePages_INTERFACE_DEFINED__ */

#ifndef __IMLangFontLink_FWD_DEFINED__
#define __IMLangFontLink_FWD_DEFINED__
typedef struct IMLangFontLink IMLangFontLink;
#endif

/*****************************************************************************
 * IMLangFontLink interface
 */
#ifndef __IMLangFontLink_INTERFACE_DEFINED__
#define __IMLangFontLink_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
struct IMLangFontLink : public IMLangCodePages
{
    virtual HRESULT STDMETHODCALLTYPE GetFontCodePages(
        HDC hDC,
        HFONT hFont,
        DWORD* pdwCodePages) = 0;

    virtual HRESULT STDMETHODCALLTYPE MapFont(
        HDC hDC,
        DWORD dwCodePages,
        HFONT hSrcFont,
        HFONT* phDestFont) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReleaseFont(
        HFONT hFont) = 0;

    virtual HRESULT STDMETHODCALLTYPE ResetFontMapping(
        ) = 0;

};
#else
typedef struct IMLangFontLinkVtbl IMLangFontLinkVtbl;
struct IMLangFontLink {
    const IMLangFontLinkVtbl* lpVtbl;
};
struct IMLangFontLinkVtbl {
    ICOM_MSVTABLE_COMPAT_FIELDS

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

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

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

    /*** IMLangCodePages methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCharCodePages)(
        IMLangFontLink* This,
        WCHAR chSrc,
        DWORD* pdwCodePages);

    HRESULT (STDMETHODCALLTYPE *GetStrCodePages)(
        IMLangFontLink* This,
        const WCHAR* pszSrc,
        long cchSrc,
        DWORD dwPriorityCodePages,
        DWORD* pdwCodePages,
        long* pcchCodePages);

    HRESULT (STDMETHODCALLTYPE *CodePageToCodePages)(
        IMLangFontLink* This,
        UINT uCodePage,
        DWORD* pdwCodePages);

    HRESULT (STDMETHODCALLTYPE *CodePagesToCodePage)(
        IMLangFontLink* This,
        DWORD dwCodePages,
        UINT uDefaultCodePage,
        UINT* puCodePage);

    /*** IMLangFontLink methods ***/
    HRESULT (STDMETHODCALLTYPE *GetFontCodePages)(
        IMLangFontLink* This,
        HDC hDC,
        HFONT hFont,
        DWORD* pdwCodePages);

    HRESULT (STDMETHODCALLTYPE *MapFont)(
        IMLangFontLink* This,
        HDC hDC,
        DWORD dwCodePages,
        HFONT hSrcFont,
        HFONT* phDestFont);

    HRESULT (STDMETHODCALLTYPE *ReleaseFont)(
        IMLangFontLink* This,
        HFONT hFont);

    HRESULT (STDMETHODCALLTYPE *ResetFontMapping)(
        IMLangFontLink* This);

};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IMLangFontLink_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IMLangFontLink_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IMLangFontLink_Release(p) (p)->lpVtbl->Release(p)
/*** IMLangCodePages methods ***/
#define IMLangFontLink_GetCharCodePages(p,a,b) (p)->lpVtbl->GetCharCodePages(p,a,b)
#define IMLangFontLink_GetStrCodePages(p,a,b,c,d,e) (p)->lpVtbl->GetStrCodePages(p,a,b,c,d,e)
#define IMLangFontLink_CodePageToCodePages(p,a,b) (p)->lpVtbl->CodePageToCodePages(p,a,b)
#define IMLangFontLink_CodePagesToCodePage(p,a,b,c) (p)->lpVtbl->CodePagesToCodePage(p,a,b,c)
/*** IMLangFontLink methods ***/
#define IMLangFontLink_GetFontCodePages(p,a,b,c) (p)->lpVtbl->GetFontCodePages(p,a,b,c)
#define IMLangFontLink_MapFont(p,a,b,c,d) (p)->lpVtbl->MapFont(p,a,b,c,d)
#define IMLangFontLink_ReleaseFont(p,a) (p)->lpVtbl->ReleaseFont(p,a)
#define IMLangFontLink_ResetFontMapping(p) (p)->lpVtbl->ResetFontMapping(p)
#endif

#endif

#define IMLangFontLink_METHODS \
    ICOM_MSVTABLE_COMPAT_FIELDS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IMLangCodePages methods ***/ \
    STDMETHOD_(HRESULT,GetCharCodePages)(THIS_ WCHAR chSrc, DWORD* pdwCodePages) PURE; \
    STDMETHOD_(HRESULT,GetStrCodePages)(THIS_ const WCHAR* pszSrc, long cchSrc, DWORD dwPriorityCodePages, DWORD* pdwCodePages, long* pcchCodePages) PURE; \
    STDMETHOD_(HRESULT,CodePageToCodePages)(THIS_ UINT uCodePage, DWORD* pdwCodePages) PURE; \
    STDMETHOD_(HRESULT,CodePagesToCodePage)(THIS_ DWORD dwCodePages, UINT uDefaultCodePage, UINT* puCodePage) PURE; \
    /*** IMLangFontLink methods ***/ \
    STDMETHOD_(HRESULT,GetFontCodePages)(THIS_ HDC hDC, HFONT hFont, DWORD* pdwCodePages) PURE; \
    STDMETHOD_(HRESULT,MapFont)(THIS_ HDC hDC, DWORD dwCodePages, HFONT hSrcFont, HFONT* phDestFont) PURE; \
    STDMETHOD_(HRESULT,ReleaseFont)(THIS_ HFONT hFont) PURE; \
    STDMETHOD_(HRESULT,ResetFontMapping)(THIS) PURE;

HRESULT CALLBACK IMLangFontLink_GetFontCodePages_Proxy(
    IMLangFontLink* This,
    HDC hDC,
    HFONT hFont,
    DWORD* pdwCodePages);
void __RPC_STUB IMLangFontLink_GetFontCodePages_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMLangFontLink_MapFont_Proxy(
    IMLangFontLink* This,
    HDC hDC,
    DWORD dwCodePages,
    HFONT hSrcFont,
    HFONT* phDestFont);
void __RPC_STUB IMLangFontLink_MapFont_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMLangFontLink_ReleaseFont_Proxy(
    IMLangFontLink* This,
    HFONT hFont);
void __RPC_STUB IMLangFontLink_ReleaseFont_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMLangFontLink_ResetFontMapping_Proxy(
    IMLangFontLink* This);
void __RPC_STUB IMLangFontLink_ResetFontMapping_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IMLangFontLink_INTERFACE_DEFINED__ */

#ifndef __IEnumScript_FWD_DEFINED__
#define __IEnumScript_FWD_DEFINED__
typedef struct IEnumScript IEnumScript;
#endif

#define MAX_SCRIPT_NAME (48)

#define MAX_MIMEFACE_NAME (32)

typedef BYTE SCRIPT_ID;

typedef __int64 SCRIPT_IDS;

typedef enum tagSCRIPTCONTF {
    sidDefault = 0,
    sidMerge = sidDefault + 1,
    sidAsciiSym = sidMerge + 1,
    sidAsciiLatin = sidAsciiSym + 1,
    sidLatin = sidAsciiLatin + 1,
    sidGreek = sidLatin + 1,
    sidCyrillic = sidGreek + 1,
    sidArmenian = sidCyrillic + 1,
    sidHebrew = sidArmenian + 1,
    sidArabic = sidHebrew + 1,
    sidDevanagari = sidArabic + 1,
    sidBengali = sidDevanagari + 1,
    sidGurmukhi = sidBengali + 1,
    sidGujarati = sidGurmukhi + 1,
    sidOriya = sidGujarati + 1,
    sidTamil = sidOriya + 1,
    sidTelugu = sidTamil + 1,
    sidKannada = sidTelugu + 1,
    sidMalayalam = sidKannada + 1,
    sidThai = sidMalayalam + 1,
    sidLao = sidThai + 1,
    sidTibetan = sidLao + 1,
    sidGeorgian = sidTibetan + 1,
    sidHangul = sidGeorgian + 1,
    sidKana = sidHangul + 1,
    sidBopomofo = sidKana + 1,
    sidHan = sidBopomofo + 1,
    sidEthiopic = sidHan + 1,
    sidCanSyllabic = sidEthiopic + 1,
    sidCherokee = sidCanSyllabic + 1,
    sidYi = sidCherokee + 1,
    sidBraille = sidYi + 1,
    sidRunic = sidBraille + 1,
    sidOgham = sidRunic + 1,
    sidSinhala = sidOgham + 1,
    sidSyriac = sidSinhala + 1,
    sidBurmese = sidSyriac + 1,
    sidKhmer = sidBurmese + 1,
    sidThaana = sidKhmer + 1,
    sidMongolian = sidThaana + 1,
    sidUserDefined = sidMongolian + 1,
    sidLim = sidUserDefined + 1,
    sidFEFirst = sidHangul,
    sidFELast = sidHan
} SCRIPTCONTF;

typedef enum tagSCRIPTFONTCONTF {
    SCRIPTCONTF_FIXED_FONT = 0x1,
    SCRIPTCONTF_PROPORTIONAL_FONT = 0x2,
    SCRIPTCONTF_SCRIPT_USER = 0x10000,
    SCRIPTCONTF_SCRIPT_HIDE = 0x20000,
    SCRIPTCONTF_SCRIPT_SYSTEM = 0x40000
} SCRIPTFONTCONTF;

typedef struct tagSCRIPFONTINFO {
    SCRIPT_IDS scripts;
    WCHAR wszFont[32];
} SCRIPTFONTINFO, *PSCRIPTFONTINFO;

typedef struct tagSCRIPTINFO {
    SCRIPT_ID ScriptId;
    UINT uiCodePage;
    WCHAR wszDescription[48];
    WCHAR wszFixedWidthFont[32];
    WCHAR wszProportionalFont[32];
} SCRIPTINFO, *PSCRIPTINFO;

/*****************************************************************************
 * IEnumScript interface
 */
#ifndef __IEnumScript_INTERFACE_DEFINED__
#define __IEnumScript_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
struct IEnumScript : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumScript** ppEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        PSCRIPTINFO rgelt,
        ULONG* pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

};
#else
typedef struct IEnumScriptVtbl IEnumScriptVtbl;
struct IEnumScript {
    const IEnumScriptVtbl* lpVtbl;
};
struct IEnumScriptVtbl {
    ICOM_MSVTABLE_COMPAT_FIELDS

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

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

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

    /*** IEnumScript methods ***/
    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumScript* This,
        IEnumScript** ppEnum);

    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumScript* This,
        ULONG celt,
        PSCRIPTINFO rgelt,
        ULONG* pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumScript* This);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumScript* This,
        ULONG celt);

};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IEnumScript_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IEnumScript_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IEnumScript_Release(p) (p)->lpVtbl->Release(p)
/*** IEnumScript methods ***/
#define IEnumScript_Clone(p,a) (p)->lpVtbl->Clone(p,a)
#define IEnumScript_Next(p,a,b,c) (p)->lpVtbl->Next(p,a,b,c)
#define IEnumScript_Reset(p) (p)->lpVtbl->Reset(p)
#define IEnumScript_Skip(p,a) (p)->lpVtbl->Skip(p,a)
#endif

#endif

#define IEnumScript_METHODS \
    ICOM_MSVTABLE_COMPAT_FIELDS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IEnumScript methods ***/ \
    STDMETHOD_(HRESULT,Clone)(THIS_ IEnumScript** ppEnum) PURE; \
    STDMETHOD_(HRESULT,Next)(THIS_ ULONG celt, PSCRIPTINFO rgelt, ULONG* pceltFetched) PURE; \
    STDMETHOD_(HRESULT,Reset)(THIS) PURE; \
    STDMETHOD_(HRESULT,Skip)(THIS_ ULONG celt) PURE;

HRESULT CALLBACK IEnumScript_Clone_Proxy(
    IEnumScript* This,
    IEnumScript** ppEnum);
void __RPC_STUB IEnumScript_Clone_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumScript_Next_Proxy(
    IEnumScript* This,
    ULONG celt,
    PSCRIPTINFO rgelt,
    ULONG* pceltFetched);
void __RPC_STUB IEnumScript_Next_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumScript_Reset_Proxy(
    IEnumScript* This);
void __RPC_STUB IEnumScript_Reset_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumScript_Skip_Proxy(
    IEnumScript* This,
    ULONG celt);
void __RPC_STUB IEnumScript_Skip_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IEnumScript_INTERFACE_DEFINED__ */

#ifndef __IEnumCodePage_FWD_DEFINED__
#define __IEnumCodePage_FWD_DEFINED__
typedef struct IEnumCodePage IEnumCodePage;
#endif

#define MAX_MIMECP_NAME (64)

#define MAX_MIMECSET_NAME (50)

typedef enum tagMIMECONTF {
    MIMECONTF_MAILNEWS = 0x1,
    MIMECONTF_BROWSER = 0x2,
    MIMECONTF_MINIMAL = 0x4,
    MIMECONTF_IMPORT = 0x8,
    MIMECONTF_SAVABLE_MAILNEWS = 0x100,
    MIMECONTF_SAVABLE_BROWSER = 0x200,
    MIMECONTF_EXPORT = 0x400,
    MIMECONTF_PRIVCONVERTER = 0x10000,
    MIMECONTF_VALID = 0x20000,
    MIMECONTF_VALID_NLS = 0x40000,
    MIMECONTF_MIME_IE4 = 0x10000000,
    MIMECONTF_MIME_LATEST = 0x20000000,
    MIMECONTF_MIME_REGISTRY = 0x40000000
} MIMECONTF;

typedef struct tagMIMECPINFO {
    DWORD dwFlags;
    UINT uiCodePage;
    UINT uiFamilyCodePage;
    WCHAR wszDescription[64];
    WCHAR wszWebCharset[50];
    WCHAR wszHeaderCharset[50];
    WCHAR wszBodyCharset[50];
    WCHAR wszFixedWidthFont[32];
    WCHAR wszProportionalFont[32];
    BYTE bGDICharset;
} MIMECPINFO, *PMIMECPINFO;

typedef struct tagMIMECSETINFO {
    UINT uiCodePage;
    UINT uiInternetEncoding;
    WCHAR wszCharset[50];
} MIMECSETINFO, *PMIMECSETINFO;

/*****************************************************************************
 * IEnumCodePage interface
 */
#ifndef __IEnumCodePage_INTERFACE_DEFINED__
#define __IEnumCodePage_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
struct IEnumCodePage : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumCodePage** ppEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        PMIMECPINFO rgelt,
        ULONG* pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

};
#else
typedef struct IEnumCodePageVtbl IEnumCodePageVtbl;
struct IEnumCodePage {
    const IEnumCodePageVtbl* lpVtbl;
};
struct IEnumCodePageVtbl {
    ICOM_MSVTABLE_COMPAT_FIELDS

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

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

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

    /*** IEnumCodePage methods ***/
    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumCodePage* This,
        IEnumCodePage** ppEnum);

    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumCodePage* This,
        ULONG celt,
        PMIMECPINFO rgelt,
        ULONG* pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumCodePage* This);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumCodePage* This,
        ULONG celt);

};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IEnumCodePage_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IEnumCodePage_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IEnumCodePage_Release(p) (p)->lpVtbl->Release(p)
/*** IEnumCodePage methods ***/
#define IEnumCodePage_Clone(p,a) (p)->lpVtbl->Clone(p,a)
#define IEnumCodePage_Next(p,a,b,c) (p)->lpVtbl->Next(p,a,b,c)
#define IEnumCodePage_Reset(p) (p)->lpVtbl->Reset(p)
#define IEnumCodePage_Skip(p,a) (p)->lpVtbl->Skip(p,a)
#endif

#endif

#define IEnumCodePage_METHODS \
    ICOM_MSVTABLE_COMPAT_FIELDS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IEnumCodePage methods ***/ \
    STDMETHOD_(HRESULT,Clone)(THIS_ IEnumCodePage** ppEnum) PURE; \
    STDMETHOD_(HRESULT,Next)(THIS_ ULONG celt, PMIMECPINFO rgelt, ULONG* pceltFetched) PURE; \
    STDMETHOD_(HRESULT,Reset)(THIS) PURE; \
    STDMETHOD_(HRESULT,Skip)(THIS_ ULONG celt) PURE;

HRESULT CALLBACK IEnumCodePage_Clone_Proxy(
    IEnumCodePage* This,
    IEnumCodePage** ppEnum);
void __RPC_STUB IEnumCodePage_Clone_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumCodePage_Next_Proxy(
    IEnumCodePage* This,
    ULONG celt,
    PMIMECPINFO rgelt,
    ULONG* pceltFetched);
void __RPC_STUB IEnumCodePage_Next_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumCodePage_Reset_Proxy(
    IEnumCodePage* This);
void __RPC_STUB IEnumCodePage_Reset_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumCodePage_Skip_Proxy(
    IEnumCodePage* This,
    ULONG celt);
void __RPC_STUB IEnumCodePage_Skip_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IEnumCodePage_INTERFACE_DEFINED__ */

#ifndef __IMLangConvertCharset_FWD_DEFINED__
#define __IMLangConvertCharset_FWD_DEFINED__
typedef struct IMLangConvertCharset IMLangConvertCharset;
#endif

/*****************************************************************************
 * IMLangConvertCharset interface
 */
#ifndef __IMLangConvertCharset_INTERFACE_DEFINED__
#define __IMLangConvertCharset_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
struct IMLangConvertCharset : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        UINT uiSrcCodePage,
        UINT uiDstCodePage,
        DWORD dwProperty) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSourceCodePage(
        UINT* puiSrcCodePage) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDestinationCodePage(
        UINT* puiDstCodePage) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProperty(
        DWORD* pdwProperty) = 0;

    virtual HRESULT STDMETHODCALLTYPE DoConversion(
        BYTE* pSrcStr,
        UINT* pcSrcSize,
        BYTE* pDstStr,
        UINT* pcDstSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE DoConversionToUnicode(
        CHAR* pSrcStr,
        UINT* pcSrcSize,
        WCHAR* pDstStr,
        UINT* pcDstSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE DoConversionFromUnicode(
        WCHAR* pSrcStr,
        UINT* pcSrcSize,
        CHAR* pDstStr,
        UINT* pcDstSize) = 0;

};
#else
typedef struct IMLangConvertCharsetVtbl IMLangConvertCharsetVtbl;
struct IMLangConvertCharset {
    const IMLangConvertCharsetVtbl* lpVtbl;
};
struct IMLangConvertCharsetVtbl {
    ICOM_MSVTABLE_COMPAT_FIELDS

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

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

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

    /*** IMLangConvertCharset methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IMLangConvertCharset* This,
        UINT uiSrcCodePage,
        UINT uiDstCodePage,
        DWORD dwProperty);

    HRESULT (STDMETHODCALLTYPE *GetSourceCodePage)(
        IMLangConvertCharset* This,
        UINT* puiSrcCodePage);

    HRESULT (STDMETHODCALLTYPE *GetDestinationCodePage)(
        IMLangConvertCharset* This,
        UINT* puiDstCodePage);

    HRESULT (STDMETHODCALLTYPE *GetProperty)(
        IMLangConvertCharset* This,
        DWORD* pdwProperty);

    HRESULT (STDMETHODCALLTYPE *DoConversion)(
        IMLangConvertCharset* This,
        BYTE* pSrcStr,
        UINT* pcSrcSize,
        BYTE* pDstStr,
        UINT* pcDstSize);

    HRESULT (STDMETHODCALLTYPE *DoConversionToUnicode)(
        IMLangConvertCharset* This,
        CHAR* pSrcStr,
        UINT* pcSrcSize,
        WCHAR* pDstStr,
        UINT* pcDstSize);

    HRESULT (STDMETHODCALLTYPE *DoConversionFromUnicode)(
        IMLangConvertCharset* This,
        WCHAR* pSrcStr,
        UINT* pcSrcSize,
        CHAR* pDstStr,
        UINT* pcDstSize);

};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IMLangConvertCharset_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IMLangConvertCharset_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IMLangConvertCharset_Release(p) (p)->lpVtbl->Release(p)
/*** IMLangConvertCharset methods ***/
#define IMLangConvertCharset_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c)
#define IMLangConvertCharset_GetSourceCodePage(p,a) (p)->lpVtbl->GetSourceCodePage(p,a)
#define IMLangConvertCharset_GetDestinationCodePage(p,a) (p)->lpVtbl->GetDestinationCodePage(p,a)
#define IMLangConvertCharset_GetProperty(p,a) (p)->lpVtbl->GetProperty(p,a)
#define IMLangConvertCharset_DoConversion(p,a,b,c,d) (p)->lpVtbl->DoConversion(p,a,b,c,d)
#define IMLangConvertCharset_DoConversionToUnicode(p,a,b,c,d) (p)->lpVtbl->DoConversionToUnicode(p,a,b,c,d)
#define IMLangConvertCharset_DoConversionFromUnicode(p,a,b,c,d) (p)->lpVtbl->DoConversionFromUnicode(p,a,b,c,d)
#endif

#endif

#define IMLangConvertCharset_METHODS \
    ICOM_MSVTABLE_COMPAT_FIELDS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IMLangConvertCharset methods ***/ \
    STDMETHOD_(HRESULT,Initialize)(THIS_ UINT uiSrcCodePage, UINT uiDstCodePage, DWORD dwProperty) PURE; \
    STDMETHOD_(HRESULT,GetSourceCodePage)(THIS_ UINT* puiSrcCodePage) PURE; \
    STDMETHOD_(HRESULT,GetDestinationCodePage)(THIS_ UINT* puiDstCodePage) PURE; \
    STDMETHOD_(HRESULT,GetProperty)(THIS_ DWORD* pdwProperty) PURE; \
    STDMETHOD_(HRESULT,DoConversion)(THIS_ BYTE* pSrcStr, UINT* pcSrcSize, BYTE* pDstStr, UINT* pcDstSize) PURE; \
    STDMETHOD_(HRESULT,DoConversionToUnicode)(THIS_ CHAR* pSrcStr, UINT* pcSrcSize, WCHAR* pDstStr, UINT* pcDstSize) PURE; \
    STDMETHOD_(HRESULT,DoConversionFromUnicode)(THIS_ WCHAR* pSrcStr, UINT* pcSrcSize, CHAR* pDstStr, UINT* pcDstSize) PURE;

HRESULT CALLBACK IMLangConvertCharset_Initialize_Proxy(
    IMLangConvertCharset* This,
    UINT uiSrcCodePage,
    UINT uiDstCodePage,
    DWORD dwProperty);
void __RPC_STUB IMLangConvertCharset_Initialize_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMLangConvertCharset_GetSourceCodePage_Proxy(
    IMLangConvertCharset* This,
    UINT* puiSrcCodePage);
void __RPC_STUB IMLangConvertCharset_GetSourceCodePage_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMLangConvertCharset_GetDestinationCodePage_Proxy(
    IMLangConvertCharset* This,
    UINT* puiDstCodePage);
void __RPC_STUB IMLangConvertCharset_GetDestinationCodePage_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMLangConvertCharset_GetProperty_Proxy(
    IMLangConvertCharset* This,
    DWORD* pdwProperty);
void __RPC_STUB IMLangConvertCharset_GetProperty_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMLangConvertCharset_DoConversion_Proxy(
    IMLangConvertCharset* This,
    BYTE* pSrcStr,
    UINT* pcSrcSize,
    BYTE* pDstStr,
    UINT* pcDstSize);
void __RPC_STUB IMLangConvertCharset_DoConversion_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMLangConvertCharset_DoConversionToUnicode_Proxy(
    IMLangConvertCharset* This,
    CHAR* pSrcStr,
    UINT* pcSrcSize,
    WCHAR* pDstStr,
    UINT* pcDstSize);
void __RPC_STUB IMLangConvertCharset_DoConversionToUnicode_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMLangConvertCharset_DoConversionFromUnicode_Proxy(
    IMLangConvertCharset* This,
    WCHAR* pSrcStr,
    UINT* pcSrcSize,
    CHAR* pDstStr,
    UINT* pcDstSize);
void __RPC_STUB IMLangConvertCharset_DoConversionFromUnicode_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IMLangConvertCharset_INTERFACE_DEFINED__ */

#ifndef __IEnumRfc1766_FWD_DEFINED__
#define __IEnumRfc1766_FWD_DEFINED__
typedef struct IEnumRfc1766 IEnumRfc1766;
#endif

typedef struct tagRFC1766INFO {
    LCID lcid;
    WCHAR wszRfc1766[1];
    WCHAR wszLocaleName[1];
} RFC1766INFO, *PRFC1766INFO;

/*****************************************************************************
 * IEnumRfc1766 interface
 */
#ifndef __IEnumRfc1766_INTERFACE_DEFINED__
#define __IEnumRfc1766_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
struct IEnumRfc1766 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumRfc1766** ppEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        PRFC1766INFO rgelt,
        ULONG* pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

};
#else
typedef struct IEnumRfc1766Vtbl IEnumRfc1766Vtbl;
struct IEnumRfc1766 {
    const IEnumRfc1766Vtbl* lpVtbl;
};
struct IEnumRfc1766Vtbl {
    ICOM_MSVTABLE_COMPAT_FIELDS

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

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

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

    /*** IEnumRfc1766 methods ***/
    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumRfc1766* This,
        IEnumRfc1766** ppEnum);

    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumRfc1766* This,
        ULONG celt,
        PRFC1766INFO rgelt,
        ULONG* pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumRfc1766* This);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumRfc1766* This,
        ULONG celt);

};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IEnumRfc1766_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IEnumRfc1766_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IEnumRfc1766_Release(p) (p)->lpVtbl->Release(p)
/*** IEnumRfc1766 methods ***/
#define IEnumRfc1766_Clone(p,a) (p)->lpVtbl->Clone(p,a)
#define IEnumRfc1766_Next(p,a,b,c) (p)->lpVtbl->Next(p,a,b,c)
#define IEnumRfc1766_Reset(p) (p)->lpVtbl->Reset(p)
#define IEnumRfc1766_Skip(p,a) (p)->lpVtbl->Skip(p,a)
#endif

#endif

#define IEnumRfc1766_METHODS \
    ICOM_MSVTABLE_COMPAT_FIELDS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IEnumRfc1766 methods ***/ \
    STDMETHOD_(HRESULT,Clone)(THIS_ IEnumRfc1766** ppEnum) PURE; \
    STDMETHOD_(HRESULT,Next)(THIS_ ULONG celt, PRFC1766INFO rgelt, ULONG* pceltFetched) PURE; \
    STDMETHOD_(HRESULT,Reset)(THIS) PURE; \
    STDMETHOD_(HRESULT,Skip)(THIS_ ULONG celt) PURE;

HRESULT CALLBACK IEnumRfc1766_Clone_Proxy(
    IEnumRfc1766* This,
    IEnumRfc1766** ppEnum);
void __RPC_STUB IEnumRfc1766_Clone_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumRfc1766_Next_Proxy(
    IEnumRfc1766* This,
    ULONG celt,
    PRFC1766INFO rgelt,
    ULONG* pceltFetched);
void __RPC_STUB IEnumRfc1766_Next_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumRfc1766_Reset_Proxy(
    IEnumRfc1766* This);
void __RPC_STUB IEnumRfc1766_Reset_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IEnumRfc1766_Skip_Proxy(
    IEnumRfc1766* This,
    ULONG celt);
void __RPC_STUB IEnumRfc1766_Skip_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IEnumRfc1766_INTERFACE_DEFINED__ */

#ifndef __IMultiLanguage_FWD_DEFINED__
#define __IMultiLanguage_FWD_DEFINED__
typedef struct IMultiLanguage IMultiLanguage;
#endif

/*****************************************************************************
 * IMultiLanguage interface
 */
#ifndef __IMultiLanguage_INTERFACE_DEFINED__
#define __IMultiLanguage_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
struct IMultiLanguage : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetNumberOfCodePageInfo(
        UINT* pcCodePage) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCodePageInfo(
        UINT uiCodePage,
        PMIMECPINFO pCodePageInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFamilyCodePage(
        UINT uiCodePage,
        UINT* puiFamilyCodePage) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumCodePages(
        DWORD grfFlags,
        IEnumCodePage** ppEnumCodePage) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCharsetInfo(
        BSTR Charset,
        PMIMECSETINFO pCharsetInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsConvertible(
        DWORD dwSrcEncoding,
        DWORD dwDstEncoding) = 0;

    virtual HRESULT STDMETHODCALLTYPE ConvertString(
        DWORD* pdwMode,
        DWORD dwSrcEncoding,
        DWORD dwDstEncoding,
        BYTE* pSrcStr,
        UINT* pcSrcSize,
        BYTE* pDstStr,
        UINT* pcDstSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE ConvertStringToUnicode(
        DWORD* pdwMode,
        DWORD dwEncoding,
        CHAR* pSrcStr,
        UINT* pcSrcSize,
        WCHAR* pDstStr,
        UINT* pcDstSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE ConvertStringFromUnicode(
        DWORD* pdwMode,
        DWORD dwEncoding,
        WCHAR* pSrcStr,
        UINT* pcSrcSize,
        CHAR* pDstStr,
        UINT* pcDstSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE ConvertStringReset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRfc1766FromLcid(
        LCID Locale,
        BSTR* pbstrRfc1766) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLcidFromRfc1766(
        LCID* pLocale,
        BSTR bstrRfc1766) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumRfc1766(
        IEnumRfc1766** ppEnumRfc1766) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRfc1766Info(
        LCID Locale,
        PRFC1766INFO pRfc1766Info) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateConvertCharset(
        UINT uiSrcCodePage,
        UINT uiDstCodePage,
        DWORD dwProperty,
        IMLangConvertCharset** ppMLangConvertCharset) = 0;

};
#else
typedef struct IMultiLanguageVtbl IMultiLanguageVtbl;
struct IMultiLanguage {
    const IMultiLanguageVtbl* lpVtbl;
};
struct IMultiLanguageVtbl {
    ICOM_MSVTABLE_COMPAT_FIELDS

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

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

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

    /*** IMultiLanguage methods ***/
    HRESULT (STDMETHODCALLTYPE *GetNumberOfCodePageInfo)(
        IMultiLanguage* This,
        UINT* pcCodePage);

    HRESULT (STDMETHODCALLTYPE *GetCodePageInfo)(
        IMultiLanguage* This,
        UINT uiCodePage,
        PMIMECPINFO pCodePageInfo);

    HRESULT (STDMETHODCALLTYPE *GetFamilyCodePage)(
        IMultiLanguage* This,
        UINT uiCodePage,
        UINT* puiFamilyCodePage);

    HRESULT (STDMETHODCALLTYPE *EnumCodePages)(
        IMultiLanguage* This,
        DWORD grfFlags,
        IEnumCodePage** ppEnumCodePage);

    HRESULT (STDMETHODCALLTYPE *GetCharsetInfo)(
        IMultiLanguage* This,
        BSTR Charset,
        PMIMECSETINFO pCharsetInfo);

    HRESULT (STDMETHODCALLTYPE *IsConvertible)(
        IMultiLanguage* This,
        DWORD dwSrcEncoding,
        DWORD dwDstEncoding);

    HRESULT (STDMETHODCALLTYPE *ConvertString)(
        IMultiLanguage* This,
        DWORD* pdwMode,
        DWORD dwSrcEncoding,
        DWORD dwDstEncoding,
        BYTE* pSrcStr,
        UINT* pcSrcSize,
        BYTE* pDstStr,
        UINT* pcDstSize);

    HRESULT (STDMETHODCALLTYPE *ConvertStringToUnicode)(
        IMultiLanguage* This,
        DWORD* pdwMode,
        DWORD dwEncoding,
        CHAR* pSrcStr,
        UINT* pcSrcSize,
        WCHAR* pDstStr,
        UINT* pcDstSize);

    HRESULT (STDMETHODCALLTYPE *ConvertStringFromUnicode)(
        IMultiLanguage* This,
        DWORD* pdwMode,
        DWORD dwEncoding,
        WCHAR* pSrcStr,
        UINT* pcSrcSize,
        CHAR* pDstStr,
        UINT* pcDstSize);

    HRESULT (STDMETHODCALLTYPE *ConvertStringReset)(
        IMultiLanguage* This);

    HRESULT (STDMETHODCALLTYPE *GetRfc1766FromLcid)(
        IMultiLanguage* This,
        LCID Locale,
        BSTR* pbstrRfc1766);

    HRESULT (STDMETHODCALLTYPE *GetLcidFromRfc1766)(
        IMultiLanguage* This,
        LCID* pLocale,
        BSTR bstrRfc1766);

    HRESULT (STDMETHODCALLTYPE *EnumRfc1766)(
        IMultiLanguage* This,
        IEnumRfc1766** ppEnumRfc1766);

    HRESULT (STDMETHODCALLTYPE *GetRfc1766Info)(
        IMultiLanguage* This,
        LCID Locale,
        PRFC1766INFO pRfc1766Info);

    HRESULT (STDMETHODCALLTYPE *CreateConvertCharset)(
        IMultiLanguage* This,
        UINT uiSrcCodePage,
        UINT uiDstCodePage,
        DWORD dwProperty,
        IMLangConvertCharset** ppMLangConvertCharset);

};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IMultiLanguage_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IMultiLanguage_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IMultiLanguage_Release(p) (p)->lpVtbl->Release(p)
/*** IMultiLanguage methods ***/
#define IMultiLanguage_GetNumberOfCodePageInfo(p,a) (p)->lpVtbl->GetNumberOfCodePageInfo(p,a)
#define IMultiLanguage_GetCodePageInfo(p,a,b) (p)->lpVtbl->GetCodePageInfo(p,a,b)
#define IMultiLanguage_GetFamilyCodePage(p,a,b) (p)->lpVtbl->GetFamilyCodePage(p,a,b)
#define IMultiLanguage_EnumCodePages(p,a,b) (p)->lpVtbl->EnumCodePages(p,a,b)
#define IMultiLanguage_GetCharsetInfo(p,a,b) (p)->lpVtbl->GetCharsetInfo(p,a,b)
#define IMultiLanguage_IsConvertible(p,a,b) (p)->lpVtbl->IsConvertible(p,a,b)
#define IMultiLanguage_ConvertString(p,a,b,c,d,e,f,g) (p)->lpVtbl->ConvertString(p,a,b,c,d,e,f,g)
#define IMultiLanguage_ConvertStringToUnicode(p,a,b,c,d,e,f) (p)->lpVtbl->ConvertStringToUnicode(p,a,b,c,d,e,f)
#define IMultiLanguage_ConvertStringFromUnicode(p,a,b,c,d,e,f) (p)->lpVtbl->ConvertStringFromUnicode(p,a,b,c,d,e,f)
#define IMultiLanguage_ConvertStringReset(p) (p)->lpVtbl->ConvertStringReset(p)
#define IMultiLanguage_GetRfc1766FromLcid(p,a,b) (p)->lpVtbl->GetRfc1766FromLcid(p,a,b)
#define IMultiLanguage_GetLcidFromRfc1766(p,a,b) (p)->lpVtbl->GetLcidFromRfc1766(p,a,b)
#define IMultiLanguage_EnumRfc1766(p,a) (p)->lpVtbl->EnumRfc1766(p,a)
#define IMultiLanguage_GetRfc1766Info(p,a,b) (p)->lpVtbl->GetRfc1766Info(p,a,b)
#define IMultiLanguage_CreateConvertCharset(p,a,b,c,d) (p)->lpVtbl->CreateConvertCharset(p,a,b,c,d)
#endif

#endif

#define IMultiLanguage_METHODS \
    ICOM_MSVTABLE_COMPAT_FIELDS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IMultiLanguage methods ***/ \
    STDMETHOD_(HRESULT,GetNumberOfCodePageInfo)(THIS_ UINT* pcCodePage) PURE; \
    STDMETHOD_(HRESULT,GetCodePageInfo)(THIS_ UINT uiCodePage, PMIMECPINFO pCodePageInfo) PURE; \
    STDMETHOD_(HRESULT,GetFamilyCodePage)(THIS_ UINT uiCodePage, UINT* puiFamilyCodePage) PURE; \
    STDMETHOD_(HRESULT,EnumCodePages)(THIS_ DWORD grfFlags, IEnumCodePage** ppEnumCodePage) PURE; \
    STDMETHOD_(HRESULT,GetCharsetInfo)(THIS_ BSTR Charset, PMIMECSETINFO pCharsetInfo) PURE; \
    STDMETHOD_(HRESULT,IsConvertible)(THIS_ DWORD dwSrcEncoding, DWORD dwDstEncoding) PURE; \
    STDMETHOD_(HRESULT,ConvertString)(THIS_ DWORD* pdwMode, DWORD dwSrcEncoding, DWORD dwDstEncoding, BYTE* pSrcStr, UINT* pcSrcSize, BYTE* pDstStr, UINT* pcDstSize) PURE; \
    STDMETHOD_(HRESULT,ConvertStringToUnicode)(THIS_ DWORD* pdwMode, DWORD dwEncoding, CHAR* pSrcStr, UINT* pcSrcSize, WCHAR* pDstStr, UINT* pcDstSize) PURE; \
    STDMETHOD_(HRESULT,ConvertStringFromUnicode)(THIS_ DWORD* pdwMode, DWORD dwEncoding, WCHAR* pSrcStr, UINT* pcSrcSize, CHAR* pDstStr, UINT* pcDstSize) PURE; \
    STDMETHOD_(HRESULT,ConvertStringReset)(THIS) PURE; \
    STDMETHOD_(HRESULT,GetRfc1766FromLcid)(THIS_ LCID Locale, BSTR* pbstrRfc1766) PURE; \
    STDMETHOD_(HRESULT,GetLcidFromRfc1766)(THIS_ LCID* pLocale, BSTR bstrRfc1766) PURE; \
    STDMETHOD_(HRESULT,EnumRfc1766)(THIS_ IEnumRfc1766** ppEnumRfc1766) PURE; \
    STDMETHOD_(HRESULT,GetRfc1766Info)(THIS_ LCID Locale, PRFC1766INFO pRfc1766Info) PURE; \
    STDMETHOD_(HRESULT,CreateConvertCharset)(THIS_ UINT uiSrcCodePage, UINT uiDstCodePage, DWORD dwProperty, IMLangConvertCharset** ppMLangConvertCharset) PURE;

HRESULT CALLBACK IMultiLanguage_GetNumberOfCodePageInfo_Proxy(
    IMultiLanguage* This,
    UINT* pcCodePage);
void __RPC_STUB IMultiLanguage_GetNumberOfCodePageInfo_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage_GetCodePageInfo_Proxy(
    IMultiLanguage* This,
    UINT uiCodePage,
    PMIMECPINFO pCodePageInfo);
void __RPC_STUB IMultiLanguage_GetCodePageInfo_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage_GetFamilyCodePage_Proxy(
    IMultiLanguage* This,
    UINT uiCodePage,
    UINT* puiFamilyCodePage);
void __RPC_STUB IMultiLanguage_GetFamilyCodePage_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage_EnumCodePages_Proxy(
    IMultiLanguage* This,
    DWORD grfFlags,
    IEnumCodePage** ppEnumCodePage);
void __RPC_STUB IMultiLanguage_EnumCodePages_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage_GetCharsetInfo_Proxy(
    IMultiLanguage* This,
    BSTR Charset,
    PMIMECSETINFO pCharsetInfo);
void __RPC_STUB IMultiLanguage_GetCharsetInfo_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage_IsConvertible_Proxy(
    IMultiLanguage* This,
    DWORD dwSrcEncoding,
    DWORD dwDstEncoding);
void __RPC_STUB IMultiLanguage_IsConvertible_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage_ConvertString_Proxy(
    IMultiLanguage* This,
    DWORD* pdwMode,
    DWORD dwSrcEncoding,
    DWORD dwDstEncoding,
    BYTE* pSrcStr,
    UINT* pcSrcSize,
    BYTE* pDstStr,
    UINT* pcDstSize);
void __RPC_STUB IMultiLanguage_ConvertString_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage_ConvertStringToUnicode_Proxy(
    IMultiLanguage* This,
    DWORD* pdwMode,
    DWORD dwEncoding,
    CHAR* pSrcStr,
    UINT* pcSrcSize,
    WCHAR* pDstStr,
    UINT* pcDstSize);
void __RPC_STUB IMultiLanguage_ConvertStringToUnicode_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage_ConvertStringFromUnicode_Proxy(
    IMultiLanguage* This,
    DWORD* pdwMode,
    DWORD dwEncoding,
    WCHAR* pSrcStr,
    UINT* pcSrcSize,
    CHAR* pDstStr,
    UINT* pcDstSize);
void __RPC_STUB IMultiLanguage_ConvertStringFromUnicode_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage_ConvertStringReset_Proxy(
    IMultiLanguage* This);
void __RPC_STUB IMultiLanguage_ConvertStringReset_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage_GetRfc1766FromLcid_Proxy(
    IMultiLanguage* This,
    LCID Locale,
    BSTR* pbstrRfc1766);
void __RPC_STUB IMultiLanguage_GetRfc1766FromLcid_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage_GetLcidFromRfc1766_Proxy(
    IMultiLanguage* This,
    LCID* pLocale,
    BSTR bstrRfc1766);
void __RPC_STUB IMultiLanguage_GetLcidFromRfc1766_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage_EnumRfc1766_Proxy(
    IMultiLanguage* This,
    IEnumRfc1766** ppEnumRfc1766);
void __RPC_STUB IMultiLanguage_EnumRfc1766_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage_GetRfc1766Info_Proxy(
    IMultiLanguage* This,
    LCID Locale,
    PRFC1766INFO pRfc1766Info);
void __RPC_STUB IMultiLanguage_GetRfc1766Info_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage_CreateConvertCharset_Proxy(
    IMultiLanguage* This,
    UINT uiSrcCodePage,
    UINT uiDstCodePage,
    DWORD dwProperty,
    IMLangConvertCharset** ppMLangConvertCharset);
void __RPC_STUB IMultiLanguage_CreateConvertCharset_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IMultiLanguage_INTERFACE_DEFINED__ */

#ifndef __IMultiLanguage2_FWD_DEFINED__
#define __IMultiLanguage2_FWD_DEFINED__
typedef struct IMultiLanguage2 IMultiLanguage2;
#endif

typedef struct tagDetectEncodingInfo {
    UINT nLangID;
    UINT nCodePage;
    INT nDocPercent;
    INT nConfidence;
} DetectEncodingInfo, *pDetectEncodingInfo;

/*****************************************************************************
 * IMultiLanguage2 interface
 */
#ifndef __IMultiLanguage2_INTERFACE_DEFINED__
#define __IMultiLanguage2_INTERFACE_DEFINED__

#if defined(__cplusplus) && !defined(CINTERFACE)
struct IMultiLanguage2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetNumberOfCodePageInfo(
        UINT* pcCodePage) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCodePageInfo(
        UINT uiCodePage,
        LANGID LangId,
        PMIMECPINFO pCodePageInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFamilyCodePage(
        UINT uiCodePage,
        UINT* puiFamilyCodePage) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumCodePages(
        DWORD grfFlags,
        LANGID LangId,
        IEnumCodePage** ppEnumCodePage) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCharsetInfo(
        BSTR Charset,
        PMIMECSETINFO pCharsetInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsConvertible(
        DWORD dwSrcEncoding,
        DWORD dwDstEncoding) = 0;

    virtual HRESULT STDMETHODCALLTYPE ConvertString(
        DWORD* pdwMode,
        DWORD dwSrcEncoding,
        DWORD dwDstEncoding,
        BYTE* pSrcStr,
        UINT* pcSrcSize,
        BYTE* pDstStr,
        UINT* pcDstSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE ConvertStringToUnicode(
        DWORD* pdwMode,
        DWORD dwEncoding,
        CHAR* pSrcStr,
        UINT* pcSrcSize,
        WCHAR* pDstStr,
        UINT* pcDstSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE ConvertStringFromUnicode(
        DWORD* pdwMode,
        DWORD dwEncoding,
        WCHAR* pSrcStr,
        UINT* pcSrcSize,
        CHAR* pDstStr,
        UINT* pcDstSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE ConvertStringReset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRfc1766FromLcid(
        LCID Locale,
        BSTR* pbstrRfc1766) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLcidFromRfc1766(
        LCID* pLocale,
        BSTR bstrRfc1766) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumRfc1766(
        LANGID LangId,
        IEnumRfc1766** ppEnumRfc1766) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRfc1766Info(
        LCID Locale,
        LANGID LangId,
        PRFC1766INFO pRfc1766Info) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateConvertCharset(
        UINT uiSrcCodePage,
        UINT uiDstCodePage,
        DWORD dwProperty,
        IMLangConvertCharset** ppMLangConvertCharset) = 0;

    virtual HRESULT STDMETHODCALLTYPE ConvertStringInIStream(
        DWORD* pdwMode,
        DWORD dwFlag,
        WCHAR* lpFallBack,
        DWORD dwSrcEncoding,
        DWORD dwDstEncoding,
        IStream* pstmIn,
        IStream* pstmOut) = 0;

    virtual HRESULT STDMETHODCALLTYPE ConvertStringToUnicodeEx(
        DWORD* pdwMode,
        DWORD dwEncoding,
        CHAR* pSrcStr,
        UINT* pcSrcSize,
        WCHAR* pDstStr,
        UINT* pcDstSize,
        DWORD dwFlag,
        WCHAR* lpFallBack) = 0;

    virtual HRESULT STDMETHODCALLTYPE ConvertStringFromUnicodeEx(
        DWORD* pdwMode,
        DWORD dwEncoding,
        WCHAR* pSrcStr,
        UINT* pcSrcSize,
        CHAR* pDstStr,
        UINT* pcDstSize,
        DWORD dwFlag,
        WCHAR* lpFallBack) = 0;

    virtual HRESULT STDMETHODCALLTYPE DetectCodepageInIStream(
        DWORD dwFlag,
        DWORD dwPrefWinCodePage,
        IStream* pstmIn,
        DetectEncodingInfo* lpEncoding,
        INT* pnScores) = 0;

    virtual HRESULT STDMETHODCALLTYPE DetectInputCodepage(
        DWORD dwFlag,
        DWORD dwPrefWinCodePage,
        CHAR* pSrcStr,
        INT* pcSrcSize,
        DetectEncodingInfo* lpEncoding,
        INT* pnScores) = 0;

    virtual HRESULT STDMETHODCALLTYPE ValidateCodePage(
        UINT uiCodePage,
        HWND hwnd) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCodePageDescription(
        UINT uiCodePage,
        LCID lcid,
        LPWSTR lpWideCharStr,
        int cchWideChar) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsCodePageInstallable(
        UINT uiCodePage) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMimeDBSource(
        MIMECONTF dwSource) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNumberOfScripts(
        UINT* pnScripts) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumScripts(
        DWORD dwFlags,
        LANGID LangId,
        IEnumScript** ppEnumScript) = 0;

    virtual HRESULT STDMETHODCALLTYPE ValidateCodePageEx(
        UINT uiCodePage,
        HWND hwnd,
        DWORD dwfIODControl) = 0;

};
#else
typedef struct IMultiLanguage2Vtbl IMultiLanguage2Vtbl;
struct IMultiLanguage2 {
    const IMultiLanguage2Vtbl* lpVtbl;
};
struct IMultiLanguage2Vtbl {
    ICOM_MSVTABLE_COMPAT_FIELDS

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

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

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

    /*** IMultiLanguage2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetNumberOfCodePageInfo)(
        IMultiLanguage2* This,
        UINT* pcCodePage);

    HRESULT (STDMETHODCALLTYPE *GetCodePageInfo)(
        IMultiLanguage2* This,
        UINT uiCodePage,
        LANGID LangId,
        PMIMECPINFO pCodePageInfo);

    HRESULT (STDMETHODCALLTYPE *GetFamilyCodePage)(
        IMultiLanguage2* This,
        UINT uiCodePage,
        UINT* puiFamilyCodePage);

    HRESULT (STDMETHODCALLTYPE *EnumCodePages)(
        IMultiLanguage2* This,
        DWORD grfFlags,
        LANGID LangId,
        IEnumCodePage** ppEnumCodePage);

    HRESULT (STDMETHODCALLTYPE *GetCharsetInfo)(
        IMultiLanguage2* This,
        BSTR Charset,
        PMIMECSETINFO pCharsetInfo);

    HRESULT (STDMETHODCALLTYPE *IsConvertible)(
        IMultiLanguage2* This,
        DWORD dwSrcEncoding,
        DWORD dwDstEncoding);

    HRESULT (STDMETHODCALLTYPE *ConvertString)(
        IMultiLanguage2* This,
        DWORD* pdwMode,
        DWORD dwSrcEncoding,
        DWORD dwDstEncoding,
        BYTE* pSrcStr,
        UINT* pcSrcSize,
        BYTE* pDstStr,
        UINT* pcDstSize);

    HRESULT (STDMETHODCALLTYPE *ConvertStringToUnicode)(
        IMultiLanguage2* This,
        DWORD* pdwMode,
        DWORD dwEncoding,
        CHAR* pSrcStr,
        UINT* pcSrcSize,
        WCHAR* pDstStr,
        UINT* pcDstSize);

    HRESULT (STDMETHODCALLTYPE *ConvertStringFromUnicode)(
        IMultiLanguage2* This,
        DWORD* pdwMode,
        DWORD dwEncoding,
        WCHAR* pSrcStr,
        UINT* pcSrcSize,
        CHAR* pDstStr,
        UINT* pcDstSize);

    HRESULT (STDMETHODCALLTYPE *ConvertStringReset)(
        IMultiLanguage2* This);

    HRESULT (STDMETHODCALLTYPE *GetRfc1766FromLcid)(
        IMultiLanguage2* This,
        LCID Locale,
        BSTR* pbstrRfc1766);

    HRESULT (STDMETHODCALLTYPE *GetLcidFromRfc1766)(
        IMultiLanguage2* This,
        LCID* pLocale,
        BSTR bstrRfc1766);

    HRESULT (STDMETHODCALLTYPE *EnumRfc1766)(
        IMultiLanguage2* This,
        LANGID LangId,
        IEnumRfc1766** ppEnumRfc1766);

    HRESULT (STDMETHODCALLTYPE *GetRfc1766Info)(
        IMultiLanguage2* This,
        LCID Locale,
        LANGID LangId,
        PRFC1766INFO pRfc1766Info);

    HRESULT (STDMETHODCALLTYPE *CreateConvertCharset)(
        IMultiLanguage2* This,
        UINT uiSrcCodePage,
        UINT uiDstCodePage,
        DWORD dwProperty,
        IMLangConvertCharset** ppMLangConvertCharset);

    HRESULT (STDMETHODCALLTYPE *ConvertStringInIStream)(
        IMultiLanguage2* This,
        DWORD* pdwMode,
        DWORD dwFlag,
        WCHAR* lpFallBack,
        DWORD dwSrcEncoding,
        DWORD dwDstEncoding,
        IStream* pstmIn,
        IStream* pstmOut);

    HRESULT (STDMETHODCALLTYPE *ConvertStringToUnicodeEx)(
        IMultiLanguage2* This,
        DWORD* pdwMode,
        DWORD dwEncoding,
        CHAR* pSrcStr,
        UINT* pcSrcSize,
        WCHAR* pDstStr,
        UINT* pcDstSize,
        DWORD dwFlag,
        WCHAR* lpFallBack);

    HRESULT (STDMETHODCALLTYPE *ConvertStringFromUnicodeEx)(
        IMultiLanguage2* This,
        DWORD* pdwMode,
        DWORD dwEncoding,
        WCHAR* pSrcStr,
        UINT* pcSrcSize,
        CHAR* pDstStr,
        UINT* pcDstSize,
        DWORD dwFlag,
        WCHAR* lpFallBack);

    HRESULT (STDMETHODCALLTYPE *DetectCodepageInIStream)(
        IMultiLanguage2* This,
        DWORD dwFlag,
        DWORD dwPrefWinCodePage,
        IStream* pstmIn,
        DetectEncodingInfo* lpEncoding,
        INT* pnScores);

    HRESULT (STDMETHODCALLTYPE *DetectInputCodepage)(
        IMultiLanguage2* This,
        DWORD dwFlag,
        DWORD dwPrefWinCodePage,
        CHAR* pSrcStr,
        INT* pcSrcSize,
        DetectEncodingInfo* lpEncoding,
        INT* pnScores);

    HRESULT (STDMETHODCALLTYPE *ValidateCodePage)(
        IMultiLanguage2* This,
        UINT uiCodePage,
        HWND hwnd);

    HRESULT (STDMETHODCALLTYPE *GetCodePageDescription)(
        IMultiLanguage2* This,
        UINT uiCodePage,
        LCID lcid,
        LPWSTR lpWideCharStr,
        int cchWideChar);

    HRESULT (STDMETHODCALLTYPE *IsCodePageInstallable)(
        IMultiLanguage2* This,
        UINT uiCodePage);

    HRESULT (STDMETHODCALLTYPE *SetMimeDBSource)(
        IMultiLanguage2* This,
        MIMECONTF dwSource);

    HRESULT (STDMETHODCALLTYPE *GetNumberOfScripts)(
        IMultiLanguage2* This,
        UINT* pnScripts);

    HRESULT (STDMETHODCALLTYPE *EnumScripts)(
        IMultiLanguage2* This,
        DWORD dwFlags,
        LANGID LangId,
        IEnumScript** ppEnumScript);

    HRESULT (STDMETHODCALLTYPE *ValidateCodePageEx)(
        IMultiLanguage2* This,
        UINT uiCodePage,
        HWND hwnd,
        DWORD dwfIODControl);

};

#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IMultiLanguage2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IMultiLanguage2_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IMultiLanguage2_Release(p) (p)->lpVtbl->Release(p)
/*** IMultiLanguage2 methods ***/
#define IMultiLanguage2_GetNumberOfCodePageInfo(p,a) (p)->lpVtbl->GetNumberOfCodePageInfo(p,a)
#define IMultiLanguage2_GetCodePageInfo(p,a,b,c) (p)->lpVtbl->GetCodePageInfo(p,a,b,c)
#define IMultiLanguage2_GetFamilyCodePage(p,a,b) (p)->lpVtbl->GetFamilyCodePage(p,a,b)
#define IMultiLanguage2_EnumCodePages(p,a,b,c) (p)->lpVtbl->EnumCodePages(p,a,b,c)
#define IMultiLanguage2_GetCharsetInfo(p,a,b) (p)->lpVtbl->GetCharsetInfo(p,a,b)
#define IMultiLanguage2_IsConvertible(p,a,b) (p)->lpVtbl->IsConvertible(p,a,b)
#define IMultiLanguage2_ConvertString(p,a,b,c,d,e,f,g) (p)->lpVtbl->ConvertString(p,a,b,c,d,e,f,g)
#define IMultiLanguage2_ConvertStringToUnicode(p,a,b,c,d,e,f) (p)->lpVtbl->ConvertStringToUnicode(p,a,b,c,d,e,f)
#define IMultiLanguage2_ConvertStringFromUnicode(p,a,b,c,d,e,f) (p)->lpVtbl->ConvertStringFromUnicode(p,a,b,c,d,e,f)
#define IMultiLanguage2_ConvertStringReset(p) (p)->lpVtbl->ConvertStringReset(p)
#define IMultiLanguage2_GetRfc1766FromLcid(p,a,b) (p)->lpVtbl->GetRfc1766FromLcid(p,a,b)
#define IMultiLanguage2_GetLcidFromRfc1766(p,a,b) (p)->lpVtbl->GetLcidFromRfc1766(p,a,b)
#define IMultiLanguage2_EnumRfc1766(p,a,b) (p)->lpVtbl->EnumRfc1766(p,a,b)
#define IMultiLanguage2_GetRfc1766Info(p,a,b,c) (p)->lpVtbl->GetRfc1766Info(p,a,b,c)
#define IMultiLanguage2_CreateConvertCharset(p,a,b,c,d) (p)->lpVtbl->CreateConvertCharset(p,a,b,c,d)
#define IMultiLanguage2_ConvertStringInIStream(p,a,b,c,d,e,f,g) (p)->lpVtbl->ConvertStringInIStream(p,a,b,c,d,e,f,g)
#define IMultiLanguage2_ConvertStringToUnicodeEx(p,a,b,c,d,e,f,g,h) (p)->lpVtbl->ConvertStringToUnicodeEx(p,a,b,c,d,e,f,g,h)
#define IMultiLanguage2_ConvertStringFromUnicodeEx(p,a,b,c,d,e,f,g,h) (p)->lpVtbl->ConvertStringFromUnicodeEx(p,a,b,c,d,e,f,g,h)
#define IMultiLanguage2_DetectCodepageInIStream(p,a,b,c,d,e) (p)->lpVtbl->DetectCodepageInIStream(p,a,b,c,d,e)
#define IMultiLanguage2_DetectInputCodepage(p,a,b,c,d,e,f) (p)->lpVtbl->DetectInputCodepage(p,a,b,c,d,e,f)
#define IMultiLanguage2_ValidateCodePage(p,a,b) (p)->lpVtbl->ValidateCodePage(p,a,b)
#define IMultiLanguage2_GetCodePageDescription(p,a,b,c,d) (p)->lpVtbl->GetCodePageDescription(p,a,b,c,d)
#define IMultiLanguage2_IsCodePageInstallable(p,a) (p)->lpVtbl->IsCodePageInstallable(p,a)
#define IMultiLanguage2_SetMimeDBSource(p,a) (p)->lpVtbl->SetMimeDBSource(p,a)
#define IMultiLanguage2_GetNumberOfScripts(p,a) (p)->lpVtbl->GetNumberOfScripts(p,a)
#define IMultiLanguage2_EnumScripts(p,a,b,c) (p)->lpVtbl->EnumScripts(p,a,b,c)
#define IMultiLanguage2_ValidateCodePageEx(p,a,b,c) (p)->lpVtbl->ValidateCodePageEx(p,a,b,c)
#endif

#endif

#define IMultiLanguage2_METHODS \
    ICOM_MSVTABLE_COMPAT_FIELDS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IMultiLanguage2 methods ***/ \
    STDMETHOD_(HRESULT,GetNumberOfCodePageInfo)(THIS_ UINT* pcCodePage) PURE; \
    STDMETHOD_(HRESULT,GetCodePageInfo)(THIS_ UINT uiCodePage, LANGID LangId, PMIMECPINFO pCodePageInfo) PURE; \
    STDMETHOD_(HRESULT,GetFamilyCodePage)(THIS_ UINT uiCodePage, UINT* puiFamilyCodePage) PURE; \
    STDMETHOD_(HRESULT,EnumCodePages)(THIS_ DWORD grfFlags, LANGID LangId, IEnumCodePage** ppEnumCodePage) PURE; \
    STDMETHOD_(HRESULT,GetCharsetInfo)(THIS_ BSTR Charset, PMIMECSETINFO pCharsetInfo) PURE; \
    STDMETHOD_(HRESULT,IsConvertible)(THIS_ DWORD dwSrcEncoding, DWORD dwDstEncoding) PURE; \
    STDMETHOD_(HRESULT,ConvertString)(THIS_ DWORD* pdwMode, DWORD dwSrcEncoding, DWORD dwDstEncoding, BYTE* pSrcStr, UINT* pcSrcSize, BYTE* pDstStr, UINT* pcDstSize) PURE; \
    STDMETHOD_(HRESULT,ConvertStringToUnicode)(THIS_ DWORD* pdwMode, DWORD dwEncoding, CHAR* pSrcStr, UINT* pcSrcSize, WCHAR* pDstStr, UINT* pcDstSize) PURE; \
    STDMETHOD_(HRESULT,ConvertStringFromUnicode)(THIS_ DWORD* pdwMode, DWORD dwEncoding, WCHAR* pSrcStr, UINT* pcSrcSize, CHAR* pDstStr, UINT* pcDstSize) PURE; \
    STDMETHOD_(HRESULT,ConvertStringReset)(THIS) PURE; \
    STDMETHOD_(HRESULT,GetRfc1766FromLcid)(THIS_ LCID Locale, BSTR* pbstrRfc1766) PURE; \
    STDMETHOD_(HRESULT,GetLcidFromRfc1766)(THIS_ LCID* pLocale, BSTR bstrRfc1766) PURE; \
    STDMETHOD_(HRESULT,EnumRfc1766)(THIS_ LANGID LangId, IEnumRfc1766** ppEnumRfc1766) PURE; \
    STDMETHOD_(HRESULT,GetRfc1766Info)(THIS_ LCID Locale, LANGID LangId, PRFC1766INFO pRfc1766Info) PURE; \
    STDMETHOD_(HRESULT,CreateConvertCharset)(THIS_ UINT uiSrcCodePage, UINT uiDstCodePage, DWORD dwProperty, IMLangConvertCharset** ppMLangConvertCharset) PURE; \
    STDMETHOD_(HRESULT,ConvertStringInIStream)(THIS_ DWORD* pdwMode, DWORD dwFlag, WCHAR* lpFallBack, DWORD dwSrcEncoding, DWORD dwDstEncoding, IStream* pstmIn, IStream* pstmOut) PURE; \
    STDMETHOD_(HRESULT,ConvertStringToUnicodeEx)(THIS_ DWORD* pdwMode, DWORD dwEncoding, CHAR* pSrcStr, UINT* pcSrcSize, WCHAR* pDstStr, UINT* pcDstSize, DWORD dwFlag, WCHAR* lpFallBack) PURE; \
    STDMETHOD_(HRESULT,ConvertStringFromUnicodeEx)(THIS_ DWORD* pdwMode, DWORD dwEncoding, WCHAR* pSrcStr, UINT* pcSrcSize, CHAR* pDstStr, UINT* pcDstSize, DWORD dwFlag, WCHAR* lpFallBack) PURE; \
    STDMETHOD_(HRESULT,DetectCodepageInIStream)(THIS_ DWORD dwFlag, DWORD dwPrefWinCodePage, IStream* pstmIn, DetectEncodingInfo* lpEncoding, INT* pnScores) PURE; \
    STDMETHOD_(HRESULT,DetectInputCodepage)(THIS_ DWORD dwFlag, DWORD dwPrefWinCodePage, CHAR* pSrcStr, INT* pcSrcSize, DetectEncodingInfo* lpEncoding, INT* pnScores) PURE; \
    STDMETHOD_(HRESULT,ValidateCodePage)(THIS_ UINT uiCodePage, HWND hwnd) PURE; \
    STDMETHOD_(HRESULT,GetCodePageDescription)(THIS_ UINT uiCodePage, LCID lcid, LPWSTR lpWideCharStr, int cchWideChar) PURE; \
    STDMETHOD_(HRESULT,IsCodePageInstallable)(THIS_ UINT uiCodePage) PURE; \
    STDMETHOD_(HRESULT,SetMimeDBSource)(THIS_ MIMECONTF dwSource) PURE; \
    STDMETHOD_(HRESULT,GetNumberOfScripts)(THIS_ UINT* pnScripts) PURE; \
    STDMETHOD_(HRESULT,EnumScripts)(THIS_ DWORD dwFlags, LANGID LangId, IEnumScript** ppEnumScript) PURE; \
    STDMETHOD_(HRESULT,ValidateCodePageEx)(THIS_ UINT uiCodePage, HWND hwnd, DWORD dwfIODControl) PURE;

HRESULT CALLBACK IMultiLanguage2_GetNumberOfCodePageInfo_Proxy(
    IMultiLanguage2* This,
    UINT* pcCodePage);
void __RPC_STUB IMultiLanguage2_GetNumberOfCodePageInfo_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_GetCodePageInfo_Proxy(
    IMultiLanguage2* This,
    UINT uiCodePage,
    LANGID LangId,
    PMIMECPINFO pCodePageInfo);
void __RPC_STUB IMultiLanguage2_GetCodePageInfo_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_GetFamilyCodePage_Proxy(
    IMultiLanguage2* This,
    UINT uiCodePage,
    UINT* puiFamilyCodePage);
void __RPC_STUB IMultiLanguage2_GetFamilyCodePage_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_EnumCodePages_Proxy(
    IMultiLanguage2* This,
    DWORD grfFlags,
    LANGID LangId,
    IEnumCodePage** ppEnumCodePage);
void __RPC_STUB IMultiLanguage2_EnumCodePages_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_GetCharsetInfo_Proxy(
    IMultiLanguage2* This,
    BSTR Charset,
    PMIMECSETINFO pCharsetInfo);
void __RPC_STUB IMultiLanguage2_GetCharsetInfo_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_IsConvertible_Proxy(
    IMultiLanguage2* This,
    DWORD dwSrcEncoding,
    DWORD dwDstEncoding);
void __RPC_STUB IMultiLanguage2_IsConvertible_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_ConvertString_Proxy(
    IMultiLanguage2* This,
    DWORD* pdwMode,
    DWORD dwSrcEncoding,
    DWORD dwDstEncoding,
    BYTE* pSrcStr,
    UINT* pcSrcSize,
    BYTE* pDstStr,
    UINT* pcDstSize);
void __RPC_STUB IMultiLanguage2_ConvertString_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_ConvertStringToUnicode_Proxy(
    IMultiLanguage2* This,
    DWORD* pdwMode,
    DWORD dwEncoding,
    CHAR* pSrcStr,
    UINT* pcSrcSize,
    WCHAR* pDstStr,
    UINT* pcDstSize);
void __RPC_STUB IMultiLanguage2_ConvertStringToUnicode_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_ConvertStringFromUnicode_Proxy(
    IMultiLanguage2* This,
    DWORD* pdwMode,
    DWORD dwEncoding,
    WCHAR* pSrcStr,
    UINT* pcSrcSize,
    CHAR* pDstStr,
    UINT* pcDstSize);
void __RPC_STUB IMultiLanguage2_ConvertStringFromUnicode_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_ConvertStringReset_Proxy(
    IMultiLanguage2* This);
void __RPC_STUB IMultiLanguage2_ConvertStringReset_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_GetRfc1766FromLcid_Proxy(
    IMultiLanguage2* This,
    LCID Locale,
    BSTR* pbstrRfc1766);
void __RPC_STUB IMultiLanguage2_GetRfc1766FromLcid_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_GetLcidFromRfc1766_Proxy(
    IMultiLanguage2* This,
    LCID* pLocale,
    BSTR bstrRfc1766);
void __RPC_STUB IMultiLanguage2_GetLcidFromRfc1766_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_EnumRfc1766_Proxy(
    IMultiLanguage2* This,
    LANGID LangId,
    IEnumRfc1766** ppEnumRfc1766);
void __RPC_STUB IMultiLanguage2_EnumRfc1766_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_GetRfc1766Info_Proxy(
    IMultiLanguage2* This,
    LCID Locale,
    LANGID LangId,
    PRFC1766INFO pRfc1766Info);
void __RPC_STUB IMultiLanguage2_GetRfc1766Info_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_CreateConvertCharset_Proxy(
    IMultiLanguage2* This,
    UINT uiSrcCodePage,
    UINT uiDstCodePage,
    DWORD dwProperty,
    IMLangConvertCharset** ppMLangConvertCharset);
void __RPC_STUB IMultiLanguage2_CreateConvertCharset_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_ConvertStringInIStream_Proxy(
    IMultiLanguage2* This,
    DWORD* pdwMode,
    DWORD dwFlag,
    WCHAR* lpFallBack,
    DWORD dwSrcEncoding,
    DWORD dwDstEncoding,
    IStream* pstmIn,
    IStream* pstmOut);
void __RPC_STUB IMultiLanguage2_ConvertStringInIStream_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_ConvertStringToUnicodeEx_Proxy(
    IMultiLanguage2* This,
    DWORD* pdwMode,
    DWORD dwEncoding,
    CHAR* pSrcStr,
    UINT* pcSrcSize,
    WCHAR* pDstStr,
    UINT* pcDstSize,
    DWORD dwFlag,
    WCHAR* lpFallBack);
void __RPC_STUB IMultiLanguage2_ConvertStringToUnicodeEx_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_ConvertStringFromUnicodeEx_Proxy(
    IMultiLanguage2* This,
    DWORD* pdwMode,
    DWORD dwEncoding,
    WCHAR* pSrcStr,
    UINT* pcSrcSize,
    CHAR* pDstStr,
    UINT* pcDstSize,
    DWORD dwFlag,
    WCHAR* lpFallBack);
void __RPC_STUB IMultiLanguage2_ConvertStringFromUnicodeEx_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_DetectCodepageInIStream_Proxy(
    IMultiLanguage2* This,
    DWORD dwFlag,
    DWORD dwPrefWinCodePage,
    IStream* pstmIn,
    DetectEncodingInfo* lpEncoding,
    INT* pnScores);
void __RPC_STUB IMultiLanguage2_DetectCodepageInIStream_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_DetectInputCodepage_Proxy(
    IMultiLanguage2* This,
    DWORD dwFlag,
    DWORD dwPrefWinCodePage,
    CHAR* pSrcStr,
    INT* pcSrcSize,
    DetectEncodingInfo* lpEncoding,
    INT* pnScores);
void __RPC_STUB IMultiLanguage2_DetectInputCodepage_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_ValidateCodePage_Proxy(
    IMultiLanguage2* This,
    UINT uiCodePage,
    HWND hwnd);
void __RPC_STUB IMultiLanguage2_ValidateCodePage_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_GetCodePageDescription_Proxy(
    IMultiLanguage2* This,
    UINT uiCodePage,
    LCID lcid,
    LPWSTR lpWideCharStr,
    int cchWideChar);
void __RPC_STUB IMultiLanguage2_GetCodePageDescription_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_IsCodePageInstallable_Proxy(
    IMultiLanguage2* This,
    UINT uiCodePage);
void __RPC_STUB IMultiLanguage2_IsCodePageInstallable_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_SetMimeDBSource_Proxy(
    IMultiLanguage2* This,
    MIMECONTF dwSource);
void __RPC_STUB IMultiLanguage2_SetMimeDBSource_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_GetNumberOfScripts_Proxy(
    IMultiLanguage2* This,
    UINT* pnScripts);
void __RPC_STUB IMultiLanguage2_GetNumberOfScripts_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_EnumScripts_Proxy(
    IMultiLanguage2* This,
    DWORD dwFlags,
    LANGID LangId,
    IEnumScript** ppEnumScript);
void __RPC_STUB IMultiLanguage2_EnumScripts_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMultiLanguage2_ValidateCodePageEx_Proxy(
    IMultiLanguage2* This,
    UINT uiCodePage,
    HWND hwnd,
    DWORD dwfIODControl);
void __RPC_STUB IMultiLanguage2_ValidateCodePageEx_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IMultiLanguage2_INTERFACE_DEFINED__ */

STDAPI LcidToRfc1766A(LCID, LPSTR, INT);
STDAPI LcidToRfc1766W(LCID, LPWSTR, INT);
#define LcidToRfc1766 WINELIB_NAME_AW(LcidToRfc1766)
STDAPI Rfc1766ToLcidA(LCID *, LPCSTR);
STDAPI Rfc1766ToLcidW(LCID *, LPCWSTR);
#define Rfc1766ToLcid WINELIB_NAME_AW(Rfc1766ToLcid)
STDAPI IsConvertINetStringAvailable(DWORD, DWORD);
STDAPI ConvertINetString(LPDWORD, DWORD, DWORD, LPCSTR, LPINT, LPSTR, LPINT);
STDAPI ConvertINetMultiByteToUnicode(LPDWORD, DWORD, LPCSTR, LPINT, LPWSTR, LPINT);
STDAPI ConvertINetUnicodeToMultiByte(LPDWORD, DWORD, LPCWSTR, LPINT, LPSTR, LPINT);
DEFINE_GUID(CLSID_CMultiLanguage, 0x275c23e2, 0x3747, 0x11d0, 0x9f,0xea,0x00,0xaa,0x00,0x3f,0x86,0x46);
DEFINE_GUID(IID_IMLangCodePages, 0x359F3443,0xBD4A,0x11D0,0xB1,0x88,0x00,0xAA,0x00,0x38,0xC9,0x69);
DEFINE_GUID(IID_IMLangFontLink, 0x359F3441,0xBD4A,0x11D0,0xB1,0x88,0x00,0xAA,0x00,0x38,0xC9,0x69);
DEFINE_GUID(IID_IMultiLanguage2, 0xDCCFC164,0x2B38,0x11d2,0xB7,0xEC,0x00,0xC0,0x4F,0x8F,0x5D,0x9A);
DEFINE_GUID(IID_IMultiLanguage, 0x275c23e1,0x3747,0x11d0,0x9f,0xea,0x00,0xaa,0x00,0x3f,0x86,0x46);
DEFINE_GUID(IID_IEnumCodePage, 0x275c23e3,0x3747,0x11d0,0x9f,0xea,0x00,0xaa,0x00,0x3f,0x86,0x46);
DEFINE_GUID(IID_IEnumScript, 0xae5f1430,0x388b,0x11d2,0x83,0x80,0x00,0xc0,0x4f,0x8f,0x5d,0xa1);
#ifdef __cplusplus
}
#endif
#endif /* __WIDL_MLANG_H */
