/*** 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);

};

/*** 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

#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);

};

/*** 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

#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)

typedef BYTE SCRIPT_ID;

typedef struct tagSCRIPTINFO {
    SCRIPT_ID ScriptId;
    UINT uiCodePage;
    WCHAR wszDescription[48];
    WCHAR wszFixedWidthFont[1];
    WCHAR wszProportionalFont[1];
} 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);

};

/*** 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

#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)

#define MAX_MIMEFACE_NAME (32)

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);

};

/*** 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

#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);

};

/*** 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

#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);

};

/*** 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

#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);

};

/*** 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

#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 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 *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);

};

/*** 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_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

#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,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_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__ */

#ifdef __cplusplus
}
#endif
#endif /* __WIDL_MLANG_H */
